2017-09-25 59 views
2

我有一個像代數數據類型匹配:Haskell的圖案上的功能結果

data Toll = Vok Int Bool | Bok Int | Cokd String Char 

和另一功能

getVal :: Int -> Toll 
getVal 1 = Cokd "hello" 'c' 
getVal _ = Bok 12 

我想調用在一些功能getVal和提取的Cokd參數(如果答案是Cokd)(可能使用模式匹配)。

可我不喜歡:

hello :: Int -> Bool 
hello x = if st == "hell" then True else False 
where (Cokd st ch) = getVal x 

我不能用單子。

如何做到這一點?

+1

你想'getVal'的結果模式匹配?類似於{Cokd str ch - > ...}'的case getVal x? – ZhekaKozlov

+0

可我不喜歡在編輯崗位上述@ZhekaKozlov – Hok

回答

5

可以使用casegetVal結果模式匹配:

data Toll = Vok Int Bool | Bok Int | Cokd String Char 

getVal :: Int -> Toll 
getVal 1 = Cokd "hello" 'c' 
getVal _ = Bok 12 

hello :: Int -> Bool 
hello x = 
    case getVal x of 
    Cokd st ch -> 
     st == "hell" 
    _ -> False 

或者創建一個單獨的功能和模式匹配參數:

hello :: Int -> Bool 
hello = 
    helloToll . getVal 
    where 
    helloToll (Cokd st ch) = st == "hell" 
    helloToll _ = False 

的例子,你已經在問題中提供了編譯(幾乎沒有修改),但是當您嘗試使用調​​用hello時,它會拋出運行時異常(或任何其他值從1不同,在這種情況下返回getValueBok 12,從而(Cokd st ch) = getVal x未能圖案匹配)。

+0

i顯示了在原崗位似乎編譯方式,它是否行得通呢? @ igor- – Hok

+0

只要你給'hello'提供'1',它就會工作。其他值將失敗。 (更新了我的答案) –

3

您的代碼似乎完全沒事,只是一個修正:模式if <expr> then True else False可以<expr>更換。

hello :: Int -> Bool 
hello x = st == "hell" where (Cokd st ch) = getVal x 

然而,該代碼將失敗由於非窮盡模式匹配比1其它值。您需要涵蓋所有情況:

hello :: Int -> Bool 
hello x = case getVal x of 
    Cokd st ch -> st == "hell" 
    _ -> False