@frp_ru

Страница 113 из 420
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?

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
он давно с нами

А откуда h?
сорри провтыкал)

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
pattern N = Fix NilF pattern C x y = Fix(ConsF x y)
для этого нужно включить прагму PatternSynonyms

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

pattern N = Fix NilF pattern C x y = Fix(ConsF x y)
А для чего это вооьще?

Нигде же не использовалось

Google
kana
22.07.2017
22:51:27
Но кажется, суть в том, что a : (b : c) превращается в a : (b + c)
А это возможно только потому что в нашем типе не захардкорено, что b - список, поэтому мы можем егл смапить

Я, внезапно, все понял

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

А для чего это вооьще?
ща до anamorphism дойдем

как я и говорил в дуальных алгебрах надо только стрелки поменять местами (направление)

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
ката - разрушать (свертка в общем общих случаев) ана - (развертка в общем общих случаев)

Страница 113 из 420