首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不在作用域中:数据构造函数

不在作用域中:数据构造函数
EN

Stack Overflow用户
提问于 2012-05-07 10:36:51
回答 2查看 8K关注 0票数 5

我用haskell写了一个程序,但是从ghci那里得到了错误。

这是源代码,我构建了它,如果我有

代码语言:javascript
复制
p1 :: Prop
p1 = And (Var 'A') (Not (Var 'A'))

它将显示A && ~A,这就是源代码

代码语言:javascript
复制
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得到了两个主要的错误...

代码语言:javascript
复制
Not in scope: data constructor `Char'
Not in scope: data constructor `Prop'

我是haskell的初学者,非常感谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-05-07 10:56:11

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

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

因此,编写Var name;而不是Imply Prop Prop,编写Imply p q (或Imply prop1 prop2),以此类推。

票数 5
EN

Stack Overflow用户

发布于 2012-05-07 10:56:39

稍微修改一下就能让它正常工作:

代码语言:javascript
复制
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 ++ ")"
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10476050

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档