Init错误地把它当作一个论点

时间:2014-02-14 08:22:28

标签: haskell

isPalindrome :: Eq a => [a] -> Bool
isPalindrome [] = True
isPalindrome [a] = True
isPalindrome (x:xs) = (x == last xs)  && (isPalindrome init xs)

给我回报

Couldn't match expected type `[a0]' with actual type `[a1] -> [a1]'
In the first argument of `isPalindrome', namely `init'
In the second argument of `(&&)', namely `(isPalindrome init xs)'
In the expression: (x == last xs) && (isPalindrome init xs)

我不明白为什么Haskell认为isPalindrome的参数是init而它是init xs

1 个答案:

答案 0 :(得分:6)

在Haskell中,隐形函数应用程序运算符与左侧相关联,因此isPalindrome init xs被解释为(isPalindrome init) xs。它是这样做的,因为它允许我们使用currying来处理具有多个参数的函数。

要将init xs作为一个参数传递,您只需使用括号:

isPalindrome (init xs)