Здравствуйте, Пельмешко, Вы писали:
П>Здравствуйте, nikov, Вы писали:
N>>Ну тогда еще тренировочные задачки
N>>3) Написать функцию fpower :: Int -> (a -> a) -> (a -> a), которая возводит функцию в указанную степень. Например fpower 3 (*2) должно вернуть функцию эквивалентную троекратному применению (*2), то есть (*2).(*2).(*2) или (*8).
П>Спасибо, nikov! Отлично голову поломал
П>Можно ли короче и более читабельно на F#?
П>П>let fpower = Seq.init >> (>>) Const >> (<<) (Seq.fold (>>) id)
П>
Изначально было:
П>П>let fpower n f = Seq.init n (Const f) |> Seq.fold (>>) id
П>
П>p.s. Я правильно понимаю, что в Хаскеле вместо << юзают flip (.)? Не нашёл в Prelude аналогичного << оператора...
fpower n f x = foldr ($) x $ replicate n f
Что делает (<<)? Если
x << f = f x
то это аналог flip ($), flip id ну и всё в таком духе. Например, через foldl моё решение можно было написать так
fpower n f x = foldl (\x -> ($ x)) x $ replicate n f