我在Haskell很新。我想实现split函数,它将列表分为两部分:
split 2 [1,2,3] → ([1,2], [3]) --means the first part has length 2, the second - length x-2
split 2 [1] → ([1], [])
split :: Int -> [a] -> ([a],[a])
split 0 x = ([], x)
split n x = splitH n x []
splitH :: Int -> [a] -> [a] -> ([a], [a])
splitH n (x:xs) begin | n == 0 = (begin, xs)
| otherwise = splitH n-1 xs (x:begin) -- here is the error
main = print(split 2 [1,2,3] )
但是这段代码没有编译。我收到错误
`Couldn't match expected type ‘([a], [a])’
with actual type ‘[a0] -> [a0] -> ([a0], [a0])’
Relevant bindings include
begin :: [a] (bound at jdoodle.hs:6:17)
xs :: [a] (bound at jdoodle.hs:6:13)
x :: a (bound at jdoodle.hs:6:11)
splitH :: Int -> [a] -> [a] -> ([a], [a]) (bound at jdoodle.hs:6:1)
Probable cause: ‘splitH’ is applied to too few arguments
In the first argument of ‘(-)’, namely ‘splitH n’
In the expression: splitH n - 1 xs (x : begin)`
什么可能导致错误?
答案 0 :(得分:3)
在表达式n-1
周围加上括号:
splitH (n-1) xs (x:begin)
查看第7节,"功能应用程序优先于运营商" this article的解释:
所以如果你看到这样的话:
f a b c + g d e
你知道你正在添加两个函数调用的结果,而不是调用一个函数,其中一个参数是两个术语的总和。