toDigits 但用零填充 Haskell

toDigits but padded with zeros Haskell

我是 Haskell 的新手,有以下作业:

Convert positive Integers to a list of its digits, but if the list has negative number or is 0, return the empty list. If the list is shorter than 9 digits, it should be padded from the left with zeros.

我已经设法为填充和 toDigits 编写了代码,但我不确定如何将它们组合起来,请帮忙。我的代码:

toDigits :: Integer -> [Integer]
toDigits 0 = []
toDigits x = (if (x < 0) then [] else (toDigits (x `div` 10)) ++ [x `mod` 10]) 

padLeft :: Int -> a -> [a] -> [a]  
-- I thought about calling the  function with 9 and 0 and the list
padLeft n x xs = replicate (n - length xs) x ++ xs

示例:

toDigits 496351 = [0,0,0,4,9,6,3,5,1]
toDigits 0 = []
toDigits (-17) = []

您只需要用一个子句扩充 padLeft 定义,以拦截 [] 案例:

padLeft' :: Int -> a -> [a] -> [a]  
padLeft' _ _ [] = ........    -- complete the definition
padLeft' n x xs = replicate (n - length xs) x ++ xs

现在,

> padLeft' 9 0 $ toDigits (496351)
[0,0,0,4,9,6,3,5,1]

> padLeft' 9 0 $ toDigits (-17)
[]

> padLeft' 9 0 $ toDigits (0)
[]

您可以将其打包为一个函数调用,

toDigitsPadded :: Integer -> [Integer]
toDigitsPadded n = padLeft' 9 0 $ toDigits n

或者,更短,

toDigitsPadded :: Integer -> [Integer]
toDigitsPadded  =  padLeft' 9 0 . toDigits

这就是我们在 Haskell 中 将较小的函数 组合成更大的程序的方式。非巧合的是,. 运算符被称为“函数 组合 运算符”,它从右到左组合了两个函数,如上所示,因此第二个函数(在“点”的右边)用作第一个函数(在左边)的输入:

(f  .  g) x  =  f (g x)

不是伪代码)。当使用显式参数时,这遵循通常的函数调用语法方向性。

还有一个从左到右的函数组合运算符,

(g >>> f) x  =  f (g x)
             =  g x & f
             =  x & g & f

这让我们在精神上更多地关注从左到右方向流经这些函数的 数据。与运算符 & 相同,只不过是

x & g  =  g $ x 
       =  g  x

在任何给定时刻,哪个更有利于我们的思维过程。