Рекурсивная взаимность
Между 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
no subject
Хочется потоковые парсеры через Fixpoint и Pattern Matching записывать (HOPE), а не как вереницу case.
И в тоже время, чтобы это все компилировалось в foldr.
Или это undecidable?
no subject
http://stackoverflow.com/a/14719346 - полезная ссылка про наименьшие и наибольшие фикспоинты
no subject
Это фикспойнты типов, они в нормальной форме нерекурсивно кодируются любые.
no subject
no subject
использование fix разрешено только как макро-расширение базового CoC языка (допустим).
Эта же штука (колбаса), что я привел это же в один фолд с деревом паттерн мачинга преображается, так как это хвостовая рекурсия. Т.е. что то типа, компилируем только хвостовые рекурсии — ограничение для такого macro-fix.
no subject
no subject
no subject
no subject