belongs :: Eq a => a -> [a] -> [a]
belongs e (h:t) = if ( h == e) then [] else belongs e t
belongs e [] = [e]
nub :: Eq a => [a] -> [a]
nub l = nub' l []
where
nub' [] new_list = new_list
nub' (x:xs) new_list = (nub' xs ((\ e new_list ->
case (belongs e new_list) of
[] -> new_list
(h:t) -> (h:new_list))(x new_list)))
无法将预期类型
[a]
与实际类型[a0] -> [a0]
匹配nub'
调用的返回类型可能的原因:nub'
适用于 参数太少在表达式中:nub' l []
在等式中nub
:nub l = nub' l [] where nub' [] new_list = new_list nub' (x : xs) new_list = (nub' xs ((\ e new_list -> case (belongs e new_list) of { [] -> ... (h : t) -> ... }) (x new_list)))
无法将预期类型
[a0] -> [a0]
与实际类型[a1]
匹配nub'
的第二个参数,即[]
在表达式中:nub' l []
在nub
的等式中:nub l = nub' l [] where nub' [] new_list = new_list nub' (x : xs) new_list = (nub' xs ((\ e new_list -> case (belongs e new_list) of { [] -> ... (h : t) -> ... }) (x new_list)))
为什么它不起作用?我不明白。请帮帮忙。 错误是可以理解的,但我不知道他们的原因。
答案 0 :(得分:3)
您是否尝试使用lambda和额外的括号((\e new_list -> ...)(x new_list))
强制进行函数调用?如果是这样,那对一个不起作用,即使该语法有效,那么你的括号也会不匹配。
放弃'尝试过的函数调用'和lambda,直接在x
中使用new_list
和nub'
,或者如果你真的想重命名,请使用let e = x in
来绑定e
。这应该可以解决类型错误。
如果你真的想要lambda,那么你应该知道函数应用程序是使用空格而不是括号完成的,所以就像(\x -> x + 1) 3
一样。