我正在尝试编写代码以接受整数并以字为单位输出该整数。例如:如果输入为4321,则输出为四千三百二十一。为此,我首先想将输入分解成各个数字。输入4321将成为[4,3,2,1]的数组。
我当前的代码
newtype wordInt = WI Int
instance Show WordInt where
show (WI x) | x>= 0 = helper x
| x < 0 = helper -x
helper 0 = [0]
helper x = x `mod` 10 : helper (x `div` 10)
目前,我认为我遇到类型错误。请注意,这需要能够传递正数和负数。另外,如果您能想到一种有效的方法来进行我所寻找的转换,将不胜感激。
类型名称不能以小写字母开头。更改wordInt
到WordInt
这里:
newtype wordInt = WI Int
该方法show
的的Show
类必须返回一个String
和你helper
有型Int -> [Int]
(当应用到Int
)。您需要以某种方式将列表转换为String
,例如通过调用show
列表:
instance Show WordInt where
show (WI x) | x >= 0 = show $ helper x
| x < 0 = show $ helper (-x)
最后,请注意,我-x
在括号中加上了括号。因为否则编译器会认为你正试图减去这需要一元减x
从helper
(这是一种功能,而不是一个Int
)。
但是,您对的实现helper
是错误的,因为它会反向返回数字列表。要解决此问题,您可以编写一个辅助函数来分割数字,然后反转列表:
helper :: Int -> [Int]
helper = reverse . go
where go 0 = [0]
go x = x `mod` 10 : go (x `div` 10)
但是,这将在数字前加零:
λ. helper 4321
[0,4,3,2,1]
当然,这不会改变含义,但是,如果有问题,请编写包装函数来处理这种情况:
helper :: Int -> [Int]
helper x =
case splitIntoDigits x of
[] -> [0]
xs -> reverse xs
splitIntoDigits :: Int -> [Int]
splitIntoDigits 0 = []
splitIntoDigits x = x `mod` 10 : splitIntoDigits (x `div` 10)
然后在两种情况下都可以工作:
λ. helper 0
[0]
λ. helper 4321
[4,3,2,1]
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句