我用haskell
写了一个程序但是我从ghci
这里是源代码,我构建它,如果我有
p1 :: Prop
p1 = And (Var 'A') (Not (Var 'A'))
它会显示A && ~A
,因此这是源代码
import Data.List
import Data.Char
data Prop = Const Bool |
Var Char |
Not Prop |
And Prop Prop |
Or Prop Prop |
Imply Prop Prop
deriving Eq
instance Show Prop where
show (Var Char) = show Char
show (Not Prop) = "(~" ++ show Prop ++ ")"
show (And Prop Prop) = "(" ++ show Prop ++ "&&" ++ show Prop ++ ")"
show (Or Prop Prop) = "(" ++ show Prop "||" ++ show Prop ++ ")"
show (Imply Prop Prop) = "(" ++ show Prop "=>" show Prop ++ ")"
我从ghci得到两个主要错误......
Not in scope: data constructor `Char'
Not in scope: data constructor `Prop'
我是haskell的初学者,非常感谢。
答案 0 :(得分:5)
以大写字母开头的值名称是为构造函数保留的,如Var
,True
,False
等。变量必须以小写字母开头信。
此外,您不能对两个不同的变量使用相同的名称。 Haskell如何知道每次使用它们时你的意思?您不能简单地将构造函数的定义用作函数中的模式;你需要为每个字段指定一个单独的名称。
因此,写Var Char
而不是Var name
;而不是Imply Prop Prop
,请写Imply p q
(或Imply prop1 prop2
),依此类推。
答案 1 :(得分:2)
稍加编辑即可使其正常工作:
instance Show Prop where
show (Var c) = [c]
show (Not p) = "(~" ++ show p ++ ")"
show (And p1 p2) = "(" ++ show p1 ++ " && " ++ show p2 ++ ")"
show (Or p1 p2) = "(" ++ show p1 ++ "||" ++ show p2 ++ ")"
show (Imply p1 p2) = "(" ++ show p1 ++ "=>" ++ show p2 ++ ")"