Между Haskell Report и GHC base имеется дивная взаимная рекурсия.
В 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
(
Read more... )
Я хочу примитивные фикспойнт потоковые парсеры (FSM) транслировать в foldr.
Типа в языке рекурсия чтобы присуствовала как понятие, но в ядре тайпчекера ее нет.
Reply
Reply
expr([{N,X}|T],[{typevar,Y}|Acc]) -> expr(T,[{N,X},{typevar,Y}|Acc ( ... )
Reply
http://stackoverflow.com/a/14719346 - полезная ссылка про наименьшие и наибольшие фикспоинты
Reply
Это фикспойнты типов, они в нормальной форме нерекурсивно кодируются любые.
Reply
Reply
использование fix разрешено только как макро-расширение базового CoC языка (допустим).
Эта же штука (колбаса), что я привел это же в один фолд с деревом паттерн мачинга преображается, так как это хвостовая рекурсия. Т.е. что то типа, компилируем только хвостовые рекурсии - ограничение для такого macro-fix.
Reply
> let collatz = fix (\c n -> if n == 1 then 1 else if even n then c (n `div` 2) else c (3 * n + 1))
Reply
Reply
> :t fix ('z' :)
fix ('z' :) :: [Char]
> fix ('z' :)
"zzzzzzzzzzzzzzzzzzzInterrupted.
Reply
Reply
Leave a comment