Re[4]: [Haskell] point-free - этюды
От: lomeo Россия http://lomeo.livejournal.com/
Дата: 16.10.09 08:21
Оценка:
Здравствуйте, Пельмешко, Вы писали:

П>Здравствуйте, 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
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.