↑↑↓↓←→←→ⒷⒶ Войти !bnw Сегодня Клубы
Какой тип у Y-комбинатора? Я знаю, что Y-комбинатор можно выразить так: Y g = g (Y g). Так вот, Y : ?
#LBZCRM / @anon10018 / 2971 день назад

λ> :t Control.Monad.Fix.fix Control.Monad.Fix.fix :: (a -> a) -> a
#LBZCRM/B3W / @l29ah / 2971 день назад
@l29ah ‰ lambdabot @src fix fix f = let x = f x in x
#LBZCRM/C8U / @l29ah --> #LBZCRM/B3W / 2971 день назад
@l29ah Спасиб, мил человек, а то я не знал!
#LBZCRM/IPC / @anon10018 --> #LBZCRM/C8U / 2971 день назад
@l29ah Хм, как-то странно выглядит. Стоп, тут ведь неявно подразумевается «µa.» в начале, не?
#LBZCRM/7ZY / @anon10018 --> #LBZCRM/B3W / 2971 день назад
@anon10018 Что такое "µa."?
#LBZCRM/7G0 / @l29ah --> #LBZCRM/7ZY / 2971 день назад
@l29ah Ну, типа, рекурсивный тип, я не знаю… В общем, мне непонятно, что в той формуле означает «a». Некий произвольный тип, что ли?
#LBZCRM/H1M / @anon10018 --> #LBZCRM/7G0 / 2971 день назад
@anon10018 Да. В х-ле у тебя везде имплицитный forall для типопеременных.
#LBZCRM/KYD / @l29ah --> #LBZCRM/H1M / 2971 день назад
@l29ah И что же, так все просто?
#LBZCRM/FDG / @anon10018 --> #LBZCRM/KYD / 2971 день назад
@anon10018 Не понял вопроса.
#LBZCRM/NM1 / @l29ah --> #LBZCRM/FDG / 2971 день назад
@l29ah Я думал, там будет какая-нибудь жуткая формула в три этажа с µ-комбинаторами и лямбдами на тайп-левеле, а оно так просто оказалось. Ладно, попробую теперь доказать, что в «f = \x1 → Y (\y → \x → if x > 0 then y (x – 1) else 0) x1» f имеет тип Int → Int.
#LBZCRM/2QL / @anon10018 --> #LBZCRM/NM1 / 2971 день назад
@anon10018 лень чототам доказывать λ> :t \x1 -> fix (\y -> \x -> if x > 0 then y (x - 1) else 0) x1 \x1 -> fix (\y -> \x -> if x > 0 then y (x - 1) else 0) x1 :: (Num a, Num a1, Ord a) => a -> a1
#LBZCRM/9ZV / @l29ah --> #LBZCRM/2QL / 2971 день назад
@l29ah Э, ну я сам хотел!
#LBZCRM/CYN / @anon10018 --> #LBZCRM/9ZV / 2971 день назад
@l29ah Чот у меня не получается повторить этот результат. Все время или надо делать «let T = …», или хуй знает, как дальше раскрывать. Я просто свой компилятер делаю, и мне нужно навелосипедить вот эту выводилку из Хачкеля.
#LBZCRM/M6K / @anon10018 --> #LBZCRM/9ZV / 2970 дней назад
@anon10018 Чо за T?
#LBZCRM/VNW / @l29ah --> #LBZCRM/M6K / 2970 дней назад
@l29ah f = \x1 → Y (\y → \x → if x > 0 then y (x – 1) else 0) x1 Пусть f применяется к z : Int. Тогда: f (z : Int) = = (\x1 → Y (\y → \x → if x > 0 then y (x – 1) else 0) x1)) (z : Int) = = Y (\y → \x → if x > 0 then y (x – 1) else 0) (z : Int) = = |учтем, что Y g = g (Y g)| = = (\y → \x → if x > 0 then y (x – 1) else 0) (Y (\y → \x → if x > 0 then y (x – 1) else 0)) (z : Int) = = |пусть t : T = (Y (\y → \x → if x > 0 then y (x – 1) else 0))| = = (\y → \x → if x > 0 then y (x – 1) else 0) (t : T) (z : Int) = = if (z:Int) > 0 then (t:T) ((z:Int) - 1) else 0 = = |пусть z1 = z - 1| = = if (… : Bool) then (t:T) (z1:Int) else (0:Int) = = а дальше как?
#LBZCRM/ZR9 / @anon10018 --> #LBZCRM/VNW / 2970 дней назад
@anon10018 Собственно, если потом раскрывать t и учитывать, что T = (a → a) → a, то это грёбаное T никуда не уходит. В итоге, если считать, что if возвращает тип-сумму, то у меня получается, что f : Int → T|Int.
#LBZCRM/DQP / @anon10018 --> #LBZCRM/ZR9 / 2970 дней назад
@anon10018 Уточняю: если принять, что Y:(a→a)→a, то потом получается, что f:Int→a|Int. a, уходи.
#LBZCRM/UYL / @anon10018 --> #LBZCRM/ZR9 / 2970 дней назад
Отбой, фасолены. У меня дебильная система типизации, в которой нет теоремы единственности типов. Поэтому Y-комбинатор возвращает всегда бесконечную тип-сумму. Надо другую систему типов, короч.
#LBZCRM/ANO / @anon10018 / 2969 дней назад
ipv6 ready BnW для ведрофона BnW на Реформале Викивач Котятки

Цоперайт © 2010-2016 @stiletto.