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

时间:2019-03-05 13:04:50

标签: haskell monads applicative

我找不到我在哪里看到的东西,但在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,但是可能会有语义来减轻这种情况。

2 个答案:

答案 0 :(得分:10)

您可以在此处使用LambdaCase!

{-# LANGUAGE LambdaCase #-} 

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

答案 1 :(得分:3)

我认为不存在任何此类事物;如果可以,那么我只会期望它适用于case,而不是像第二个示例那样适用于任意表达式。

我浏览了list of GHC language extensions,但都没有希望。