Какие именно, у меня тут уже столько вариантов было что я не очень понимаю про какой стейт речь
repeatF :: Int -> (a -> a) -> (a -> a) repeatF 0 f x = x repeatF n f x = repeatF (n - 1) f (f x)
Тут вроде и так нормально оптимизируется все repeatF_$s$wrepeatF :: Tape -> Int# -> Tape = \r [sc_s88O sc1_s88P] case sc1_s88P of ds_s88Q { __DEFAULT -> case -# [ds_s88Q 1#] of sat_s893 { __DEFAULT -> case case sc_s88O of { Tape l_s88S dt_s88T ds1_s88U -> case ds1_s88U of { :> dt1_s88W r_s88X -> case r_s88X of dt2_s88Y { :> _ _ -> let { sat_s891 :: Stream = CCCS :>! [dt_s88T l_s88S]; } in Tape [sat_s891 dt1_s88W dt2_s88Y]; }; }; } of sat_s892 { __DEFAULT -> repeatF_$s$wrepeatF sat_s892 sat_s893; }; }; 0# -> sc_s88O; };
А нет, тут же case-of-case не свернут, с $! действительно лучше repeatF_$s$wrepeatF :: Tape -> Int# -> Tape = \r [sc_s88X sc1_s88Y] case sc1_s88Y of ds_s88Z { __DEFAULT -> case sc_s88X of { Tape l_s891 dt_s892 ds1_s893 -> case ds1_s893 of { :> dt1_s895 r_s896 -> case r_s896 of dt2_s897 { :> _ _ -> case -# [ds_s88Z 1#] of sat_s89c { __DEFAULT -> let { sat_s89a :: Stream = CCCS :>! [dt_s892 l_s891]; } in let { sat_s89b :: Tape = CCCS Tape! [sat_s89a dt1_s895 dt2_s897]; } in repeatF_$s$wrepeatF sat_s89b sat_s89c; }; }; }; }; 0# -> sc_s88X; }; -0.1-0.2 секунды, да
Обсуждают сегодня