Можно чувак задвинул :) А почему несмотря на дублирование в System F в GHC используется именно она? Лямбда куб делает компиляцию труднее/дольше? И ещё дурацкий вопрос - а почему в кайндах (как кстати по-русски?) звёздочка используется, откуда термин? Насколько я уяснил эт что-то типа "типа типов"? А что тогда за странные записи я видел типа *->*, одинаковые кайнды различать нам не надо?
Я сам пост внимательно не успел прочитать. Но в других системах есть свои подводные камни, да и потом язык вышел бы не Хаскелл, а совсем другой.
Про кайнды (я их, вроде, перевёл как "виды" в gentile intro). Это арность конструкторов типов (не данных!) - то есть кол-во типовых параметров, которые мы передаём в тип:
data Int -- kind *
data List a -- kind * -> *
data Either a b -- kind * -> * -> *
Ну и, скажем, class Monad m требует, чтобы тип m имел kind * -> *.
О как... Значит я чтот недопонял, спасибо :) А есть что-то когда в этих видах один из аргумента конструктора будет зависеть от другого? Или это ересь и тогда надо делать 1 аргумент конструктора? (просто тут на яве есть на генериках есть в коде одно решение, где есть тип ИД компонента и тип самого компонента, а контейнер этих компонентов имеет параметром оба предыдущих типа, ну и ясное дело что они должны соответствовать друг другу) А KArrow получается такой "стрелкой из стрелок в стрелки"? Или -> в видах это ни разу не стрелки? Как-то пока с натягиванием ТК на хаскель у меня не совсем хорошо :)
Я похоже тебя запутал - убегал утром и спешил ответить.
Kinds - это действительно типы над типами. Просто конструкторы типов - штука очень простая - это то, что стоит слева в определении типа и имеет вид:
data Имя_типа полиморфный_типовый_парам1 ... полиморфный_типовый_парамN = ...
например:
data List a = Nil | Cons a (List a)
data Either a b = Left a | Right b
Все зависимости, задающие алгебраическую структуру типа (конструкторы данных) находятся справа от равенства. Так что kindы напрямую программисту не нужны (кое-где в GADT полезно их указывать). Они элементарно выводятся тайпчекером.
И стрелки в * -> * -> * - это не стрелки функций над данными, а стрелки функций над типами. То есть
Prelude> :kind Either
Either :: * -> * -> *
означает, что, чтобы получить замкнутый тип Either, мы должны передать туда 2 типовых параметра:
Prelude> :kind Either Int
Either Int :: * -> *
Prelude> :kind Either Int Bool
Either Int Bool :: *
Только вот одного не пойму - почему там есть лишь один исходный тип типов звёздочка? Примера вида подобного (чтоб были зависимости между входными и выходными типами) правда я чтот привести не могу.
no subject
Date: 2007-12-27 07:13 am (UTC)А почему несмотря на дублирование в System F в GHC используется именно она?
Лямбда куб делает компиляцию труднее/дольше?
И ещё дурацкий вопрос - а почему в кайндах (как кстати по-русски?) звёздочка используется, откуда термин? Насколько я уяснил эт что-то типа "типа типов"? А что тогда за странные записи я видел типа *->*, одинаковые кайнды различать нам не надо?
no subject
Date: 2007-12-27 07:26 am (UTC)Про кайнды (я их, вроде, перевёл как "виды" в gentile intro).
Это арность конструкторов типов (не данных!) - то есть кол-во типовых параметров, которые мы передаём в тип:
Ну и, скажем, class Monad m требует, чтобы тип m имел kind * -> *.
no subject
Date: 2007-12-27 07:40 am (UTC)Значит я чтот недопонял, спасибо :)
А есть что-то когда в этих видах один из аргумента конструктора будет зависеть от другого? Или это ересь и тогда надо делать 1 аргумент конструктора?
(просто тут на яве есть на генериках есть в коде одно решение, где есть тип ИД компонента и тип самого компонента, а контейнер этих компонентов имеет параметром оба предыдущих типа, ну и ясное дело что они должны соответствовать друг другу)
А KArrow получается такой "стрелкой из стрелок в стрелки"?
Или -> в видах это ни разу не стрелки?
Как-то пока с натягиванием ТК на хаскель у меня не совсем хорошо :)
no subject
Date: 2007-12-27 06:37 pm (UTC)Kinds - это действительно типы над типами. Просто конструкторы типов - штука очень простая - это то, что стоит слева в определении типа и имеет вид:
например:
Все зависимости, задающие алгебраическую структуру типа (конструкторы данных) находятся справа от равенства. Так что kindы напрямую программисту не нужны (кое-где в GADT полезно их указывать). Они элементарно выводятся тайпчекером.
И стрелки в * -> * -> * - это не стрелки функций над данными, а стрелки функций над типами. То есть
означает, что, чтобы получить замкнутый тип Either, мы должны передать туда 2 типовых параметра:
no subject
Date: 2007-12-27 09:22 pm (UTC)Примера вида подобного (чтоб были зависимости между входными и выходными типами) правда я чтот привести не могу.
no subject
Date: 2007-12-27 10:26 pm (UTC)не выйдет. То есть звёздочки достаточно.
Правда для GADT при явной кайндизации можно наворотить что-нибудь типа
но выше группировок * всё равно не прыгнешь
no subject
Date: 2007-12-27 10:30 pm (UTC)