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)
像魅力一样编译.我显然不够熟练,看不出有什么不同......
从你的编辑,你有
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)
但这可能不是你想要的.由于您Segment和AugmentedSegment构造函数除了添加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,不能是其他构造函数.这就是导致你看到错误的原因.
| 归档时间: |
|
| 查看次数: |
103 次 |
| 最近记录: |