[英]Haskell: Couldn't match expected type '[a0]' with actual type '([char], [int])'
[英]Haskell Programming Assignment, “Couldn't match expected type ‘Int’ with actual type ‘[a0] -> Int’ ”and a few more Errors
我有以下分配:具有一个值和一个列表的函数numOccurences,返回该值出现在列表中的次数。 我正在学习haskell并感到沮丧,这是我的代码:
numOccurences:: b -> [a] -> Int
numOccurences n [ls]
|([ls] !! n==True) = (numOccurences(n (tail [ls])))+1
|otherwise = 0
我收到的错误如下: https : //imgur.com/a/0lTBn
一些提示:
首先,在类型签名中,使用不同的类型变量(即b
和a
)可能会导致您在另一种类型的列表中查找某一种类型的值的出现,在这种情况下,这不是您想要的。 因此,您只想使用一个而不是两个类型变量。
其次,无论列表的具体类型是什么,无论是[Char]
, [Int]
等,它都必须是相等的(即,需要派生Eq
类型类),因此使用类约束是有意义的(Eq a) =>
在您的类型签名中。
第三,由于我们遍历一个列表,因此我们使用模式匹配来安全地断开该列表的第一个元素以进行比较,并且我们还添加了一个基本案例(即我们对空列表的处理),因为我们正在使用递归,并且只要列表中有元素,我们就只希望递归模式匹配。
最后,请尝试避免使用索引编制(即!!
),在这种情况下可以避免索引编制,而应使用模式匹配,因为这样做更安全,更容易推理。
根据上述指针,这是修改后的函数的外观:
numOccurences :: (Eq a) => a -> [a] -> Int
numOccurences _ [] = 0
numOccurences n (x:xs)
| n == x = 1 + numOccurences n xs
| otherwise = numOccurences n xs
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.