Haskell делает (синтаксически) распаковку встроенной монады с левой стрелкой - PullRequest
1 голос
/ 05 марта 2019

Я не могу найти, где я видел это, но я нашел где-то в обсуждении 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 ]

10 голосов
/ 05 марта 2019

Вы можете использовать LambdaCase здесь!

{-# LANGUAGE LambdaCase #-} 

doStuff = do
  fooM >>= \case
    Foo x -> ...
3 голосов
/ 05 марта 2019

Я не думаю, что такая вещь существует;в противном случае я бы ожидал, что он будет работать только для case, а не внутри произвольных выражений, как это делает ваш второй пример.

Я просмотрел список расширений языка GHC ини один из них не выглядит многообещающим.

...