We've just started learning Haskell at uni, and in one of my homework problems, we have to define a function for this type signature:
f1 :: Integral a => a
To be honest, I'm still trying to understand a bunch of basics about Haskell, but I know that with Integral, you can do mod and div, plus the ones you can do with Num, , - and *.
So I could write
f1 :: Integral a=> a -> a
f1 k = k `mod` k
And it would work. But with
f1 :: Integral a => a
There seems to be no output.
How can I write something with this that doesn't give an error when interpreted?
CodePudding user response:
You're right that Integral doesn't have anything of that shape. But Integral is also a lot of other things, and if we trace the hierarchy up, we see that every Integral is a Num, and every Num has
fromInteger :: Num a => Integer -> a
So, for your function, we could write
f1 :: Integral a => a
f1 = fromInteger 0
or
f1 :: Integral a => a
f1 = fromInteger 42
or, frankly, pick your favorite number.
Also, because of Haskell magic, the literal number 42 is actually fromInteger 42 (the literal 42, in Haskell, has type Num a => a. So this function will suffice as well.
f1 :: Integral a => a
f1 = 42
