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:37] f2b216codesnippets:monads [2025/10/08 00:48] (current) – external edit 127.0.0.1
Line 1: Line 1:
- 
 ~~DISCUSSION~~ ~~DISCUSSION~~
  
Line 5: Line 4:
  
 ===== Example 1a ===== ===== Example 1a =====
 +
 +  * 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 works but it is quite some code
 +
 +  * 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   * 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+  * 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'   * that function handles such results by function 'ifC' and makes the job for a 'Monad' of type 'C'
  
Line 60: 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 67: 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 122: 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 246: 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 254: 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.1685921849.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