Haskell(按语法)用向左箭头打开内联monad

fak*_*ake 1 monads haskell applicative

我找不到我在哪里看到的内容,但在reddit讨论的某个地方发现了以下do语句中的以下语法:

do
  case (<- fooM) of
    Foo x -> ..
    ...
Run Code Online (Sandbox Code Playgroud)

而不是通常的

do
  foo <- fooM
  case foo of
    Foo x -> ..
    ...
Run Code Online (Sandbox Code Playgroud)

这将是非常有用的,但是它似乎没有工作(没有语言扩展),我想知道这是否只是帖子作者的速记形式,或者我是否缺少语言扩展。

请注意,我了解例如该语法是模棱两可的

(`execState` 0) $ do
  return $ (<- put 3) <> (<- put 4) <> (<- put 5)
Run Code Online (Sandbox Code Playgroud)

我们可能会得到3、4或5,但是可能会有一些语义可以减轻这种情况。

sar*_*ara 11

您可以在这里使用LambdaCase!

{-# LANGUAGE LambdaCase #-} 

doStuff = do
  fooM >>= \case
    Foo x -> ...
Run Code Online (Sandbox Code Playgroud)