2011-03-22 65 views
21

有没有办法执行一个monad中存储的值的情况下,而不必将名称绑定到它?monadic值的情况下

即不是这样:

c <- getChar 
case c of 
    ... 

有没有办法做到这一点:

mcase getChar of 
    ... 

或者,这将是很好,如果case语句可以部分地施加这样:

case of 
    ... 

将被拆除为:

\a -> case a of 
    ... 

所以,你可以这样做:

getChar >>= case of 
       ... 
+0

您可能已经意识到这一点,但haskell-cafe有一个[讨论](http://thread.gmane.org/gmane.comp.lang.haskell.cafe/81366/)关于这个确切的功能。 GHC方面[似乎没有问题](http://article.gmane.org/gmane.comp.lang.haskell.cafe/81533),所以我们可能迟早会看到这一点。 – 2011-03-23 10:09:43

回答

5

答案是否定的。在Haskell 98中,不能使用case语句而不使用名称。但有一个proposal用于添加对case-lambda的支持。他们提出的语法与你的建议一样。

6

没有,真的没有,但你可以的情况下移动到另一个功能,并将其应用到一元行动的结果。

f x = case x of ... 

main = do 
    f <$> getChar 

Alternativly,以下是可能的:

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

是的,但是**的值是**分配了名称'x'。当我将非单代码转换为单代码并且必须对病例语句进行手术时,我遇到了这个问题。 – pat 2011-03-22 17:48:50

+0

然后用我的第一种方法。 – jmg 2011-03-22 17:52:27

+4

我认为第一个案例是最好的。然后,您可以将case语句放在一起,然后在函数定义中进行模式匹配。 – HaskellElephant 2011-03-22 17:56:34

13

FUZxxl提到的提案现在在7.6.1中在GHC中实施,它被称为LambdaCase

现在你可以这样做:

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

注意\case关键字和事实,那就是在这种情况下没有of之前。

+0

应该还有一些类似于'if'的东西:D – remdezx 2014-10-27 12:52:10

+1

@remdezx,你不需要'if'类似的东西。只需使用'Data.Boolean'中的'bool'。 – dfeuer 2015-02-23 20:30:51