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から2つの主なエラーが発生しました...

Not in scope: data constructor `Char'
Not in scope: data constructor `Prop'

Haskell初心者です、よろしくお願いします。

4

2 に答える 2

5

大文字で始まる値の名前は、、、などのコンストラクター用に予約されています。変数は小文字で始まる必要があります。VarTrueFalse

さらに、2つの異なる変数に同じ名前を使用することはできません。Haskellは、それらを使用するたびに、どの意味を意味するのかをどのようにして知るのでしょうか?コンストラクターの定義を関数のパターンとして単純に使用することはできません。各フィールドに個別の名前を付ける必要があります。

したがって、の代わりに、 ;Var Charと記述します。Var nameの代わりに、 (または)などImply Prop Propを記述します。Imply p qImply 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 に答える