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
答案 0 :(得分:6)
在Haskell中,隐形函数应用程序运算符与左侧相关联,因此isPalindrome init xs
被解释为(isPalindrome init) xs
。它是这样做的,因为它允许我们使用currying来处理具有多个参数的函数。
要将init xs
作为一个参数传递,您只需使用括号:
isPalindrome (init xs)