This is the code (Euclid’s algorithm for GCD). Of course there is Prelude.gcd but as an exercise I am implementing my own.
selfGCD :: Integral f => f -> f -> f
selfGCD a b = if b == 0 then
return a
else
return (selfGCD a (mod a b))
Using ghci, I get the following error:
two.hs:32:25:
Couldn't match type `f' with `m0 f'
`f' is a rigid type variable bound by
the type signature for selfGCD :: Integral f => f -> f -> f
at two.hs:31:1
In the return type of a call of `return'
In the expression: return a
In the expression:
if b == 0 then return a else return (selfGCD a (mod a b))
two.hs:34:25:
Couldn't match type `f' with `m1 f'
`f' is a rigid type variable bound by
the type signature for selfGCD :: Integral f => f -> f -> f
at two.hs:31:1
In the return type of a call of `return'
In the expression: return (selfGCD a (mod a b))
In the expression:
if b == 0 then return a else return (selfGCD a (mod a b))
How can I rectify the problem?
Drop the
returns.In Haskell,
returnis a function of typeand not the
returnoperator you know from imperative languages.Thus with the
returns, the implementation has typecontrary to the type signature.