所以我发现Haskell中的内置splitAt函数可以定义如下:
splitAt :: Int -> [a] -> ([a], [a])
-- Pre: n >= 0
splitAt n []
= ([], [])
splitAt n (x : xs)
= if n == 0
then ([], x : xs)
else (x : xs', xs'')
where
(xs', xs'') = splitAt (n - 1) xs
我在这里不明白/无法理解的是那里的部分。
举个例子,
splitAt 2 "Haskell"
应该返回(["Ha"],["skell"])
,但我真的不明白它如何将(x:xs',xs'')
定义为另一个函数?这在视觉上会是什么样的?
以示例:
splitAt 2 "Haskell"
= (('H':xs',xs''))
^所以这就是splitAt 1 "askell"
,但是我对上面元组中xs',xs''
发生的事情感到很困惑......
感谢。
答案 0 :(得分:3)
(xs', xs'') = splitAt (n - 1) xs
这会得到splitAt (n - 1) xs
的结果,这是一对,并将名称xs'
指定给该对的第一个元素(即n - 1
的第一个xs
元素})和xs''
到第二个元素(即其余元素)。
(x:xs', xs'')
这会产生一对。该对的第一个元素是一个列表,它是将x
添加到xs'
(即n-1
的第一个xs
元素)的结果。第二个元素是xs''
(即xs
)的剩余元素。