【问题标题】:Return value of forM in HaskellHaskell中forM的返回值
【发布时间】:2019-12-03 15:06:41
【问题描述】:

如果我有一个长度为n的列表input = ["1", "-2", "14", "3"],并且我想将其转换为Int列表,那么

的返回值是多少
forM [0..(n-1)] $ \i -> do
        let t = read (input!!(i)) :: Int 
        return ()

我发现t 将包含input 列表中每个字符串的Int 值,但我不明白如何将它们放入新列表中。请注意,这个forM 语法不是我写的。我研究了我应该如何使用 monad,但我仍然没有真正理解它,因为我找不到一个例子。

【问题讨论】:

  • 这里forM 将返回一个列表[(), (), ..., ()]。您可能想使用forM_,但这里看起来您正在将命令式代码转换为函数式代码。事实上,您根本不需要forMdo
  • 即使将 monad 实例用于列表,forM 也不是必需的。你只需要input >>= \x -> return (read x) :: [Int]input >>= return . read :: [Int],甚至input >>= \x -> [read x]。 (在最后一个中使用列表表示法足以表明结果应该是一个列表,没有显式类型注释。)
  • 好的,我看到 forM 不是必需的,但如果我不得不这样,我怎样才能访问列表的元素

标签: list haskell monads


【解决方案1】:

如果我有一个长度为 n 的列表 input = ["1", "-2", "14", "3"],我想将其转换为 Int 列表。

那么你应该使用:

<b>map read</b> input :: [Int]

确实:

Prelude> input = ["1", "-2", "14", "3"]
Prelude> map read input :: [Int]
[1,-2,14,3]

我发现 t 将包含输入列表中每个字符串的 Int 值,但我不明白如何将它们放入新列表中。

(纯)函数式语言(如 Haskell)中的变量是不可变的。这意味着一旦一个变量被设置为一个值,你就不能将它设置为不同的值。

事实上,在 Haskell 中,很少使用循环机制,如 forM 等。M 后缀通常表示您正在使用 Monads,但在这里您根本不需要 monads .在您对 monad 的工作原理有一些基本了解之前,我强烈建议不要使用 do 等。参见例如A fistful of Monads chapter on Learn You A Haskell [lyah]

【讨论】:

  • map read input :: [Int] 如果我在终端中输入它就可以正常工作,但是当我在我的main 函数中使用它时,它会给我一个错误
  • @BalogSzilárd:那是因为main 应该是IO a 类型。所以你需要执行一个action,例如main = print (map read input :: [Int])
猜你喜欢
  • 2018-11-23
  • 1970-01-01
  • 2021-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多