2015-11-15 27 views
1

我在学习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]

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

+0

小备注:'toDigits :: Integer - > [Int]'可能更合适。 – Zeta

回答

5

以及你的想法真的很好 - 让我们首先给你一个工作示例:

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

现在所在的区别? - 那么,如果你做[show n]

你产生一个清单,一个字符串:

λ> [show 333] 
["333"] 

然后read "333"只会给你回333而且由于它在列表中的唯一元素你会得到你的结果

所以显而易见的解决方案是从[show n]中删除[..],但现在您可以获取字符并且read需要字符串 - 这就是为什么我在重新包装每个字符(使用[c])之前阅读

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

+0

这正是我想要的。谢谢! –