我正在處理一些奇怪的問題。我想寫一個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函數,但我不知道如何改變它。請給我一些建議如何解決這個問題。
您可能還喜歡[此問題的目標非常相似](http://stackoverflow.com/q/20406722/791604)。 –
請注意,順便提一下,如果中綴構造函數以':'開頭,那麼您可以使用'Formula:&:Formula','Formula:| Formula'和'Formula:=> Formula 'C','A'和'I'。 (也可能需要固定聲明 - 也許是'infixr 3:&&:','infixr 2:|:','infixr 4:=>'。) –
謝謝@AntalS-Z,這很方便,但C ,A和I是必需的,因爲是由其他程序生成的。 –