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
在任何给定时刻,哪个更有利于我们的思维过程。
我是 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
在任何给定时刻,哪个更有利于我们的思维过程。