5

我写了一个程序,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的初学者,非常感谢。

4

2 回答 2

5

以大写字母开头的值名称是为构造函数保留的,例如Var, True,False等。变量必须以小写字母开头。

此外,您不能对两个不同的变量使用相同的名称。每次使用它们时,Haskell 怎么知道你指的是哪一个?您不能简单地将构造函数的定义用作函数中的模式;您需要为每个字段指定一个单独的名称。

所以,而不是Var Char,写Var name; 而不是Imply Prop Prop,写Imply p q(或Imply prop1 prop2),等等。

于 2012-05-07T02:56:11.287 回答
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 ++ ")"
于 2012-05-07T02:56:38.667 回答