Ошибка типа type при создании экземпляра класса типов Functor - PullRequest
0 голосов
/ 22 ноября 2018

Я пытаюсь реализовать Functor экземпляр класса типов для очень тривиального типа Foo:

data Foo a = Foo a

instance functorFoo :: Functor (Foo a) where
  map fn (Foo a) = Foo (fn a)

Purescript выдает мне не очень полезное сообщение об ошибке:

Could not match kind

    Type -> Type

with kind

    Type

Что это значит?Я еще не очень знаком с системой Добрых.

Ответы [ 2 ]

0 голосов
/ 23 ноября 2018

Но я все же хотел бы выяснить, почему не работает первая версия.Например, чем отличается класс типов Functor, например, от полугруппы, где первая версия работала просто отлично.

Давайте рассмотрим определение класса Functor:

class Functor f where
  map :: forall a b. (a -> b) -> f a -> f b

Itсодержит f a и f b типов в сигнатуре типа map, которая ясно указывает, что f имеет тип Type -> Type (он "несет" другой тип).С другой стороны, Semigroup явно относится к простым типам типа Type:

class Semigroup a where
  append :: a -> a -> a

Итак, Semigroup - это класс, который можно определить для простых типов, таких как String, Int,List a, Map k v или даже функция a -> b (которая также может быть записана как (->) a b), но не конструкторы типов, для которых требуется другой тип, например List Map k (->) a (я должен использовать эту записьздесь).

С другой стороны, классу Functor требуются конструкторы типов, поэтому вы можете иметь такие экземпляры, как Functor List, Functor (Map k) или Functor ((->) a).

0 голосов
/ 22 ноября 2018

Я нашел решение.Вместо того, чтобы определять это как:

instance functorFoo :: Functor (Foo a) where

Мне нужно определить это как:

instance functorFoo :: Functor Foo where

Но я все же хотел бы выяснить, почему не работает первая версия.Например, чем отличается класс типов Functor, например, от полугруппы, где первая версия работала просто отлично.

...