在列表推导

时间:2015-11-15 11:43:36

标签: haskell

我正在学习Haskell并让自己感到困惑。

我想定义一个函数

toDigits :: Integer -> [Integer]

它应该取一个数字(例如234)并返回组成数字(例如[2,3,4])

我以为这......

toDigits n = [read c | c <- [show n]]

  • show n即将234转换为“234”
  • 使用“234”生成序列[“2”,“3”,“4”]
  • 然后将read应用于给出[2,3,4]
  • 的每个元素

但是我得到了“234”,所以它必须意味着

  • show n即将234转换为“234”
  • 使用“234”生成序列[“234”]
  • 然后将read应用于给出[234]
  • 的每个元素

我是否缺少一点语法或做一些疯狂的事情?

1 个答案:

答案 0 :(得分:5)

你的想法非常好 - 让我们首先给你一个有效的例子:

toDigits :: Integer -> [Integer]
toDigits n = [read [c] | c <- show n]

现在哪里有区别? - 好吧,如果你做[show n]

您生成一个包含一个字符串的列表:

λ> [show 333]
["333"]

然后read "333"会返回333,因为它是列表中唯一的元素,您可以获得结果

所以显而易见的解决方案是从[..]删除[show n],但现在你得到了字符,read想要字符串 - 这就是我重新包装每个字符的原因(使用{{1在阅读之前

这正是你想要的(或者我认为)