Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 不在范围内:数据构造函数_Haskell - Fatal编程技术网

Haskell 不在范围内:数据构造函数

Haskell 不在范围内:数据构造函数,haskell,Haskell,我用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 P

我用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的初学者,非常感谢。

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

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


因此,不要写
Var Char
,而是写
Var name
;编写
imple-Prop-Prop
(或
imple-prop1-prop2
)等,而不是
imple-Prop-Prop

稍加编辑即可:

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 ++ ")"

你好,谢谢你的回答,但我发现了一个问题。在上面的
p1
中,真正的答案是
A&&&A
,而你的答案是
('A'&&&A')
去掉引号是很容易的-将
show
应用到一个字符上会产生一个带引号的字符,但是由于字符串只是一个字符列表,你可以通过将它变成一个单元素列表使字符显示为不带引号的。如果你不想让父母一直在你身边,那么与他们打交道将更具挑战性。当然,他们有时也需要在那里。谢谢你,这很有效,我感谢你的帮助和解释。请不要为此使用
Show
,编写你自己的
Prop->String
函数;它将帮助你走上正轨!