假設我有一個Haskell的表達,如:哈斯克爾模式匹配對稱的情況下
foo (Nothing, Just a) = bar a
foo (Just a, Nothing) = bar a
有沒有Haskell語法崩潰的情況下,所以我可以匹配模式,並指定bar a
爲雙方的反應如何?或者,我能得到它簡潔嗎?
假設我有一個Haskell的表達,如:哈斯克爾模式匹配對稱的情況下
foo (Nothing, Just a) = bar a
foo (Just a, Nothing) = bar a
有沒有Haskell語法崩潰的情況下,所以我可以匹配模式,並指定bar a
爲雙方的反應如何?或者,我能得到它簡潔嗎?
這和Haskell一樣簡潔。在ML中,有一種你想要的語法(通過編寫多個模式,它們將相同的變量綁定,彼此相鄰,由|
分隔,最後一個模式之後的主體),但是在Haskell中沒有。
如果您的代碼比您的示例更復雜,您可能需要使用Alternative
實例Maybe
和PatternGuards
擴展(Haskell2010的一部分)做類似的事情。
{-# LANGUAGE PatternGuards #-}
import Control.Applicative
foo (x, y) | Just a <- y <|> x = bar a
如果你不熟悉它,<|>
挑選最左邊的Just
如果有一個返回Nothing
否則,造成的格局後衛失敗。
一個重要的警告,但 - 此匹配更多的情況下比原來的碼。 foo(Just x,Just y)會匹配,所以如果這不是你想要的,你必須確保在早期的情況下處理它。 – mokus
您可以使用-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
或根據需要查看之前數據標準化的。
參見http://stackoverflow.com/questions/5914965/patterns-for-symmetric-functions – kennytm