I have the following function that sholud return only odd numbers from the List
oddsOnly :: Integral a => [a] -> [a]
oddsOnly [] = []
oddsOnly (x:xs)
|odd x = x : oddsOnly xs
|otherwise = oddsOnly xs
My question is about the aim of using
Integral a =>
Actually it is not posssible to implement such function with such type declaration
oddsOnly :: [a] -> [a]
As far as I know even and odd functions are in standart Prelude library so why simplified daclaration does not work?
Thanks in advance
why simplified daclaration does not work?
Because you can't tell if a string is odd or not. Or if a float is odd or not. In general, it's not possible to tell if a value of any type a
is odd or not because the notion of being odd may not be defined for this type.
It is defined, however, for Integral
types, so you must specify that a
is Integral
.
In terms of Haskell, odd
works on Integral
s only:
Prelude> :t odd
odd :: Integral a => a -> Bool
Thus, you must pass it a value of a type that is Integral
.
The signature of odd
and even
is odd :: Integral a => a -> Bool
and even :: Integral a => a -> Bool
respectively. So these contain an Integral a
type constraint [Haskell-wiki].
A type constraint has nothing to do from where it is defined. It specifies that the function only is defined for a subset of types. Only for types that are members of the Integral
typeclass, you can use the function. Integral types are types like that specify a subset of ℤ, so Int
, Int64
, Word8
, Integer
, … Types. odd
and even
do not make much sense over Float
s, String
s, Char
s, etc. What would that mean?
By thus specifying the Integral a =>
type constraint, you specify that this function can only work with integer-like items.
Note that you can use filter :: (a -> Bool) -> [a] -> [a]
here to retain only odd numbers:
oddsOnly :: Integral a => [a] -> [a]
oddsOnly = filter odd
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With