Можно ли рассматривать вид `*` как `ob (Hask)`?

Если Hask является категорией всех типов haskell (с функциями в виде стрелок), то можно ли рассматривать ob(Hask) (то есть коллекцию объектов Hask) как равную *?

Если нет, то в каком смысле это неправильно?


person George    schedule 22.05.2017    source источник


Ответы (2)


На этом этапе должно быть какое-то клише, чтобы каждый раз ссылаться на статью 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 :: ⭑)).

person hao    schedule 28.05.2017

Да, но есть типы, отличные от * в Haskell с DataKinds, которые не будут частью вашей категории Hask.

{-# LANGUAGE DataKinds #-}
data Foo = Bar

'Bar имеет тип Foo, поэтому вы не можете использовать с ним ->, поэтому он будет вне вашего Hask, но по-прежнему относится к типу Haskell.

person Lazersmoke    schedule 22.05.2017