我找不到我在哪里看到的东西,但在reddit讨论的某个地方发现了do块中的以下语法:
do
case (<- fooM) of
Foo x -> ..
...
代替通常的
do
foo <- fooM
case foo of
Foo x -> ..
...
这将是非常有用的,但是它似乎没有工作(没有语言扩展),我想知道这是否只是帖子作者的速记形式,或者我是否缺少语言扩展。
请注意,我了解这种语法是不明确的
(`execState` 0) $ do
return $ (<- put 3) <> (<- put 4) <> (<- put 5)
我们可能会得到3、4或5,但是可能会有语义来减轻这种情况。
答案 0 :(得分:10)
您可以在此处使用LambdaCase!
{-# LANGUAGE LambdaCase #-}
doStuff = do
fooM >>= \case
Foo x -> ...
答案 1 :(得分:3)
我认为不存在任何此类事物;如果可以,那么我只会期望它适用于case
,而不是像第二个示例那样适用于任意表达式。
我浏览了list of GHC language extensions,但都没有希望。