我正在尝试找到元素总数最小的列表:

shortest :: (Num a) => [[a]] -> [a]
shortest [] = []
shortest (x:xs) = if sum x < sum (shortest xs) then x else shortest xs

这给了我以下错误:



为什么不进行功能类型检查?

最佳答案

此代码中涉及两个类型类:NumOrd。笔记
一个类型可以是成员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/

10-12 17:31