【问题标题】:What does split in Haskell do?Haskell 中的 split 有什么作用?
【发布时间】:2018-03-26 12:25:45
【问题描述】:

我是Haskell 的新手,我进入了下面的代码,但并不真正理解它的作用。 我知道toDigits 函数被声明为采用Integer 并返回Integers 的数组。如果参数n 等于或小于0,我们返回一个空数组,否则......?这就是奥秘!

toDigits :: Integer -> [Integer]
toDigits n
  | n < 1     = []
  | otherwise = reverse $ split [] n
    where split _   0 = []
          split acc m = lastDigit m : split acc (dropLastDigit m)

你能解释一下吗?

【问题讨论】:

  • accumulator 参数从未在该实现中使用。它可能应该被省略。
  • lastDigitdropLastDigit 是做什么的?

标签: haskell split functional-programming reverse


【解决方案1】:
reverse $ split [] n

是一样的

reverse (split [] n)

它反转split [] n的返回值并返回结果。

分割在下一行定义。

它需要一个列表(一个累加器)和一个整数,然后这样做:

请注意,我假设 split 定义如下(当前实现不使用 acc)。我还假设 lastDigitdropLastDigit 会按照他们的名字所暗示的那样行事:

split acc 0 = acc
split acc m = split (lastDigit m : acc) (dropLastDigit m)

现在,如果 m 为零,split 返回 acc,否则递归地将 m 的最后一位数字添加到acc 并将其作为第一个参数传递给 split,并从 m 中删除最后一个数字并将其作为第二个参数传递给 分裂。换句话说,此函数最终将一个数字拆分为其位数,并将结果作为整数列表返回。话虽如此,调用split [] 1234 将返回[1, 2, 3, 4]。您可能不需要反转调用 split 的结果。

【讨论】:

    【解决方案2】:

    在这里,它接受一个数字并一个一个地构建一个数字列表。在每个时刻,它首先检查 number 参数是否为零(然后返回值是一个空列表),如果不是,则 a) 取其最后一位; b) 将数字添加到对自身的递归调用的结果中,现在删除最后一个数字的数字。 acc 参数从未实际使用过,因为递归最终确定为模 cons。

    请注意,列表最终以最低端顺序构建:列表的第一个元素是数字的最低有效位。

    【讨论】:

      猜你喜欢
      • 2013-08-05
      • 1970-01-01
      • 1970-01-01
      • 2020-06-12
      • 1970-01-01
      • 1970-01-01
      • 2017-04-11
      • 1970-01-01
      • 2020-06-25
      相关资源
      最近更新 更多