I'm trying to write a function in Haskell and I'm trying to start the function with two lets followed by the answer.
split :: (a -> b) -> (a -> c) -> a -> (b, c)
split x y z =
let first = ( x (y))
let last = ( y (Z))
(first, last)
I'm getting a "parse error on input 'let'" starting on the 2nd let statement. Why is this, and how can I fix this?
CodePudding user response:
split :: (a -> b) -> (a -> c) -> a -> (b, c)
This says your first argument is a function from some type a to some type b and your second argument is a function from some type a to some type c.
split x y z =
So x :: a -> b and y :: a -> c.
let first = ( x (y))
That means you are trying to apply the function x to y but this won't work because x expects an argument of type a and y is of type a -> c. This is wrong.
let last = ( y (Z))
There is no Z, check your capitalizations.
(first, last)
Syntactically, you need an in. The syntax is:
let var1 = expr1
var2 = expr2
in expr3WithVars1And2InScope
A small exception: When using do blocks you don't use in because that is implicitly the remainder of the do block.
CodePudding user response:
There is no need here to work with a let, you can just make an expression with a simple 2-tuple:
split :: (a -> b) -> (a -> c) -> a -> (b, c)
split x y z = (x z, y z)
or you can simplify this to:
split :: (a -> b) -> (a -> c) -> a -> (b, c)
split x y = (,) <$> x <*> y
or even simpler:
import Control.Applicative(liftA2)
split :: (a -> b) -> (a -> c) -> a -> (b, c)
split = liftA2 (,)
