Haskell 中的拆分有什么作用?
What does split in Haskell do?
我是 Haskell
的新手,我进入了下面的代码但并不真正理解它的作用。
我知道 toDigits
函数被声明为采用 Integer
和 return 的 Integer
数组。如果参数 n
等于或小于 0,我们 return 一个空数组,否则...?这就是奥秘!
toDigits :: Integer -> [Integer]
toDigits n
| n < 1 = []
| otherwise = reverse $ split [] n
where split _ 0 = []
split acc m = lastDigit m : split acc (dropLastDigit m)
你能给我解释一下吗?
在这里,它接受一个数字并一个一个地构建它的数字列表。在每个时刻,它首先检查数字参数是否为零(然后返回值是一个空列表),如果不是,a) 获取它的最后一个数字; b) 将数字添加到递归调用自身的结果中,现在数字的最后一个数字被删除。 acc 参数从未实际使用过,因为递归最终被确定为模 cons。
请注意,列表最终是按 least-endian 顺序构建的:列表的第一个元素是数字的最低有效位。
reverse $ split [] n
与
相同
reverse (split [] n)
它反转 split [] n
的 return 值和 return 结果。
拆分在下一行定义。
它需要一个列表(一个累加器)和一个整数并执行此操作:
请注意,我假设拆分定义如下(当前实现不使用 acc)。我还假设 lastDigit
和 dropLastDigit
就像他们的名字所暗示的那样:
split acc 0 = acc
split acc m = split (lastDigit m : acc) (dropLastDigit m)
现在,split returns acc 如果 m 为零,否则它递归地将 m 的最后一位添加到 acc 并将其作为第一个参数传递给 split,并从 m 中删除最后一个数字并将其作为第二个参数传递给 split。换句话说,这个函数最终将一个数字拆分成它的数字,并且 return 将结果作为整数列表。话虽如此,调用 split [] 1234
会 return [1, 2, 3, 4]
。您可能不需要反转调用 split 的结果。
我是 Haskell
的新手,我进入了下面的代码但并不真正理解它的作用。
我知道 toDigits
函数被声明为采用 Integer
和 return 的 Integer
数组。如果参数 n
等于或小于 0,我们 return 一个空数组,否则...?这就是奥秘!
toDigits :: Integer -> [Integer]
toDigits n
| n < 1 = []
| otherwise = reverse $ split [] n
where split _ 0 = []
split acc m = lastDigit m : split acc (dropLastDigit m)
你能给我解释一下吗?
在这里,它接受一个数字并一个一个地构建它的数字列表。在每个时刻,它首先检查数字参数是否为零(然后返回值是一个空列表),如果不是,a) 获取它的最后一个数字; b) 将数字添加到递归调用自身的结果中,现在数字的最后一个数字被删除。 acc 参数从未实际使用过,因为递归最终被确定为模 cons。
请注意,列表最终是按 least-endian 顺序构建的:列表的第一个元素是数字的最低有效位。
reverse $ split [] n
与
相同reverse (split [] n)
它反转 split [] n
的 return 值和 return 结果。
拆分在下一行定义。
它需要一个列表(一个累加器)和一个整数并执行此操作:
请注意,我假设拆分定义如下(当前实现不使用 acc)。我还假设 lastDigit
和 dropLastDigit
就像他们的名字所暗示的那样:
split acc 0 = acc
split acc m = split (lastDigit m : acc) (dropLastDigit m)
现在,split returns acc 如果 m 为零,否则它递归地将 m 的最后一位添加到 acc 并将其作为第一个参数传递给 split,并从 m 中删除最后一个数字并将其作为第二个参数传递给 split。换句话说,这个函数最终将一个数字拆分成它的数字,并且 return 将结果作为整数列表。话虽如此,调用 split [] 1234
会 return [1, 2, 3, 4]
。您可能不需要反转调用 split 的结果。