于是我发现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
我在这里不明白/无法理解的是 where 部分。
举个例子,
splitAt 2 "Haskell"
应该返回 (["Ha"],["skell"])
,但我真的不明白它在这里是如何工作的将 (x:xs',xs'')
定义为另一个函数?这在视觉上看起来如何?
例子:
splitAt 2 "Haskell"
= (('H':xs',xs''))
^ 所以这会执行 splitAt 1 "askell"
,但我很困惑上面元组中的 xs',xs''
会发生什么...
谢谢。
最佳答案
(xs', xs'') = splitAt (n - 1) xs
这采用 splitAt (n - 1) xs
的结果,这是一对,并将名称 xs'
分配给该对的第一个元素(即xs
的第一个 n - 1
个元素)和 xs''
到第二个元素(即剩余元素)。
(x:xs', xs'')
这会产生一对。该对的第一个元素是一个列表,它是将 x
添加到 xs'
之前的结果(即 n-1
的第一个元素 xs
)。第二个元素是 xs''
(即 xs
的剩余元素)。
关于haskell - 理解 Haskell 中的 splitAt 有问题吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33661358/