2016-07-17 5 views
2

В исходном коде для Data.FixedList, я нашел следующее определение:Что такое `Cons` в исходном коде Data.FixedList?

data FixedList f => 
    Cons f a = (:.) { 
    head :: a, 
    tail :: (f a) 
    } deriving (Eq, Ord) 

Как кто-то очень новое для Haskell, это трудно понять, что происходит здесь. Я понимаю синтаксис, такой как data TypeName = TypeName { a :: Int, b :: Int} deriving (Show) или data TypeName = TypeA | TypeB, но код выше над моей головой. Любая документация или прохождение было бы очень оценено!

ответ

7

Прежде всего FixedList f => применяет ограничение, которое f является FixedList при использовании конструктора. Я не уверен, почему он здесь используется. Обычно это advised against.

В Haskell вы можете создавать инфиксные конструкторы данных с символами, начинающимися с :. В библиотеке конструктор помещается в скобки (:.), поэтому его можно использовать с синтаксисом записи. Без синтаксиса записи это будет выглядеть так:

data Cons f a = a :. f a 

Соответствие шаблону очень похоже на списки. Вот простая функция:

mapHead :: FixedList f => (a -> a) -> Cons f a -> Cons f a 
mapHead f (a :. as) = f a :. as 

Вот определение без использования инфиксного конструктора.

data Cons f a = Cons 
    { head :: a 
    , tail :: f a 
    } 
4

Это в основном причудливое форматирование вещей, которые вы видели раньше.

data FixedList f => Cons f a = (:.) { head :: a 
            , tail :: (f a) 
            } deriving (Eq, Ord) 

FixedList f просто класс типов ограничение на Cons f a типа данных. (:.) - конструктор данных инфикса.

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