[英]Logic formula printing in Haskell
我正在處理一些奇怪的問題。 我想編寫一個Haskell程序,它將打印給定的邏輯公式,即
print (showFormula (I (N (Z 'p')) (A (C (Z 'p') (Z 'q')) (Z 'r'))))
(我的意思是,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'))
如(C (Z 'a') (Z 'b'))
並且它與某些擴展公式崩潰時。 我知道問題是將一個Formula參數而不是String傳遞給showFormula函數,但我不知道如何更改它。 請給我一些建議如何解決這個問題。
如果使用-Wall
標志編譯代碼,它將顯示以下警告:
fml.hs:4:1: Warning:
Pattern match(es) are non-exhaustive
In an equation for `showFormula': Patterns not matched: V _
你忘了為showFormula
編寫V
case,所以如果它達到那個就會崩潰,類似於如果用空列表調用head
函數崩潰的話。
看起來你錯過了模式匹配中的(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))"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.