
kana
22.07.2017
22:28:47
Стой
Но в типах нет лямбд

Denis
22.07.2017
22:29:16
ListF a b = NilF | ConsF a b
List a = Fix(ListF a)

kana
22.07.2017
22:29:33
Ну да

Google

kana
22.07.2017
22:29:37
Точно

Denis
22.07.2017
22:29:50
давай теперь вспомним что у нас было про ф алгебры

kana
22.07.2017
22:29:57
Зачем лямбды, еслм можно сделать мусорный тип

Denis
22.07.2017
22:30:13
нам нужны алгебры для этого

kana
22.07.2017
22:31:23
У меня была мысль, что ты хочешь сделать типа
data List a = Fix (\b -> Nil | Cons a b)

Denis
22.07.2017
22:31:29
нет

kana
22.07.2017
22:31:34
Ты так и сделал
Просто вынес в отдельный тип

Denis
22.07.2017
22:32:10
ну наша задача научится строить рекурсию без рекурсии, индуктивные типы без индукции
ща к катаморфизмам анаморфизмам прийдем)
коммутативные диаграммы читать умеешь?

Google

kana
22.07.2017
22:33:06
Более менее
Вот эту не понимаю

Denis
22.07.2017
22:33:44
у нас есть Fix :: f(Fix f) -> Fix (f)
и unFix :: Fix f -> f(Fix f)

kana
22.07.2017
22:33:53
А, ну дошло

Denis
22.07.2017
22:34:12
у них изоморфизм (больше об этом - лемма Ламбека)
а значит мы можем их смело подменять
ах
я уже тут написал все для h

kana
22.07.2017
22:35:06
У тебя уже были готовы эти схемы или ты их как-то быстро строишь?)

Denis
22.07.2017
22:35:26
да я делаю потихоньку)
ну так вот

kana
22.07.2017
22:35:57
Слушай, я правильно понимаю, что функтор морфизма - морфизм из fa в f b?

Denis
22.07.2017
22:35:59
у нас есть h = alg . fmap h . unFix

kana
22.07.2017
22:36:29
f : a -> b
F(f) : F a -> F b

Denis
22.07.2017
22:36:34
ну вот эта вот h
есть катаморфизм
ща другой ракурс

kana
22.07.2017
22:36:53
Ну да, свертка

Google

Denis
22.07.2017
22:36:57
cata alg = alg . fmap h . unFix
теперь можно писать свертку без рекурсий
любую
например сумма
первым делом сделаем паттеры (так красивее будет для case)
pattern N = Fix NilF
pattern C x y = Fix(ConsF x y)
дальше это должно быть функтор! у нас же функторная алгебра
instance Functor (ListF t) where
fmap _ NilF = NilF
fmap f (ConsF a b) = ConsF a (f b)

illiatshurotshka❄️
22.07.2017
22:41:10
aaaaa

kana
22.07.2017
22:41:21
Чет не так

kana
22.07.2017
22:41:40
Ты что-то не то мапишь же

Denis
22.07.2017
22:41:59
sumL :: Num a => List a -> a
sumL = cata go where
go = \case
NilF -> 0
ConsF a b -> a + b
где рекурсия?)))
go это наша алгебра вида go :: Num a => ListF a a -> a

kana
22.07.2017
22:43:26
А, я понял
Моноид некий

Denis
22.07.2017
22:44:19
как бы у ListF a a хвост у этого будет уже собранная инфа в типа a

Google

Denis
22.07.2017
22:44:28
анаморфизм есть дуализм к катаморфизму
хиломорфизм (отец всех морфизмов) есть их композиция
функторная {ко}алгебра прекрасна

illiatshurotshka❄️
22.07.2017
22:45:27
можно просто сдохнуть?

Denis
22.07.2017
22:45:36
чего?

kana
22.07.2017
22:46:05

Denis
22.07.2017
22:46:43
он давно с нами
cata alg = alg . fmap alg . unFix

Admin
ERROR: S client not available

Denis
22.07.2017
22:47:25
но ты это мог бы сам по диаграмме восстановить

kana
22.07.2017
22:47:29
Во
Другое дело
Не мог бы
Мало понимания

Denis
22.07.2017
22:48:27

kana
22.07.2017
22:49:32
Но кажется, суть в том, что
a : (b : c) превращается в a : (b + c)
Нигде же не использовалось

Google

kana
22.07.2017
22:51:27
Я, внезапно, все понял

Denis
22.07.2017
22:52:31
newtype Fix f = Fix { unFix :: f(Fix f) }
data ListF a b = NilF | ConsF a b
type List a = Fix(ListF a)
instance Functor (ListF t) where
fmap _ NilF = NilF
fmap f (ConsF a b) = ConsF a (f b)
instance Show t => Show (List t) where
show = (<>"]") . ("["<>) . cata alg where
alg NilF = ""
alg (ConsF x []) = show x
alg (ConsF x xs) = show x <> "," <> xs
cata psi f = psi . fmap f . unFix
sumL :: Num a => List a -> a
sumL = cata go where
go :: Num a => ListF a a -> a
go = \case
NilF -> 0
ConsF a b -> a + b

kana
22.07.2017
22:52:34
Кроме того, зачем это нужно
Но это интересно

Denis
22.07.2017
22:53:22
мы можем сделать любой индуктивный тип например Expression
как я и говорил в дуальных алгебрах надо только стрелки поменять местами (направление)

kana
22.07.2017
22:54:26

Denis
22.07.2017
22:54:29

kana
22.07.2017
22:55:15
Ты передаешь в ката только пси

Denis
22.07.2017
22:55:23
да
cata f = f . fmap (cata f) . unFix
сорри
просто я упорот и делал так раньше))) cataRec f = fix(cata f)
я думаю у тебя это уже должно заработать)
и вывести сумму

kana
22.07.2017
22:56:58
Я с телефона, возможность проверить будет только завтра
На телефоне даже репл.ит не раьотает

Denis
22.07.2017
22:57:12
перейдем к анаморфизму?

kana
22.07.2017
22:57:16
Давай

Denis
22.07.2017
22:57:57
ката - разрушать (свертка в общем общих случаев)
ана - (развертка в общем общих случаев)