>>> fromMaybe "" (Just "Hello, World!") "Hello, World!"
>>> fromMaybe "" Nothing ""Read an integer from a string using readMaybe. If we fail to parse an integer, we want to return 0 by default:
>>> import Text.Read ( readMaybe ) >>> fromMaybe 0 (readMaybe "5") 5 >>> fromMaybe 0 (readMaybe "") 0
do as pure bwith an inferred Functor constraint.
>>> Nothing $> "foo" Nothing >>> Just 90210 $> "foo" Just "foo"Replace the contents of an Either Int Int with a constant String, resulting in an Either Int String:
>>> Left 8675309 $> "foo" Left 8675309 >>> Right 8675309 $> "foo" Right "foo"Replace each element of a list with a constant String:
>>> [1,2,3] $> "foo" ["foo","foo","foo"]Replace the second element of a pair with a constant String:
>>> (1,2) $> "foo" (1,"foo")
copy mv v = ... write mv i (v ! i) ...For lazy vectors, v ! i would not be evaluated which means that mv would unnecessarily retain a reference to v in each element written. With indexM, copying can be implemented like this instead:
copy mv v = ... do x <- indexM v i write mv i xHere, no references to v are retained because indexing (but not the elements) is evaluated eagerly.
unsafeIndex :: v a -> Int -> ainstead. Now, if we wanted to copy a vector, we'd do something like
copy mv v ... = ... unsafeWrite mv i (unsafeIndex v i) ...For lazy vectors, the indexing would not be evaluated which means that we would retain a reference to the original vector in each element we write. This is not what we want! With basicUnsafeIndexM, we can do
copy mv v ... = ... case basicUnsafeIndexM v i of Box x -> unsafeWrite mv i x ...which does not have this problem because indexing (but not the returned element!) is evaluated immediately.