【问题标题】:Iterate over the result of a function in a list comprehension在列表推导中迭代函数的结果
【发布时间】:2015-11-15 19:48:20
【问题描述】:

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

我是遗漏了一点语法还是做了一些疯狂的事情?

【问题讨论】:

  • 小注:toDigits :: Integer -&gt; [Int] 可能更合适。

标签: haskell


【解决方案1】:

你的想法真的很好——让我们先给你一个可行的例子:

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

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

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

λ> [show 333]
["333"]

然后read "333" 只会给你回333,因为它是列表中唯一的元素,你会得到你的结果

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多