2015-04-03 2 views
1

У меня есть список с функциями и еще один список с «аргументами», чтобы создать новый список, в котором каждый элемент одного списка сопоставляется с другим элементом другого списка. (Применяются :: Ord и => [v-> и] -> [v] -> [и]) Например,функции более высокого порядка в haskell

apply [(^2),(^3),(^4),(2^)] [10] = [100,1000,1024,10000]. or 
apply [reverse,(++"ing"),reverse.(++"ing"),(++"ing").reverse] ["play","do"] = ["doing","gniod","gniyalp","od","oding","playing","yalp","yalping"].. 

Что я могу сделать, потому что я делаю первые шаги в Хаскель. .

ответ

4

Возьмём свой первый список:

[(^2),(^3),(^4),(2^)] 

Это тип xs :: Integral a => [a -> a]

Теперь вы хотите, чтобы применить его к к списку [10]. То, что вы хотите именно Аппликативный функция <*>, тип которой Applicative f => f (a -> b) -> f a -> f b:

λ> import Control.Applicative 
λ> let xs = [(^2),(^3),(^4),(2^)] 
λ> xs <*> [10] 
[100,1000,10000,1024] 

Вы можете работать типы, чтобы увидеть, как они сочетаются друг с другом. Ваш второй пример не кажется правильным, поскольку вы не передаете второй параметр вашей функции apply. Я бы посоветовал вам начать читать LYAH, чтобы еще больше укрепить идеи.

+0

Это применит каждый аргумент с каждой функцией, правильно? OP хочет «каждый элемент одного списка, сопоставить с другим элементом другого списка», который, я думаю, можно понимать как применение первой функции только с первым параметром и т. Д. – user2079303

+1

@ user2079303 Мне трудно разобрать вопрос. Если это то, что OP, то тогда он может взять zip из обоих списков, а затем применить их. Но ожидаемый результат в его текущем вопросе не так? – Sibi

+0

Я только что исправил свой вопрос (2-й параметр для моего применения). Теперь это более ясно? @sibi Я хочу применить каждый аргумент с каждой функцией. right –

Смежные вопросы