Если Hask является категорией всех типов haskell (с функциями в виде стрелок), то можно ли рассматривать ob(Hask)
(то есть коллекцию объектов Hask) как равную *
?
Если нет, то в каком смысле это неправильно?
Если Hask является категорией всех типов haskell (с функциями в виде стрелок), то можно ли рассматривать ob(Hask)
(то есть коллекцию объектов Hask) как равную *
?
Если нет, то в каком смысле это неправильно?
На этом этапе должно быть какое-то клише, чтобы каждый раз ссылаться на статью Hask на вики-странице Haskell. поднимается вопрос о Hask, но вот он.
Чтобы немного расширить вики, я думаю, что ответ на этот вопрос очень скучный: да, но только потому, что Hask определен так, что объекты Hask являются своего рода типами ⭑. Полное определение:
Пусть каждый тип вида ⭑ будет объектом Hask, кроме undefined
. Я думаю, что «Да», по сути, является ответом на ваш вопрос, пока адвокат дьявола не поднимет undefined
и seq
, после чего ответ обязательно становится все более и более сложным.
Пусть каждая функция типа A -> B
будет стрелкой от объекта, соответствующего типу A
, к объекту, соответствующему типу B
.
Очень тщательно выберите для стрелок понятие равенства, которые могут существовать или не существовать (см. последующее обсуждение) а может выбросить seq
а может вообще отказаться.
Пусть стрелка, соответствующая id :: A -> A
, будет стрелкой идентификации для каждого объекта.
Пусть .
, который является ассоциативным и т. Д., Соответствует композиции стрелок, которые должны быть ассоциативными и т. Д.
Это ни в коем случае не единственная категория, с помощью которой вы можете моделировать программы Haskell, но мы делаем это и благословляем ее именем Hask, потому что многие другие понятия естественно соответствуют вычислениям Haskell. Например, эндофунктор в этой категории будет удобно представлен чем-то вроде ⭑ -> ⭑ с (законной) функцией, принимающей fmap :: ((a :: ⭑) -> (b :: ⭑)) -> ((f a :: ⭑) -> (f b :: ⭑))
.
Да, но есть типы, отличные от *
в Haskell с DataKinds
, которые не будут частью вашей категории Hask.
{-# LANGUAGE DataKinds #-}
data Foo = Bar
'Bar
имеет тип Foo
, поэтому вы не можете использовать с ним ->
, поэтому он будет вне вашего Hask, но по-прежнему относится к типу Haskell.