我在这一行的应用程序中不断出现类型错误:filter1(k)(y:ys)= if若出现(headof(y:ys))(k)则filter1 k(ys)else filter1 k1(ys)其中k1 = k:y 请帮忙, 提前谢谢
occursIn (x) [] = False
occursIn x (x1:xs) = if (x == x1) then True else occursIn x (xs)
headof [] = error "empty list"
headof (x:xs) = x
filter1 (k) [] = k
filter1 (k) (y:ys) = if occursIn (headof (y:ys))(k) then filter1 k (ys) else filter1 k1 (ys) where k1 = k:y
filter [] = []
filter (x:xs) = if xs == [] then x else filter1 [] (x:xs)
答案 0 :(得分:1)
(:) :: a -> [a] -> [a]
a : b
是列表 a
前面的元素 b
。在where k1 = k:y
中,看起来你有倒退。
在
filter (x:xs) = if xs == [] then x else filter1 [] (x:xs)
then
情况x
应该返回一个列表(因为所有其他情况都返回列表),而是只返回一个元素。也许你的意思是[x]
?
我建议将filter
重命名为其他内容,因为filter
已经是标准库中函数的名称,当您尝试使用它时会出现“模糊出现”错误。
现在可能是开始尝试类型签名的好时机。当我打算写一个函数时,我通常首先编写类型签名,并在编写函数体时查阅它。它有助于解决这些小错误,并且还可以改善编译器为您提供的错误消息。
希望这有帮助!