与预期和实际论点的冲突

时间:2016-03-07 10:52:00

标签: haskell

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)))

为什么它不起作用?我不明白。请帮帮忙。 错误是可以理解的,但我不知道他们的原因。

1 个答案:

答案 0 :(得分:3)

您是否尝试使用lambda和额外的括号((\e new_list -> ...)(x new_list))强制进行函数调用?如果是这样,那对一个不起作用,即使该语法有效,那么你的括号也会不匹配。

放弃'尝试过的函数调用'和lambda,直接在x中使用new_listnub',或者如果你真的想重命名,请使用let e = x in来绑定e。这应该可以解决类型错误。

如果你真的想要lambda,那么你应该知道函数应用程序是使用空格而不是括号完成的,所以就像(\x -> x + 1) 3一样。