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