将整数列表转换为haskell中的一个Int(如concat)

Pau*_*aul 8 haskell integer list

几乎就是标题所说的.我有一个整数列表,如下所示:[1,2,3].我想把它改成整数123.我的第一个想法是concat但是这不起作用,因为它是错误的类型,我尝试了各种各样的东西,但通常我最终返回相同的列表.任何帮助非常感谢.

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

sth*_*sth 23

您可以使用foldl组合列表的所有元素:

fromDigits = foldl addDigit 0
   where addDigit num d = 10*num + d
Run Code Online (Sandbox Code Playgroud)

addDigit函数被调用foldl以从最左边开始一个接一个地添加数字.

*Main> fromDigits [1,2,3]
123
Run Code Online (Sandbox Code Playgroud)

编辑:
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.

因此,毫无意义地乘以零只是第一步,在接下来的步骤中,实际上需要乘法以将新数字添加到累积数字的"结尾".

  • 或方式冷却点免费 - fromDigits = foldl((+).(*10))0 :) (7认同)
  • 要使此功能适用于多位数字,您只需要将addDigit中的10更改为`(10 ^(floor $ log(fromIntegral d)/ log 10 +1))。它看起来有些丑陋,但是它所要做的就是根据数字的大小调整10。 (2认同)

Ash*_*hra 11

您可以concat使用数字的字符串表示形式,然后将read它们返回,如下所示:

joiner :: [Integer] -> Integer
joiner = read . concatMap show
Run Code Online (Sandbox Code Playgroud)

  • 这将"[12,34]"变成"1234" - 与sth不同,后者将其变为"154"或克里斯的错误.OP的期望行为未指定. (2认同)