Вот список имеет вид
data List a = Nil | Cons a (List a)
т.е.
F(x) = 1 + x * F(x)
а значит
F(x) - x * F(x) = 1
(1-x) * F(x) = 1
F(x) = 1 / (1-x)
и действительно, если мы такую функцию разложим в ряд, то получим
F(x) = 1 + x + x*x + x*x*x + x*x*x*x + ...
т.е. как раз тип описывает списки из х разной длины.
Но вот что любопытно,
F(F(F(x))) = 1 / (1 - (1 / (1 - 1
(
Read more... )
Comments 13
Не равно, а изоморфно ;-)
Reply
Reply
Reply
Reply
Reply
Алгебра типов - не группа и не кольцо. Более того, Nil не является нейтральным элементом ни по сложению, ни по умножению.
Поэтому заменить его на 1 - это слишком смело.
1*1*1 = 1, nil*nil*nil ≠ nil. (список из двух пустых списков и терминатора).
Вот эта ситуация, когда nil может быть самостоятельным значением, а может терминатором, портит малину.
Иначе, если мы говорим, что квадратные скобки раскрываются так же, как круглые, то конечно, в расплющенном списке форма равна содержанию.
Reply
1 это довольно стандартное обозначение терминального объекта категории, и все типы с единственным значением принято обозначать 1, они все друг другу изоморфны. У типа 1*1*1 (тупл из трех юнитов) тоже единственное значение, и потому тип 1*1*1 изоморфен 1, т.е. 1*1*1=1. Про значение списка из трех элементов мы тут не говорим, мы говорим про типы.
Вот что это не группа и не кольцо, это да. Нормального вычитания и деления там нет, и когда какие-то результаты таких преобразований дают осмысленные предсказания, это самое удивительное.
Квадратными скобками у меня как в хаскеле и еще ряде языков обозначен тип списка, т.е. [А] это список из элементов типа А, а [[[A]]] это трижды вложенный список из А.
Reply
Не, секунду! N-мерные векторы или кортежи таки имеют нейтральное значение, но список - это нечто не фиксированного размера, [[],[],[]] не изоморфен [[]].
Ну и nil - это так себе единичка. А если у нас два терминальных объекта:
List a = Foo | Bar | Cons a (List a)
тогда что? 1+1+x*f(x) ?
Reply
Да, "List a = Foo | Bar | Cons a (List a)" это 1+1+x*f(x).
Тот же Bool = True | False известен как 2 = 1+1.
Reply
Кажется, что между типами и многочленами / рациональными функциями существует не изоморфизм, а гомоморфизм (эпиморфизм?). И образ [[[a]]] под действием этого гомоморфизма совпадает с образом a. То есть [[[a]]] и a принадлежат к одному классу (т.е. имеют какие-то общие свойства, но какие - х.з.)
Ну а то, что с обычными списками так красиво получается - "просто повезло".
Reply
Leave a comment