Ответ 1
Ответ - нет. В Haskell 98 вы не можете использовать оператор case без использования имени внутри него. Но есть предложение для добавления поддержки case-lambdas. Синтаксис, который они предлагают, тот же, который вы предлагаете.
Есть ли способ выполнить случай с значением, хранящимся в монаде, без привязки имени к нему?
то есть. вместо этого:
c <- getChar
case c of
...
Есть ли способ сделать это:
mcase getChar of
...
В качестве альтернативы было бы неплохо, если бы оператор case мог быть частично применен так:
case of
...
был бы снят с:
\a -> case a of
...
Итак, вы можете сделать это:
getChar >>= case of
...
Ответ - нет. В Haskell 98 вы не можете использовать оператор case без использования имени внутри него. Но есть предложение для добавления поддержки case-lambdas. Синтаксис, который они предлагают, тот же, который вы предлагаете.
Предложение, упомянутое FUZxxl, теперь реализовано в GHC с 7.6.1, оно называется LambdaCase
.
Теперь вы можете сделать:
{-# LANGUAGE LambdaCase #-}
getChar >>= \case
...
Обратите внимание на \
перед ключевым словом case
и тем, что в этом случае нет of
.
Нет, не совсем, но вы можете переместить случай в другую функцию и применить его к результату монадического действия.
f x = case x of ...
main = do
f <$> getChar
Альтернативно, возможно следующее:
getChar >>= \x -> case x of ...