2014-09-11 3 views
1

мне нужна помощь, пытаясь понять, почему эти определенияОпределенный тип данных не определен?

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 

компилирует как шарм. Я, очевидно, не достаточно опытны, чтобы увидеть разницу ...

+0

Какая строка является ошибкой? –

+0

Я тоже этого не вижу - есть что-то отсутствует (часть, которая дает эту ошибку) - кажется, больше не хватает - например, где «SegmentPlus» (или я просто пропустил)? – Carsten

+0

Извините. Я играл с разными версиями вещи. Тем не менее такая же ошибка. Теперь он должен быть полным. Ошибка возникает из строки, где '[AugmentedSegment]', где находится «A». –

ответ

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) 

Проблема конкретно это из второго конструктора SegmentList:

AugmentedSegmentList SegmentlistHeader [AugmentedSegment] 

Здесь вы сказали, что AugmentedSegmentList содержит список AugmentedSegment, но AugmentedSegment является конструктором Segment, это не тип. При определении типа данных он может ссылаться только на другие типы , а не другие конструкторы. Вы можете изменить его на

AugmentedSegmentList SegmentlistHeader [Segment] 

Но это, вероятно, не совсем то, что вы хотите. Так как ваши Segment и AugmentedSegment конструкторов идентичны, кроме добавления Metadata поля, я бы вместо этого рекомендую иметь

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

data AugmentedSegment 
    = AugmentedSegment Segment Metadata 
    deriving (Show) 

Тогда вы можете иметь только список AugmentedSegment с которой насильственной системой типа, но также означает, что вы не можете передать AugmentedSegment функции, которая принимает Segment. Поскольку это, кажется, разные вещи, это не должно быть проблемой. Если это так, вы всегда можете просто передать в поле Segment из AugmentedSegment в функцию, о которой вы говорите, или вы можете изменить свою функцию, чтобы вместо этого принять значение типа Either Segment AugmentedSegment.


В общем, если у вас есть что-то вроде

data MyType = MyConstructor FieldA FieldB FieldC 

MyType символа является именем типа, то MyConstructor символа является конструктором, вы можете думать об этом как функции, которая возвращает что-то типа MyType, а символы FieldN s все должны быть существующими типов или могут рекурсивно ссылаться на MyType, они не могут быть другими конструкторами. Вот что вызвало ошибку, которую вы видите.

+0

Да! Вот и все. Благодаря!! –

Смежные вопросы