haskell - 理解 Haskell 中的 splitAt 有问题吗?

标签 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

我在这里不明白/无法理解的是 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/

相关文章:

haskell - 无法编译导入Foreign.R的模块

haskell - State 的仿函数实例

haskell - 分离不同 hs 文件中的函数时堆栈空间溢出

haskell - 使用 DataKinds 时无法在 GHCI 中指定类型签名

Haskell - 如何在 IO 函数中使用纯函数?

haskell - 在 Haskell 中构建一棵树

string - Haskell - 尝试将函数应用于多个数字的行

haskell - 如何更改 IHP 应用程序中的 <title>?

haskell - Haskell 中按名称调用与按值调用

haskell - 类型类 "between"类别和箭头有意义吗?