在Haskell中理解splitAt的问题?

时间:2015-11-11 22:51:44

标签: haskell

所以我发现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''发生的事情感到很困惑......

感谢。

1 个答案:

答案 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)的剩余元素。