Sequence (toBlock $ VarDeclAssign "foo" (JBool False)) (Return $ JBool True)
这是我目前唯一能做到的方法。我尝试了 foldl
但 EmptyBlock
有不同的类型,因此它无法构建。
我可以在这里使用 do 表示法或其他东西吗?
最佳答案
查看 the documentation ,问题是 EmptyBlock
和 Sequence
的类型是
EmptyBlock :: Block ()
Sequence :: Block () -> Stmt t -> Block t
大多数语句都是 Stmt ()
类型,Return::Expr t -> Stmt t
除外。据我所知,这是为了确保一个 block 中只能有一个 return 语句,并且它必须位于最后。
foldl Sequence EmptyBlock
不适合您的原因是 foldl
的类型为 (a -> b -> a) -> a -> [b] -> a
,如果你看第一个参数,很明显,只有选择 t = ()
才能使用 Sequence
> 这样a = Block ()
和b = Stmt ()
。
这意味着您可以使用 foldl
来组合除 Return
之外的所有语句,您必须在末尾手动插入这些语句。希望这不会太不方便。
关于haskell - 如何使用 JavaScript 将语句链接到一个 block 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7994054/