定义的数据类型未定义?

Fre*_*son 1 haskell custom-data-type

我需要一些帮助,试图理解为什么这些定义

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)]
Run Code Online (Sandbox Code Playgroud)

导致此错误消息:

Not in scope: type constructor or class `AugmentedSegment'
A data constructor of that name is in scope; did you mean -XDataKinds?
Run Code Online (Sandbox Code Playgroud)

而这个:

data UmeQueryPart
    = LabelInLabelType String [String] String
    | LabelType String
    | UmeQueryDominance UmeQueryPart UmeQueryPart String
    | UmeQuerySequence UmeQueryPart UmeQueryPart String
    | UmeQueryIntersect [UmeQueryPart]
    | UmeQueryUnion [UmeQueryPart]
    deriving Show
Run Code Online (Sandbox Code Playgroud)

像魅力一样编译.我显然不够熟练,看不出有什么不同......

bhe*_*ilr 6

从你的编辑,你有

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)
Run Code Online (Sandbox Code Playgroud)

问题具体来自第二个构造函数SegmentList:

AugmentedSegmentList SegmentlistHeader [AugmentedSegment]
Run Code Online (Sandbox Code Playgroud)

在这里你说过AugmentedSegmentList包含一个列表AugmentedSegment,但是它AugmentedSegment是一个构造函数Segment,它不是一个类型.定义数据类型时,它只能引用其他类型,而不能引用其他构造函数.你可以改成它

AugmentedSegmentList SegmentlistHeader [Segment]
Run Code Online (Sandbox Code Playgroud)

但这可能不是你想要的.由于您SegmentAugmentedSegment构造函数除了添加Metadata字段之外是相同的,因此我建议使用

data Segment
    = Segment SegmentLabel SegmentStart SegmentEnd Session Checksum
    deriving (Show)

data AugmentedSegment
    = AugmentedSegment Segment Metadata
    deriving (Show)
Run Code Online (Sandbox Code Playgroud)

然后你可以得到一个仅AugmentedSegment由类型系统强制执行的列表,但它也意味着你不能传入一个AugmentedSegment接受一个的函数Segment.由于这些似乎是不同的东西,这应该不是问题.如果是,您可以随时将包含的Segment字段从一个AugmentedSegment您所关注的函数传入,或者您可以改变您的函数以接受类型的值Either Segment AugmentedSegment.


总而言之,当你有类似的东西时

data MyType = MyConstructor FieldA FieldB FieldC
Run Code Online (Sandbox Code Playgroud)

MyType标志是类型的名称,MyConstructor符号是一个构造函数,你可以把它作为一个返回类型的东西的功能MyType,以及FieldNS个符号都必须是现有的类型,也可以递归参考MyType,不能是其他构造函数.这就是导致你看到错误的原因.