Яке припущення, зроблене в "Learn You a Haskell" при виведенні виду?


18

Це питання не є суб'єктивним. Дуже специфічне дієслово використовується в посилальній книзі, і я хотів би зрозуміти, що означає це словосполучення, бо я боюся, що я щось нерозумію.

У розділі Learn You a Haskell наступний параграф - третій і останній, який містить "ми припускаємо *".

data Barry t k p = Barry { yabba :: p, dabba :: t k }  

А тепер ми хочемо зробити це екземпляром Functor. Functorхоче типів, * -> *але Barryне схожий на це. Що таке вид Barry? Що ж, ми бачимо, що він має три типи параметрів, так що це буде something -> something -> something -> *. Можна з упевненістю сказати, що pце конкретний тип і, таким чином, має свого роду *. Бо kми, припустимо, *і так подовжуючи, tмає свого роду* -> * . Тепер давайте просто замінимо ці види на ті something, які ми використовували в якості заповнювачів, і ми бачимо, що вони мають такий тип (* -> *) -> * -> * -> *.

Чому ми взагалі щось припускаємо? Читаючи "ми припускаємо, що X (тобто ми припускаємо, що X є істинним)", мені природно думати, що ми також повинні розглядати випадок, що X є помилковим. У конкретному випадку прикладу, чи не могли tбути добрі (* -> *) -> *та kдобрі (* -> *)? Якби це було так, то все , що tі на kсамому справі були, по- t k, як і раніше буде тип бетону, немає?

Я бачу, що весь рядок міркувань потім перевіряється на компілятор, але я не думаю, що компілятор передбачає . Якщо це так, я хотів би знати, що, якщо цього не стане, я знову боюся, що я пропускаю значення параграфа.


4
Ви праві. Дійсно, ми можемо мати k :: Lбудь-який вид L, поки t :: L -> *. Однак компілятор повинен вибрати якийсь конкретний Lабо вдатися до полікінду. Полікінд був би найбільш загальним варіантом, але тут GHC вибирає L = *(базовий Haskell не має полікінди, вони повинні бути включені як розширення). Оскільки він обирає щось, що є досить довільним, LYAH використовує слово "припустити" (AFAICT).
чи

1
Гаразд, можливо, компілятор припускає, що мене спантеличить принаймні менше, ніж ми припускаємо , або зовсім не буде.
Енріко Марія Де Анджеліс

Відповіді:


19

Насправді компілятор припускає! Але ви можете попросити це не з розширенням PolyKinds. Детальніше про це ви можете прочитати тут . Якщо це розширення увімкнено, такий тип Barryбуде forall k. (k -> *) -> k -> * -> *.


-1

Гарна думка. Автор робить непотрібне припущення. Можливо, просто для того, щоб було легше зрозуміти його розділ Type Foo, але такі люди, як ти, можуть по праву поставити під сумнів це.

Обидва t, kі pє змінними типу. Як ми бачимо з yabba :: pцього, він може жити поодинці, так що це як постійна функція, ніби це значення, а не тип, це буде підпис типу типу, Intабо Char, як би там не було .... Але оскільки це тип, то це добрий підпис *.

Однак tтип тут приймає змінну типу kдля побудови типу ( dabba :: t k), тому ми впевнені, що (тут немає припущення) tмає такий собі підпис, як * -> *і kмає* .

Після того, як ми знаємо , що це ... типу Barry t k pвид підпису «сек це (* -> *) -> * -> * -> *що означає , що потрібно tтоді , kа потім pі дають нам Barryтипу.

Редагувати Не забудьте прочитати коментар @ luqui нижче.


7
kне обмежується таким, *як ви стверджуєте, це при виведенні t. Ми могли б k :: * -> *і t :: (* -> *) -> *, наприклад. Додайте поле doo :: k Intдо запису, і воно пройде без проблем.
luqui

@luqui .. Так, ти маєш рацію ... Я не видалю цю відповідь, оскільки ваш коментар дійсно вартий позиції.
Redu
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.