haskell - Pattern matching for return values -
i know can use pattern matching function parameters this:
fn :: (integral a) => (a,a) -> (a, a) fn (x,y) = (y,x) but how can match return value? expect this:
g :: (integral a) => -> g z = (x, y) = fn (z, z + 5) x `mod` y this results in syntax error. there way match return values? basically, want split returned tuple 2 variables.
the do used syntactical sugar monads. function not monad.
what can use let-clause, like:
g :: (integral a) => -> g z = let (x,y) = fn (z,(z+5)) in x `mod` y or where-clause:
g :: (integral a) => -> g z = x `mod` y where (x,y) = fn (z,(z+5)) you can define pattern in lambda-expression, like:
g :: (integral a) => -> g z = (\(x,y) -> x `mod` y) $ fn (z,(z+5)) along these lines, can define helper function pattern matching, like:
g :: (integral a) => -> g z = h $ fn (z,(z+5)) h (x,y) = x `mod` y this can useful if there several patterns need handled differently (like nothing , just x maybe a type).
say instance defined function:
foo :: int -> int -> maybe int foo x y | x > y = x | otherwise = nothing than can define bar helper function qux handle output of foo, like:
bar :: int -> int -> int bar x y = qux $ foo x y qux nothing = y qux (just z) = z finally in case of 2-tuples, can decide not use pattern matching, use fst :: (a,b) -> a , snd :: (a,b) -> b, instance:
g :: (integral a) => -> g z = let t = fn (z,(z+5)) in ( fst t) `mod` (snd t) but less elegant since here 1 has start thinking fst , snd do, , furtermore if not optimized, can result in additional computation overhead.
which 1 pick depends of course on context , bit on personal taste. since here pattern one, pick let or where pattern, french say: "les goƻts et les couleurs ne se discutent pas.".
Comments
Post a Comment