关于一元价值的案例

pat*_*pat 21 haskell

有没有办法对monad中存储的值执行一个案例,而不必将名称绑定到它?

即而不是这样做:

c <- getChar
case c of
  ...
Run Code Online (Sandbox Code Playgroud)

有没有办法做到这一点:

mcase getChar of
  ...
Run Code Online (Sandbox Code Playgroud)

或者,如果case语句可以部分应用,那将是很好的:

case of
  ...
Run Code Online (Sandbox Code Playgroud)

会不情愿地:

\a -> case a of
  ...
Run Code Online (Sandbox Code Playgroud)

所以你可以这样做:

getChar >>= case of
              ...
Run Code Online (Sandbox Code Playgroud)

Emm*_*ery 14

现在,FUZxxl提到的提案自从7.6.1开始在GHC中实施LambdaCase.

现在你可以这样做:

{-# LANGUAGE LambdaCase #-}
getChar >>= \case
   ...
Run Code Online (Sandbox Code Playgroud)

请注意关键字\之前case以及of在这种情况下不存在的事实.


jmg*_*jmg 6

不,不是真的,但你可以将案例移到另一个函数中并将其应用于monadic动作的结果.

f x = case  x of ...

main = do
  f <$> getChar
Run Code Online (Sandbox Code Playgroud)

或者,以下是可能的:

getChar >>= \x -> case x of ...
Run Code Online (Sandbox Code Playgroud)

  • 我认为第一种情况是最好的.然后,您可以将case语句全部放在一起,并在函数定义中进行模式匹配. (4认同)

fuz*_*fuz 5

答案是不.在Haskell 98中,如果不在其中使用名称,则不能使用case语句.但有一项建议是增加对case-lambdas的支持.他们提出的语法与您提出的语法相同.