Haskell 定义的数据类型是否未定义?
我需要一些帮助来理解这些定义的原因Haskell 定义的数据类型是否未定义?,haskell,custom-data-type,Haskell,Custom Data Type,我需要一些帮助来理解这些定义的原因 data SegmentList = SegmentList SegmentlistHeader [Segment] | AugmentedSegmentList SegmentlistHeader [AugmentedSegment] deriving (Show) data SegmentlistHeader = SegmentlistHeader DatabaseName Query LabelType TimeStam
data SegmentList
= SegmentList SegmentlistHeader [Segment]
| AugmentedSegmentList SegmentlistHeader [AugmentedSegment]
deriving (Show)
data SegmentlistHeader
= SegmentlistHeader DatabaseName Query LabelType TimeStamp
deriving (Show)
data Segment
= Segment SegmentLabel SegmentStart SegmentEnd Session Checksum
| AugmentedSegment SegmentLabel SegmentStart SegmentEnd Session Checksum Metadata
deriving (Show)
type DatabaseName = String
type SegmentLabel = String
type SegmentStart = Double
type SegmentEnd = Double
type Session = String
type LabelType = String
type Query = String
type TimeStamp = String
type Checksum = String
type Metadata = [(String, String)]
导致此错误消息:
Not in scope: type constructor or class `AugmentedSegment'
A data constructor of that name is in scope; did you mean -XDataKinds?
而这:
data UmeQueryPart
= LabelInLabelType String [String] String
| LabelType String
| UmeQueryDominance UmeQueryPart UmeQueryPart String
| UmeQuerySequence UmeQueryPart UmeQueryPart String
| UmeQueryIntersect [UmeQueryPart]
| UmeQueryUnion [UmeQueryPart]
deriving Show
编译得像个符咒。很明显,我没有足够的技能来了解差异…从您的编辑中,您已经
data SegmentList
= SegmentList SegmentlistHeader [Segment]
| AugmentedSegmentList SegmentlistHeader [AugmentedSegment]
deriving (Show)
data Segment
= Segment SegmentLabel SegmentStart SegmentEnd Session Checksum
| AugmentedSegment SegmentLabel SegmentStart SegmentEnd Session Checksum Metadata
deriving (Show)
问题具体来自段列表的第二个构造函数:
AugmentedSegmentList SegmentlistHeader [AugmentedSegment]
这里您已经说过,AugmentedSegmentList
包含AugmentedSegment
的列表,但是AugmentedSegment
是段的构造函数,它不是一种类型。定义数据类型时,它只能引用其他类型,不能引用其他构造函数。你可以把它改成
AugmentedSegmentList SegmentlistHeader [Segment]
但这可能不是你想要的。由于除了添加元数据
字段外,您的段
和增强段
构造函数是相同的,因此我建议使用
data Segment
= Segment SegmentLabel SegmentStart SegmentEnd Session Checksum
deriving (Show)
data AugmentedSegment
= AugmentedSegment Segment Metadata
deriving (Show)
然后,您可以只拥有由类型系统强制执行的AugmentedSegment
s列表,但这也意味着您不能将AugmentedSegment
传递给接受段的函数。因为这些看起来是不同的东西,所以这不应该是一个问题。如果是,则始终可以将包含的段
字段从AugmentedSegment
传递到您所关心的函数中,或者您可以更改函数以接受类型为的值,而不是segmentedsegment
总之,当你有
data MyType = MyConstructor FieldA FieldB FieldC
MyType
符号是类型的名称,MyConstructor
符号是一个构造函数,您可以将其视为返回类型为MyType
的函数,字段n
s符号都必须是现有类型,或者可以递归引用MyType
,它们不能是其他构造函数。这就是您看到的错误的原因。从您的编辑中,您已经
data SegmentList
= SegmentList SegmentlistHeader [Segment]
| AugmentedSegmentList SegmentlistHeader [AugmentedSegment]
deriving (Show)
data Segment
= Segment SegmentLabel SegmentStart SegmentEnd Session Checksum
| AugmentedSegment SegmentLabel SegmentStart SegmentEnd Session Checksum Metadata
deriving (Show)
问题具体来自段列表的第二个构造函数:
AugmentedSegmentList SegmentlistHeader [AugmentedSegment]
这里您已经说过,AugmentedSegmentList
包含AugmentedSegment
的列表,但是AugmentedSegment
是段的构造函数,它不是一种类型。定义数据类型时,它只能引用其他类型,不能引用其他构造函数。你可以把它改成
AugmentedSegmentList SegmentlistHeader [Segment]
但这可能不是你想要的。由于除了添加元数据
字段外,您的段
和增强段
构造函数是相同的,因此我建议使用
data Segment
= Segment SegmentLabel SegmentStart SegmentEnd Session Checksum
deriving (Show)
data AugmentedSegment
= AugmentedSegment Segment Metadata
deriving (Show)
然后,您可以只拥有由类型系统强制执行的AugmentedSegment
s列表,但这也意味着您不能将AugmentedSegment
传递给接受段的函数。因为这些看起来是不同的东西,所以这不应该是一个问题。如果是,则始终可以将包含的段
字段从AugmentedSegment
传递到您所关心的函数中,或者您可以更改函数以接受类型为的值,而不是segmentedsegment
总之,当你有
data MyType = MyConstructor FieldA FieldB FieldC
MyType
符号是类型的名称,MyConstructor
符号是一个构造函数,您可以将其视为返回类型为MyType
的函数,字段n
s符号都必须是现有类型,或者可以递归引用MyType
,它们不能是其他构造函数。这就是导致您看到的错误的原因。错误来自哪一行?我也看不到它-是否缺少某些内容(产生此错误的部分)-似乎缺少更多内容-例如,SegmentPlus
(或者我只是缺少了它)?对此表示抱歉。我在玩不同版本的东西。不过还是一样的错误。现在应该完成了。错误来自[AugmentedSegment]
的那一行,即“A”的位置。错误来自哪一行?我也看不到它-是否缺少某些内容(产生此错误的部分)-似乎缺少更多内容-例如,SegmentPlus
的位置(或者我只是错过了它)?对此表示抱歉。我在玩不同版本的东西。不过还是一样的错误。现在应该完成了。错误来自[AugmentedSegment]
行,即“A”所在的位置。是的!就这样。谢谢对就这样。谢谢