Подтвердить что ты не робот

Случай по монадическому значению

Есть ли способ выполнить случай с значением, хранящимся в монаде, без привязки имени к нему?

то есть. вместо этого:

c <- getChar
case c of
  ...

Есть ли способ сделать это:

mcase getChar of
  ...

В качестве альтернативы было бы неплохо, если бы оператор case мог быть частично применен так:

case of
  ...

был бы снят с:

\a -> case a of
  ...

Итак, вы можете сделать это:

getChar >>= case of
              ...
4b9b3361

Ответ 1

Ответ - нет. В Haskell 98 вы не можете использовать оператор case без использования имени внутри него. Но есть предложение для добавления поддержки case-lambdas. Синтаксис, который они предлагают, тот же, который вы предлагаете.

Ответ 2

Предложение, упомянутое FUZxxl, теперь реализовано в GHC с 7.6.1, оно называется LambdaCase.

Теперь вы можете сделать:

{-# LANGUAGE LambdaCase #-}
getChar >>= \case
   ...

Обратите внимание на \ перед ключевым словом case и тем, что в этом случае нет of.

Ответ 3

Нет, не совсем, но вы можете переместить случай в другую функцию и применить его к результату монадического действия.

f x = case  x of ...

main = do
  f <$> getChar

Альтернативно, возможно следующее:

getChar >>= \x -> case x of ...