Зачем определять экземпляр функтора для безымянного типа, такого как `(->) e` - PullRequest
4 голосов
/ 02 августа 2020

In Haskell GH C base содержит определения экземпляра Functor для типа (->) r:

instance Functor ((->) r) where
    fmap = (.)

Typeclassopedia объясняет ((->) e) - это тип функций, которые принимают значение типа e в качестве параметра. Это имеет смысл, но я не понимаю, как (->) e используется позже, по сравнению с Maybe, Either a, даже [].

Я думаю, что понимаю эти определения функторов, которые называются: Maybe, Either a, но мне трудно понять, как используется «безымянный» тип (->) r.

Означает ли это, что мне нужно подозревать любой другой a -> в каждой сигнатуре типа как функтор? Это способ определения свойств стрелки -> в Haskell?

Также это та же стрелка, что и в сигнатурах типа, или стрелка из лямбда-функций? Я попытался найти в отчете Haskell, но там -> используется в собственной нотации для документации, так что здесь не повезло.

Заранее благодарим за любые подсказки, которые могут помочь сломать лед вокруг (->) r .

Обновление: основываясь на комментариях, я думаю, мне следует спросить, где определен конструктор типа ->? это встроенный?

Ответ: -> встроено, и это «стрелка функции» или «конструктор функционального типа» .

1 Ответ

4 голосов
/ 02 августа 2020

(->) r, это не безымянный тип, его имя (->), точно так же, как Either это имя. Фактически, если вы напишите a -> b, вы написали (->) a b. Или, если вы напишете a -> b -> c, то каноническая форма будет (->) a ((->) b c).

(->) - это конструктор типа, как и Maybe, Either, et c. Тот факт, что он используется как инфиксный оператор , не так уж странен. Если вы напишете, например, x : xs, то каноническая форма будет (:) x xs (или, что более подробно, ((:) x) xs). Если вы включите расширение TypeOperators, вы даже сможете писать такие типы, как Left 1 :: Int `Either` String.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...