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 看起来很有希望。
我找不到我在哪里看到的,但我在 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 看起来很有希望。