2014-01-23 33 views
3

我正在處理一些奇怪的問題。我想寫一個Haskell程序,該程序將打印給定的邏輯公式,即哈斯克爾邏輯公式打印

print (showFormula (I (N (Z 'p')) (A (C (Z 'p') (Z 'q')) (Z 'r')))) 

(其中I是含義,A - 的替代,N - 否定,C - 結合和Z - 字符)

應打印類似的東西:

"(~p => ((p & q) | r))" 

到目前爲止,我的代碼看起來像這樣:

data Formula 
    = Z Char 
    | V Bool 
    | N Formula 
    | C Formula Formula 
    | A Formula Formula 
    | I Formula Formula 
    | Join Formula Formula 

showFormula :: Formula -> String 
showFormula (Z c) = [c] 
showFormula (Join a b) = (showFormula a) ++ (showFormula b) 

showFormula (N a) = '~':(showFormula a) 
showFormula (C a b) = "("++(showFormula a)++" & "++(showFormula b)++")" 
showFormula (A a b) = "("++(showFormula a)++" | "++(showFormula b)++")" 
showFormula (I a b) = "("++(showFormula a)++" => "++(showFormula b)++")" 

它確實打印正確的字符串,但只有當你輸入簡單的公式如(C (Z 'a') (Z 'b')),它崩潰了一些擴展公式。我知道問題是傳遞一個公式參數而不是字符串showFormula函數,但我不知道如何改變它。請給我一些建議如何解決這個問題。

+0

您可能還喜歡[此問題的目標非常相似](http://stackoverflow.com/q/20406722/791604)。 –

+0

請注意,順便提一下,如果中綴構造函數以':'開頭,那麼您可以使用'Formula:&:Formula','Formula:| Formula'和'Formula:=> Formula 'C','A'和'I'。 (也可能需要固定聲明 - 也許是'infixr 3:&&:','infixr 2:|:','infixr 4:=>'。) –

+0

謝謝@AntalS-Z,這很方便,但C ,A和I是必需的,因爲是由其他程序生成的。 –

回答

4

如果用-Wall標誌編譯代碼它會告訴你以下警告:

fml.hs:4:1: Warning: 
    Pattern match(es) are non-exhaustive 
    In an equation for `showFormula': Patterns not matched: V _ 

你忘了寫V案例showFormula所以它會崩潰,如果它到達,類似於如何如果你用一個空列表調用它,head函數會崩潰。

+0

就像我剛纔說的,我很愚蠢:)謝謝! –

+3

@ user2342783:那不是愚蠢的。它只是一個初學者的錯誤。 – hugomg

2

看起來你剛剛錯過了模式匹配中的(V b)案例。

data Formula 
    = Z Char 
    | V Bool 
    | N Formula 
    | C Formula Formula 
    | A Formula Formula 
    | I Formula Formula 
    | Join Formula Formula 

showFormula :: Formula -> String 
showFormula (V b) = show b 
showFormula (Z c) = [c] 
showFormula (Join a b) = (showFormula a) ++ (showFormula b) 

showFormula (N a) = '~':(showFormula a) 
showFormula (C a b) = "("++(showFormula a)++" & "++(showFormula b)++")" 
showFormula (A a b) = "("++(showFormula a)++" | "++(showFormula b)++")" 
showFormula (I a b) = "("++(showFormula a)++" => "++(showFormula b)++")" 

main :: IO() 
main = do 
    print (showFormula (I (N (Z 'p')) (A (C (Z 'p') (Z 'q')) (Z 'r')))) 
    -- "(~p => ((p & q) | r))" 
+0

我很笨...謝謝你! –