2

У меня есть домашняя работа над функциями более высокого порядка в Haskell, и у меня возникли проблемы с началом работы.Haskell Более высокие функции заказа

Если бы я мог получить помощь и объяснение по первому вопросу, я уверен, что смогу закончить все остальное.

Использование функций высшего порядка (map, fold или filter), а также при необходимости лямбда-выражения, писать функции f1 и f2 таким образом, что f1 (f2 (*) [1,2,3,4]) 5 ~> [5,10,15,20]

f1 = 
f2 = 

Я думаю, что я должен используйте частично примененный map, так что [1,2,3,4] станет [(*1),(*2),(*3),(*4)]?

+0

Я бы сказал, что вы должны начать с 'f1 дп = gn', а затем записать f2 такие, что' 2 (+) [1..4] 5 = = [5,10,15,20] ' – Ingo

+1

Да,' f2 = map' звучит неплохо. – Bergi

ответ

2

Я думаю, что мне нужно использовать частично оцененную карту, чтобы [1,2,3,4] становился [* 1, * 2, * 3, * 4] ??

Ваша интуиция приближает вас к ответу, так что это хороший знак

Тем не менее, выражение вы дали работать с действительно странно

f1 (f2 (*) [1,2,3,4]) 5 

Я хотел бы написать f1 и f2 следующим

let f1 = \xs n -> map (\f -> f n) xs 
    f2 = map 
in f1 (f2 (*) [1,2,3,4]) 5 
-- [5,10,15,20] 
+1

Если вы хотите получить фантазию, 'f1 = flip (map. Flip ($))' :-D – Bergi

+1

Ваш ответ объясняет ничего – luqui

0

Если вы f2 = map, вы IMMED iately добраться до первого шага, который вы придумали:

f2 (*) [1, 2, 3, 4] = 
map (*) [1, 2, 3, 4] = 
[(1 *), (2 *), (3 *), (4 *)] 

Теперь данный этот список функций мультипликатора, нам нужно

f1 [g1, g2, ..., gn] x = 
[g1 x, g2 x, ..., gn x] 

с тех пор мы можем применить его на f2 (*) [1..4], чтобы получить

f1 [(1 *), (2 *), (3 *), (4 *)] 5 = 
[1 * 5, 2 * 5, 3 * 5, 4 * 5] = 
[5, 10, 15, 20] 

Это то, что вам нужно.

Если посмотреть на f1, это выглядит почти как map, за исключением того, что аргументы flip PED:

f1 = \gs x -> map h gs 

Теперь мы просто должны понять, что h есть. h должно быть чем-то, что принимает функцию, например (2 *), и дает результат применения этой функции до 5; т.е. h = \g -> g 5.

Собираем все вместе, мы получаем

let f2 = map 
    f1 = \gs x -> map (\g -> g x) gs 
in f1 (f2 (*) [1, 2, 3, 4]) 5