2014-10-10 61 views
0

有沒有一種方法可以創建一個函數,包含不同模式的多個定義,包括在沒有其他函數的語句模式匹配時執行的函數?Haskell函數模式'其他'

例如爲:

someFunc (pattern1) = def1 
someFunc (pattern2) = def2 
someFunc (<otherwise/all other possible values>) = def3 

或者,如果這是不可能的,怎麼能實現?

提前致謝!

此致敬禮, Skyfe。

回答

5

可以使用通配符匹配_

isJust :: Maybe a -> Bool 
-- Here we don't care about what's inside the `Just` 
isJust (Just _) = True 
-- Here we don't care what it is, it's not a `Just` so return `False` 
isJust _ = False 

爲了澄清,模式都試過在你定義的順序,所以上述功能相當於

isJust _ = False 
isJust (Just _) = True 

因爲首先匹配_模式。什麼編譯器實際上做的是把這個變成一個case語句內部,所以第一個功能就相當於

isJust x = case x of 
    Just _ -> True 
    _  -> False 

當我們從一個曾經存在的所有其他編程語言都知道,case語句按順序嘗試。

+0

但是,如果兩個定義都是可行的呢?它會自動使用符合輸入值的第一個遇到的定義嗎?因爲在你的例子中,一個Just value作爲參數會使第二個定義與通配符合適嗎? – user2999349 2014-10-10 14:44:45

+0

模式按您定義的順序進行嘗試。因此'isJust _ = False';只是(Just _)= True'不會是相同的功能。 – bheklilr 2014-10-10 14:45:52

+0

好吧,我明白了,謝謝! – user2999349 2014-10-10 14:46:24