Как я прочитал несколько разделов, в History of Haskell, я наткнулся на:Какие типы проблем помогают «более высокоподобному полиморфизму» решить лучше?
Однако более-kinded полиморфизм имеет независимую утилиту: это вполне возможно, и иногда очень полезно, чтобы объявить типы данных параметризованных более высоких видов, такие как:
data ListFunctor f a = Nil | Cons a (f a)
Зная «основные» АТД я был немного озадачен здесь, моим «угадать», что часть в круглых скобках предлагает «параметрический»/«динамический» унарного конструктор данныхf
? Итак, любой конструктор данных типа * -> *
, который может «принять» тип a
? Я считаю, что правильно, или я неправильно интерпретирую синтаксис? Я знаю, что я «просто догадываюсь», но я надеюсь получить интуицию «программист-программист» по этой возможности здесь, какой-то примерный сценарий (или пользующийся огромным преимуществом);) в основном я могу себе представить (просто не в чем точный способ), что позволяет больше гибкости в тех «небольших встроенных универсальных рекурсивных конфигурационных языках» -ADT, которые Haskell делает с таким удовольствием, чтобы сформулировать и написать evals
для .. закрыть?
В GHCi, :i ListFunctor
на вышесказанном дает:
type role ListFunctor representational nominal
data ListFunctor (f :: * -> *) a = Nil | Cons a (f a)
Так что, похоже, что «вывод» из более четких data
декларации.
Отличное объяснение и приятный «реальный» сценарий, чтобы понять потенциал этой емкости --- очень благодарен @chi! – metaleap