Haskell做(语法上)内联monad用左箭头拆包

问题描述 投票:1回答:2

我找不到我在哪里看到这个但是我在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但可能有语义来缓解这种情况。

haskell monads applicative
2个回答
3
投票

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

我浏览了list of GHC language extensions,但没有一个看起来很有希望。


11
投票

你可以在这里使用LambdaCase!

{-# LANGUAGE LambdaCase #-} 

doStuff = do
  fooM >>= \case
    Foo x -> ...
© www.soinside.com 2019 - 2024. All rights reserved.