Haskell数据类型

2 haskell types

假设我有一个这样的类型(有效):

data WAE = Num Float
         | Id String
         | With [(String, WAE)] WAE -- This works, but I want to define it as below
         deriving(Eq, Read, Show)
Run Code Online (Sandbox Code Playgroud)

我想要一个这样的类型(不起作用):

data WAE = Num Float
         | Id String
         | With [(Id, WAE)] WAE -- This doesn't work ("Id not in scope")
         deriving(Eq, Read, Show)
Run Code Online (Sandbox Code Playgroud)

为什么我不能在Haskell中这样做?任何想法达到类似的效果?

ham*_*mar 5

在Haskell中,有两个不同的命名空间.一个用于值,一个用于类型.数据构造函数(例如,Id存在于值命名空间中),而类型构造函数(例如String类)以及类存在于类型命名空间中.这没关系,因为没有允许两者的上下文.

在数据类型的定义中,两个名称空间并存,因为您在引用现有类型构造函数时定义了新类型构造函数和几个新数据构造函数.

data WAE = Num Float
         | Id String
         | With [(String, WAE)] WAE
         deriving(Eq, Read, Show)
Run Code Online (Sandbox Code Playgroud)

这里WAE,Float,String,(,),[],Eq,ReadShow在类型世界上所有的名称,而Num,IdWith在价值世界的名字.混合它们没有任何意义,这就是为什么Id不在你的第二段代码中的范围,因为你在类型上下文中,并且没有调用类型级别的东西Id.

你的问题并不是100%清楚你想要做什么,但我怀疑它可能是这样的:

type Id = String   -- Or perhaps a newtype
data WAE = Num Float
         | Id Id
         | With [(Id, WAE)] WAE
         deriving(Eq, Read, Show)
Run Code Online (Sandbox Code Playgroud)

请注意,因为名称空间是不同的,所以Id在两者中调用某些内容完全没问题.