我正在尝试找到元素总数最小的列表:
shortest :: (Num a) => [[a]] -> [a]
shortest [] = []
shortest (x:xs) = if sum x < sum (shortest xs) then x else shortest xs
这给了我以下错误:
为什么不进行功能类型检查?
最佳答案
此代码中涉及两个类型类:Num
和Ord
。笔记
一个类型可以是成员Num
而不是Ord
,反之亦然。sum
的类型是Num a => [a] -> a
,因此shortest
的输入元素必须是Num
的成员。您还执行以下操作
在您的代码中:
sum x < sum (shortest xs)
这意味着您在
<
上使用运算符a
,但是在类型签名中,您并不需要a
成为Ord
的实例,该实例定义了<
:class Eq a => Ord a where
compare :: a -> a -> Ordering
(<) :: a -> a -> Bool
...
因此,您需要将该要求添加到类型签名中:
shortest :: (Ord a, Num a) => [[a]] -> [a]
或者您可以省略类型签名。
关于haskell - 为什么会出现无法推断(Ord a)错误?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13003150/