2011-05-11 63 views
8

假設我有一個Haskell的表達,如:哈斯克爾模式匹配對稱的情況下

foo (Nothing, Just a) = bar a 
foo (Just a, Nothing) = bar a 

有沒有Haskell語法崩潰的情況下,所以我可以匹配模式,並指定bar a爲雙方的反應如何?或者,我能得到它簡潔嗎?

+0

參見http://stackoverflow.com/questions/5914965/patterns-for-symmetric-functions – kennytm

回答

5

這和Haskell一樣簡潔。在ML中,有一種你想要的語法(通過編寫多個模式,它們將相同的變量綁定,彼此相鄰,由|分隔,最後一個模式之後的主體),但是在Haskell中沒有。

8

如果您的代碼比您的示例更復雜,您可能需要使用Alternative實例MaybePatternGuards擴展(Haskell2010的一部分)做類似的事情。

{-# LANGUAGE PatternGuards #-} 
import Control.Applicative 

foo (x, y) | Just a <- y <|> x = bar a 

如果你不熟悉它,<|>挑選最左邊的Just如果有一個返回Nothing否則,造成的格局後衛失敗。

+2

一個重要的警告,但 - 此匹配更多的情況下比原來的碼。 foo(Just x,Just y)會匹配,所以如果這不是你想要的,你必須確保在早期的情況下處理它。 – mokus

4

您可以使用-XViewPatterns添加任意函數以將您的兩種情況摺疊爲單個模式。 你現在的模式是一個功能p能產生要匹配的東西:

foo (p -> (Just a, Nothing)) = bar a 

簡單多了!

我們要定義p不過,因爲:

p (Nothing, [email protected](Just _)) = (a, Nothing) 
p [email protected](Just _, Nothing) = a 
p a      = a 

或根據需要查看之前數據標準化的。


參考文獻:GHC User's Guide chapter on View Patterns