Рекурсивная взаимность
Feb. 18th, 2016 05:16 pm![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Между Haskell Report и GHC base имеется дивная взаимная рекурсия.
В GHC base мы имеем такое определение наименьшей неподвижной точки (least fixpoint)
В Haskell Report в разделе 3.12 описана трансляция для выражения let в ядро (привожу только релевантные правила)
Чтобы понять рекурсию, нужно понять рекурсию.
В GHC base мы имеем такое определение наименьшей неподвижной точки (least fixpoint)
fix :: (a -> a) -> a fix f = let x = f x in x
В Haskell Report в разделе 3.12 описана трансляция для выражения let в ядро (привожу только релевантные правила)
... let p = e1 in e0 = case e1 of ˜p -> e0 where no variable in p appears free in e1 let p = e1 in e0 = let p = fix (\˜p -> e1) in e0с замечанием "where fix is the least fixpoint operator".
Чтобы понять рекурсию, нужно понять рекурсию.
no subject
Date: 2016-02-18 03:44 pm (UTC)Я хочу примитивные фикспойнт потоковые парсеры (FSM) транслировать в foldr.
Типа в языке рекурсия чтобы присуствовала как понятие, но в ядре тайпчекера ее нет.
no subject
Date: 2016-02-18 04:39 pm (UTC)no subject
Date: 2016-02-18 04:53 pm (UTC)Хочется потоковые парсеры через Fixpoint и Pattern Matching записывать (HOPE), а не как вереницу case.
И в тоже время, чтобы это все компилировалось в foldr.
Или это undecidable?
no subject
Date: 2016-02-18 05:58 pm (UTC)http://stackoverflow.com/a/14719346 - полезная ссылка про наименьшие и наибольшие фикспоинты
no subject
Date: 2016-02-18 06:48 pm (UTC)Это фикспойнты типов, они в нормальной форме нерекурсивно кодируются любые.
no subject
Date: 2016-02-18 06:14 pm (UTC)no subject
Date: 2016-02-18 06:17 pm (UTC)использование fix разрешено только как макро-расширение базового CoC языка (допустим).
Эта же штука (колбаса), что я привел это же в один фолд с деревом паттерн мачинга преображается, так как это хвостовая рекурсия. Т.е. что то типа, компилируем только хвостовые рекурсии — ограничение для такого macro-fix.
no subject
Date: 2016-02-18 06:41 pm (UTC)no subject
Date: 2016-02-18 06:45 pm (UTC)no subject
Date: 2016-02-18 08:27 pm (UTC)no subject
Date: 2016-02-18 08:28 pm (UTC)no subject
Date: 2016-02-19 01:37 am (UTC)