尝试在Haskell中将整数转换为字符串

里克

我正在尝试编写代码以接受整数并以字为单位输出该整数。例如:如果输入为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)

目前,我认为我遇到类型错误。请注意,这需要能够传递正数和负数。另外,如果您能想到一种有效的方法来进行我所寻找的转换,将不胜感激。

德卡萨克

类型名称不能以小写字母开头。更改wordIntWordInt这里:

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在括号中加上了括号。因为否则编译器会认为你正试图减去这需要一元减xhelper(这是一种功能,而不是一个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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章