I am trying to find the list with the smallest sum of elements.:
shortest :: (Num a) => [[a]] -> [a]
shortest [] = []
shortest (x:xs) = if sum x < sum (shortest xs) then x else shortest xs
That gives me the following error:
Could not deduce (Ord a) arising from a use of `<' from the context (Eq a) bound by the type signature for shortest :: Eq a => [[a]] -> [a] at code.hs:(8,1)-(9,71) Possible fix: add (Ord a) to the context of the type signature for shortest :: Eq a => [[a]] -> [a] In the expression: sum x < sum (shortest xs) In the expression: if sum x < sum (shortest xs) then x else shortest xs In an equation for `shortest': shortest (x : xs) = if sum x < sum (shortest xs) then x else shortest xs
Why doesn't the function typecheck?
There are two type classes involved in this code: Num
and Ord
. Note
that a type can be a member Num
and not Ord
, and vice versa.
The type of sum
is Num a => [a] -> a
so the input elements to shortest
needs to be a member of Num
. You also do the following
in your code:
sum x < sum (shortest xs)
This means that you are using the operator <
on a
s, but in your type signature you have not required that the a
s be an instance of Ord
which defines <
:
class Eq a => Ord a where
compare :: a -> a -> Ordering
(<) :: a -> a -> Bool
...
Therefore you need to add that requirement to your type signature:
shortest :: (Ord a, Num a) => [[a]] -> [a]
Or you could leave out the type signature.
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