转换的整数列表到一个诠释(如CONCAT)在Haskell

差不多标题所说的话。 我有像这样的整数列表:[1,2,3]。 我想在更改为整数123。我的第一个念头是CONCAT但是,这并不工作,因为它是错误的类型,我已经试过各种事情,但通常我只是最终返回相同的列表。 任何帮助极大的赞赏。

此外,我已经找到了一种方法,除了我想要的类型是整数和putStr没有做到这一点,打印正确的事(putStr)。

--------------解决方案-------------

你可以用foldl合并列表中的所有元素:

fromDigits = foldl addDigit 0
where addDigit num d = 10*num + d

addDigit函数的调用foldl添加数字,一个接着一个,从最左边的1开始。

*Main> fromDigits [1,2,3]
123

编辑:
foldl遍历该列表从左至右,添加的元素积累一定的值。

的第二个参数foldl 0在此情况下,是该方法的起始值。 在第一步骤中,即开始值是结合1该列表的第一个元素,通过调用addDigit 0 1这导致在10 * 0 + 1 = 1。在下一步骤中,该1是结合的第二元件列表中,由addDigit 1 2得到10 * 1 + 2 = 12然后,这是结合列表的第三元件中,通过addDigit 12 3产生10 * 12 + 3 = 123。

所以无谓由零相乘仅仅是第一步骤,在乘法实际需要来添加新的数字“到端”的数量得到积累以下步骤。

你可以concat数字的字符串表示形式,然后read他们回来,就像这样:

joiner :: [Integer] -> Integer
joiner = read . concatMap show

使用read ,也intToDigit

joinInt :: [Int] -> Int
joinInt l = read $ map intToDigit l

有呕吐多位数的优势(或劣势)。

另一个想法是说:最后一个数字计数为1,下一个将持续数为10,在这之前数字计数为100,等等。 所以到数字的列表转换为数字,你需要扭转它(以开始在背面),以十的相应权力乘以数字在一起,加在一起的结果。

为了扭转列表,使用reverse ,要得到10,你可以用权力iterate (*10) 1在ghci中试验或拥抱!),乘以相应的两个列表位使用zipWith (*)并添加一切融合在一起,用sum -它确实有助于了解一些库函数! 把位组合在一起,你会得到

fromDigits xs = sum (zipWith (*) (reverse xs) (iterate (*10) 1))

评价实施例:

fromDigits [1,2,3,4]
==> sum (zipWith (*) (reverse [1,2,3,4]) [1,10,100,1000, ....]
==> sum (zipWith (*) [4,3,2,1] [1,10,100,1000, ....])
==> sum [4 * 1, 3 * 10, 2 * 100, 1 * 1000]
==> 4 + 30 + 200 + 1000
==> 1234

然而,这种解决方案比那些与慢foldl由于呼叫reverse既然你正在构建了十个这些权力只能直接再次使用。 从有利的一面,这样的建筑数字是接近了人们通常认为的(至少我做的!),而foldl本质-solutions使用霍纳法则。

至于如何进行打印的数量,而不是

putStr n

你试一试

putStr (show n)

其理由是putStr只能打印字符串。 所以,你需要通过它在之前的数转换为字符串。

您也可以尝试print从前奏功能。 这一次可以打印任何东西,那就是“showable”(中类中的任何实例Show ,不仅是字符串)。 但要知道, print n对应(大致)为putStrLn (show n)而不是putStr (show n)

我在Haskell不是专家,但是这是我能想到的解决这个问题,不涉及使用任何其他外部功能最简单的方法。

ConcatDigits :: [Int] -> Int
ConcatDigits [] = 0
ConcatDigits xs = ConcatReversed (ReverseDigits xs) 1

ReverseDigits :: [Int] -> [Int]
ReverseDigits [] = []
ReverseDigits (x:xs) = (ReverseDigits xs) : x

ConcatReversed :: [Int] -> Int -> Int
ConcatReversed [] d = 0
ConcatReversed (x:xs) d = (x*d) + ConcatReversed xs (d*10)

正如你所看到的,我假设你想Concat的数字列表。 万一这是不是你的情况,我敢肯定,这是不行的。 :(

在我的解决方案,首先我定义了一个名为ReverseDigits功能,反转原始列表。 例如[1,2,3]至[3,2,1]

在那之后,我使用ConcatReversed函数,它接受数字和编号为d的列表,这是十力上的列表中的位置的第一个数字的结果。 如果该列表为空则返回0,如果没有,它返回第一个数字上的列表中倍研发,加上传递列表并d次10的其余部分的调用ConcatReversed。

希望代码自己说话,因为我觉得我的英语不好的解释是不是非常有帮助。

分类:名单 时间:2015-03-15 人气:0
本文关键词: 哈斯克尔,列表,整数
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.543 (s). 10 q(s)