Убогонькая единичка
Dec. 11th, 2007 07:07 pm![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
По поводу сегодняшнего LtU: S has a left inverse
Shin-Cheng Mu типа открыл обратный к S комбинатор:
Shin-Cheng Mu пишет, что
и я губу-то и раскатал.
Увы, всё не так сладко. Если вывести тип
то видно, что это - ограниченная версия id с более частным principle type, чем настоящая id. То есть
но для арности меньшей 2х это не канает. Жалко.
ЗЫ: я где-то видел статью каких-то итальянцев, доказывавших, что обращение комбинаторов в общем случае невозможно, но ссылку посеял.
Shin-Cheng Mu типа открыл обратный к S комбинатор:
-- классический коннектор s :: (a -> b -> c) -> (a -> b) -> a -> c s = \ f g x -> f x (g x) -- обратный к нему s' :: ((a -> b) -> a -> c) -> a -> b -> c s' = \ f x y -> f (const y) x
Shin-Cheng Mu пишет, что
s' . s = id
и я губу-то и раскатал.
Увы, всё не так сладко. Если вывести тип
(s' . s) :: (a -> b -> c) -> a -> b -> c
то видно, что это - ограниченная версия id с более частным principle type, чем настоящая id. То есть
(s' . s) (++) == (++) (s' . s) foldr == foldr
но для арности меньшей 2х это не канает. Жалко.
ЗЫ: я где-то видел статью каких-то итальянцев, доказывавших, что обращение комбинаторов в общем случае невозможно, но ссылку посеял.
no subject
Date: 2007-12-12 08:47 am (UTC)У тебя s' . s, а s ожидает первым параметром (a -> b -> c)
Ну, или по другому - s ожидает два параметра, поэтому с какой бы стороны от композиции он не находился, чистого id ты не получишь.
Ну и напоследок - а чего ты хотел? ;-) Смысл то реверсирования функций не в том, чтобы получить чистый id, это всего лишь аксиома, которая должна соблюдаться, чтобы получить значение того же типа. Применять то мы это всё одно по другому будем.
Статью, кстати, я тоже читал, она вроде презентации была сделана, да?
no subject
Date: 2007-12-12 09:11 am (UTC)А так классы допустимых f и g больно узкие...
no subject
Date: 2007-12-12 09:20 am (UTC)no subject
Date: 2007-12-12 09:31 am (UTC)no subject
Date: 2007-12-12 09:54 am (UTC)Не-е-е.. Я про другое - я одно время интересовался реверсированием функций, это мой интерес был вызван практической проблемой. Честно говоря, уже не помню какой, но усредняя, это что то вроде универсального лифтинга:
f :: a -> b -- преобразователь
g :: b -> b -- трансформер
lift f g = f' . g . f where f' = reverse f
В этом смысле id как a -> a имеет мало смысла. Вот я и спросил, зачем в реверсивных функциях чистый id :-)
no subject
Date: 2007-12-12 10:41 am (UTC)no subject
Date: 2007-12-12 11:04 am (UTC)Это всего лишь общий полиморфный тип a -> a, который зависит от a из типа f.
А f у нас что? Правильно S-комбинатор, значит и id будет (a->b->c)->(a->b->c)
no subject
Date: 2007-12-12 11:15 am (UTC)У тебя в примере :-)))
no subject
Date: 2007-12-12 11:34 am (UTC)В бананах в космосе функция
тождественный id, на основании чего легким движением руки из неё получается катаморфизм. Меняем применение конструктора In :: f (Rec f) -> Rec f не на себя, а на произвольную phi :: f a -> a и получаем
Здесь id задана на Rec f, что позволяет покрыть все рекурсивные типы, для которых можно написать instance Functor.
Я и стал думать, что можно из s и s' вытащить...
no subject
Date: 2007-12-12 01:11 pm (UTC)copy = cata In, т.е. id твой внутри, на месте его может быть любая функция f a -> a, для рекурсивного f.
Это к аналогиям...
...Честно говоря, я не понимаю, чего ты хочешь :-) Можешь для тупых подробнее объяснить? А то может я вообще о другом говорю?
no subject
Date: 2007-12-12 01:51 pm (UTC)Офтоп,...
Date: 2007-12-12 01:53 pm (UTC)Re: Офтоп,...
Date: 2007-12-12 02:19 pm (UTC)выкладываю. Продолжать?
no subject
Date: 2007-12-12 02:45 pm (UTC)no subject
Date: 2008-02-11 08:13 pm (UTC)no subject
Date: 2008-02-11 08:34 pm (UTC)То есть
no subject
Date: 2008-02-12 06:35 am (UTC)s' id = (\f x y.f (const y) x) id = \x y.id (const y) x = \x y.const y x = \x y.y;
(s' id) s = (\x.(\y.y)) s = \y.y
Где ошибка?
no subject
Date: 2008-02-12 06:47 am (UTC)no subject
Date: 2008-02-12 06:52 am (UTC)no subject
Date: 2008-02-12 07:01 am (UTC)no subject
Date: 2008-02-12 07:26 am (UTC)Но это не универсально. s' из-за const в своём определении затирает часть информации безвозвратно:
Применим к массиву символов и числу
Опс - символы пропали. С map, к тому же, конструкцию (s' map) s не сделать. Вобщем, о том и речь - неуниверсально это...