【发布时间】:2018-11-21 02:11:52
【问题描述】:
我正在尝试使用 <- 绑定将 IO [String] 转换为 [String];但是,我需要在 where 语句下使用 do 块来执行此操作,但 Haskell 一直抱怨缩进。代码如下:
decompEventBlocks :: IO [String] -> IO [[String]]
decompEventBlocks words
| words' /= [] = block : (decompEventBlocks . drop $ (length block) words')
| otherwise = []
where
do
words' <- words
let block = (takeWhile (/="END") words')
这是什么原因?我们如何在 where 语句中使用 do 块?而且,有没有机会在守卫面前发表一些声明?
【问题讨论】:
-
do-blocks 不是语句,它们是值。你认为这应该做什么?就像我在你上一个问题中所说的那样,请在使用 monad 之前学习它们! -
处理缩进,可以使用
do { x ; y ; z }显式语法。 -
将你的函数更改为
[String] -> [[String]],然后只需使用fmap将其提升到IOmonad。 -
@onurcanbektas Monad 不是'语言的内部工作',它们是 Haskell 的一个重要特性,定义其 I/O 约束.如果不了解 monad,您将无法编写出好的 Haskell。了解单子!
-
@AJFarmar 虽然是真的,但 do 表示法可以自己掌握,作为 DSL 本身,几乎不需要遵循什么规则。这可能是掌握的第一步,更小的步骤。 (另外,包括所有可选的括号、大括号和分号(do、case、$、...)可以真正帮助初学者,因为它们可能仍然存在语法上的任何额外不确定性)。
标签: haskell scope functional-programming monads do-notation