Изменения

Перейти к: навигация, поиск

Функциональное программирование

5210 байт добавлено, 12:13, 26 апреля 2015
Кр2: добавлен разбор кр2
* [https://pp.vk.me/c625826/v625826822/9174/QRhQIqwNX5Q.jpg]
Разбор будет по фоткам 3, 4 и , 5 (остальные задания аналогичны):
== N1. Порядок редуцирования ==
Лего проверить, что fst (pair a b) = a, подставив и сделав редукции.
 
== E1. Превратить let-биндинги в один большой лямбда-терм. ==
 
Конструкция
 
'''let''' x = z '''in''' y
 
превращается в
 
(\x . y) z
 
А пример просто превратится в
 
(\foo. [main]) [foo]
 
где [foo] {{---}} тело foo, [main] {{---}} тело main.
 
== E2. let-биндинги но с возможной взаимной рекурсией ==
 
):
 
== N2. Раскрыть, как в E1 и нормализовать ==
 
В общем, в задании всё сказано. Надо превратить в один большой терм как в E1, а затем нормализовать, как в задании из первой кр.
 
== S1. Расписать систему уравнений типов ==
 
Как в первой кр.
 
== TP1. Убрать сокращения и расставить скобки ==
 
Именно это и требуется сделать. Разве что там вместо тела абстракции расписан её тип. А (->) в типе в отличие от аппликации правоассоциативна, то есть в
 
a -> b -> c
 
скобки ставятся следующим образом:
 
a -> (b -> c)
 
Итого:
* дано: (\ a b . b -> b -> a) x
* получается: (\ a . (\ b . b -> (b -> a))) x // вроде бы тут как раз весь тип внутри не надо заключать в скобки
 
== TF1. Составить терм по типу ==
 
Тут надо пользоваться логикой. Вроде бы во всех примерах можно решить методом пристального взгляда. Мотивация: чтобы решение системы уравнений типов совпадало с полученным типом. Но в некоторых случаях довольно трудно (или даже невозможно) придумать терм по типу, например здесь не придумывается:
 
(a -> b) -> b -> a
 
=== Решение ===
 
Дано: forall a b c . (b -> c -> a) -> (c -> b) -> c -> a
 
Ответ: \f g c . f (g c) c
 
== A1. Закодировать типы по Чёрчу (без взаимной рекурсии) ==
 
<code>
'''data''' Doctor a = Minute a | Maybe a a a
'''data''' Hour a b = Hour (Hour b b) (Doctor a) (Doctor b) | Roll b (Doctor a)
</code>
 
=== Решение ===
У каждого типа есть <tex> N \geqslant 1</tex> конструктов, а у каждого конструктора есть <tex> K \geqslant 0 </tex> аргументов.
 
Фиксируем тип с <tex> N </tex> конструкторами. Каждый конструктор <tex> C_i </tex> этого типа превращается в абстракцию, в которой сначала идут <tex> K_i </tex> переменных {{---}} аргументы конструктора, а потом <tex> N </tex> переменных, отвечающих конструкторам. В теле просто выбирается нужный конструктор и применяется ко всем аргументам.
 
caseTypeName тоже является абстракцией, которая принимает сначала одну переменную, которая "выбирает" нужный конструктор, затем набор переменных в количестве числа конструкторов. В теле просто применяется первая переменная ко всем остальным.
 
<code>
<font color=green>-- сначала Doctor </font>
Minute = \ a . \ x y . x a
Maybe = \ a b c . \ x y . y a b c
caseDoctor = \ p . \ x y . p x y
<font color=green>-- теперь Hour </font>
Hour = \ a b c . \ x y . x a b c
Roll = \ a b . \ x y . y a b
caseHour = \ p . x y . p x y
</code>
 
Интересное наблюдение: переменная p в case является как раз нужным конструктором, в котором уже подставлены все аргументы этого конструктора.
 
== A2. Закодировать типы по Чёрчу (с взаимной рекурсией) ==
 
):
 
== H1. Написать Haskell-код какой-нибудь структуру данных ==
 
* [[АВЛ-дерево]]: [http://pastie.org/private/qbiu60aetjm9zrpqzrow ссылка на pastie]
*: почему я не знал Haskell, когда это дерево было в лабе по дискретке на первом курсе? ;( просто списывается с конспекта один в один...
* [[Квадродеревья | Квадродерево]]: [http://pastie.org/private/sf1vdmrpe7ifvqgdongwq ссылка на pastie]
*: не совсем то, что требует Ян, но я пока не распарсил то, что он требует; возможно, более правильная версия появится позже
=Кр3=
=Кр4=

Навигация