我正在学习Haskell并让自己感到困惑。
我想定义一个函数
toDigits :: Integer -> [Integer]
它应该取一个数字(例如234)并返回组成数字(例如[2,3,4])
我以为这......
toDigits n = [read c | c <- [show n]]
指
show n
即将234转换为“234”read
应用于给出[2,3,4] 但是我得到了“234”,所以它必须意味着
show n
即将234转换为“234”read
应用于给出[234] 我是否缺少一点语法或做一些疯狂的事情?
答案 0 :(得分:5)
你的想法非常好 - 让我们首先给你一个有效的例子:
toDigits :: Integer -> [Integer]
toDigits n = [read [c] | c <- show n]
现在哪里有区别? - 好吧,如果你做[show n]
您生成一个包含一个字符串的列表:
λ> [show 333]
["333"]
然后read "333"
会返回333
,因为它是列表中唯一的元素,您可以获得结果
所以显而易见的解决方案是从[..]
删除[show n]
,但现在你得到了字符,read
想要字符串 - 这就是我重新包装每个字符的原因(使用{{1在阅读之前
这正是你想要的(或者我认为)