Haskell 使用左箭头进行(语法上)内联 monad 解包

Haskell do (syntactically) inline monad unpacking with left arrow

我找不到我在哪里看到的,但我在 reddit 讨论的某处发现了 do 块中的以下语法:

do
  case (<- fooM) of
    Foo x -> ..
    ...

而不是通常的

do
  foo <- fooM
  case foo of
    Foo x -> ..
    ...

这将非常有用,但它似乎不起作用(没有语言扩展),我想知道它是否只是 post 作者的 shorthand,或者我是否遗漏了语言扩展。

请注意,我知道此语法不明确,例如

(`execState` 0) $ do
  return $ (<- put 3) <> (<- put 4) <> (<- put 5)

我们可能会得到 3、4 或 5,但可能有语义来缓解这种情况。

你可以在这里使用LambdaCase!

{-# LANGUAGE LambdaCase #-} 

doStuff = do
  fooM >>= \case
    Foo x -> ...

我认为不存在这样的事情;如果是这样,我希望它只适用于 case,而不是像你的第二个例子那样在任意表达式中工作。

我浏览了 list of GHC language extensions,其中 none 看起来很有希望。