User Tools

Site Tools


codesnippets:monads

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
codesnippets:monads [2023/06/05 01:30] f2b216codesnippets:monads [2025/10/08 00:48] (current) – external edit 127.0.0.1
Line 1: Line 1:
 ~~DISCUSSION~~ ~~DISCUSSION~~
 +
 ====== Monads ====== ====== Monads ======
  
 ===== Example 1a ===== ===== Example 1a =====
  
-  * this example does not show explain monads but an alternative solution where monads usually apply +  * this example shows how alternative results (sum type, algebraic type, see type A, B and C in the example) can be handled and propagated in a computation by means of 'case' / 'of' constructions 
-  * it shows how alternative results (sum type, algebraic type, see type A, B and C in the example) can be handled and propagated in a computation by means of a function that handles such alternative results +  * it works but it is quite some code 
-  * that function to handle such states is the function 'ifC'+ 
 +  * Code:<code Haskell> 
 +main :: IO () 
 +main =  
 +    do 
 +        putStrLn $ show (fAListToC [(A 12), (A 7), (A 11), (A 5)] fAToB) 
 +        putStrLn $ show (fAListToC [(A 7), (A 13), (A 11), (A 5)] fAToB) 
 +        putStrLn $ show (fAListToC [(A (-1)), (A 7), (A 11), (A 5)] fAToB) 
 +        putStrLn $ show (fAListToC [(A 7), (A 11), (A 5), (A 13)] fAToB) 
 +  
 +data A a = A a | AError | ANone 
 +    deriving Show 
 +  
 +data B a = B a | BError | BNone 
 +    deriving Show 
 +  
 +data C a = C a | CError | CNone 
 +    deriving Show 
 +  
 +fAToB :: A Int -> B Int 
 +fAToB (A n)  
 +    | n <= 0 = BNone 
 +    | n < 13 = B (23 `div` n) 
 +    | otherwise = BError 
 +fAToB AError = BError 
 +fAToB ANone = BNone 
 +  
 +fAListToC :: [A a] -> (A a -> B a) -> C [a] 
 +fAListToC [] _ = C [] 
 +fAListToC (a@(A _):lrAList) fAToB' =  
 +    do 
 +        case fAToB' a of 
 +            B b ->  
 +                let 
 +                    c = (fAListToC lrAList fAToB'
 +                in 
 +                    case c of 
 +                        C lb -> C (b : lb) 
 +                        CNone -> CNone 
 +                        CError -> CError 
 +            BError -> CError 
 +            BNone -> CNone 
 +fAListToC (AError:_) _ = CError 
 +fAListToC (ANone:_) _ = CNone 
 +</code> 
 + 
 +  * Output:<code Haskell> 
 +C [1,3,2,4] 
 +CError 
 +CNone 
 +CError 
 +</code> 
 + 
 +===== Example 1b ===== 
 + 
 +  * this example does not explain monads but an alternative solution where monads usually apply 
 +  * it shows how alternative results (sum type, algebraic type, see type A, B and C in the example) can be handled and propagated in a computation by means of a function that handles such alternative results 
 +  * that function handles such results by function 'ifC' and makes the job for a 'Monad' of type 'C'
  
   * more detailed description of the program   * more detailed description of the program
Line 14: Line 72:
     * in 'fAListToC' 'BError' propagates to 'CError' and 'BNone' propagates to 'CNone'     * in 'fAListToC' 'BError' propagates to 'CError' and 'BNone' propagates to 'CNone'
  
-  * examples compile warning free with GHC 9.2.7 using -Wall+  * this example compile warning free with GHC 9.2.7 using -Wall
  
   * Code:<code Haskell>   * Code:<code Haskell>
Line 58: Line 116:
 ifC CError _ _ bError = bError ifC CError _ _ bError = bError
 </code> </code>
 +
   * Output:<code Haskell>   * Output:<code Haskell>
 C [1,3,2,4] C [1,3,2,4]
Line 65: Line 124:
 </code> </code>
  
-===== Example 1b =====+===== Example 1c =====
  
   * this example uses the instances for Functor, Applicative and Monad   * this example uses the instances for Functor, Applicative and Monad
Line 120: Line 179:
             BNone -> CNone             BNone -> CNone
 fAListToC (AError:_) _ = CError fAListToC (AError:_) _ = CError
-fAListToC (ANone:_) _ = CNone</code>+fAListToC (ANone:_) _ = CNone 
 +</code> 
   * Output:<code Haskell>   * Output:<code Haskell>
 C [1,3,2,4] C [1,3,2,4]
Line 244: Line 305:
     Empty s       >>= _      = Empty s     Empty s       >>= _      = Empty s
     (Contains x) >>= worker = worker x     (Contains x) >>= worker = worker x
-    return                  = Contains</code>+    return                  = Contains 
 +</code>
  
-Output:<code>+  * Output:<code>
 Contains (Wrapper (Chopsticks {nPieces = 54, nQuality = Polished})) Contains (Wrapper (Chopsticks {nPieces = 54, nQuality = Polished}))
 Contains (StorageBin (Chopsticks {nPieces = 34, nQuality = Polished})) Contains (StorageBin (Chopsticks {nPieces = 34, nQuality = Polished}))
Line 252: Line 314:
 Empty "to short" Empty "to short"
 Empty "to small in diameter" Empty "to small in diameter"
-Empty "no chopsticks at packing"</code>+Empty "no chopsticks at packing" 
 +</code> 
codesnippets/monads.1685921450.txt.gz · Last modified: (external edit)

Except where otherwise noted, content on this wiki is licensed under the following license: CC0 1.0 Universal
CC0 1.0 Universal Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki