2011-03-22 56 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