在Haskell中分裂的是什么?

时间:2018-03-26 12:25:46

标签: haskell split functional-programming reverse

我是Haskell的新手,我进入下面的代码并且实际上并不了解它的作用。 我知道toDigits函数声明为Integer并返回Integer的数组。如果参数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)
你可以向我解释一下吗?

2 个答案:

答案 0 :(得分:3)

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 为零,拆分会返回 acc ,否则会以递归方式将 m 的最后一位数字添加到 acc 并将其作为拆分的第一个参数传递,并从 m 中移除最后一个数字,并将其作为第二个参数传递给分割即可。换句话说,此函数最终将数字拆分为其数字,并将结果作为整数列表返回。有了这个说,调用split [] 1234将返回[1, 2, 3, 4]。您可能不需要反转调用split的结果。

答案 1 :(得分:0)

这里,它需要一个数字并逐个构建一个数字列表。在每一刻它首先检查number参数是否为零(然后返回的值是一个空列表),如果不是,a)取最后一位数字; b)将数字预先设置为递归调用自身的结果,现在使用最后一位数字删除的数字。实际上从未使用过acc参数,因为递归最终被解决为模数缺点。

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