Как применить функцию к каждому элементу списка в Haskell?

У меня есть список кортежей, и я хочу применить функцию dir.. к первому элементу в каждом кортеже. Как я могу это сделать? Заранее большое спасибо!

[ ("grid", gridResponse),
("graph", graphResponse),
("image", graphImageResponse),
("timetable-image", timetableImageResponse x),
("graph-fb",toResponse ""),
("post-fb",toResponse ""),
("test", getEmail),
("test-post", postToFacebook),
("post", postResponse),
("draw", drawResponse),                  
("about", aboutResponse),
("privacy" ,privacyResponse),
("static", serveDirectory),
("course", retrieveCourse),
("all-courses", allCourses),
("graphs", queryGraphs),
("course-info", courseInfo),
("depts", deptList),
("timesearch",searchResponse),
("calendar",calendarResponse),
("get-json-data",getGraphJSON),
("loading",loadingResponse),
("save-json", saveGraphJSON)]

person Mia.M    schedule 23.06.2016    source источник
comment
Вы знаете о map ?   -  person pdexter    schedule 23.06.2016
comment
Вы хотите извлечь данные, применить их и вернуть этот список или применить на месте, возвращая новое значение в первой позиции, исходное значение в позиции snd? Я бы порекомендовал карту для первого, линзы для второго.   -  person jamshidh    schedule 23.06.2016
comment
Спасибо всем здесь! map очень полезно!   -  person Mia.M    schedule 23.06.2016
comment
В качестве упражнения вы должны решить это, используя как map, так и явную рекурсию с сопоставлением с образцом. f [] = ... ; f ((x,y):rest) = ...   -  person chi    schedule 23.06.2016


Ответы (1)


map определяется как:

map :: (a -> b) -> [a] -> [b]

Это означает, что это функция, которая принимает функцию, которая переходит от типа a к типу b, и список типа a, а затем возвращает список типа b. Как отметили @pdexter и @karakfa в комментариях, это именно то, что вам нужно.

map f list

Так какое ф тебе нужно? Что ж, ваш список представляет собой список кортежей, и вы хотите применить функцию к первому элементу каждого кортежа, поэтому (точно так, как указал @karakfa) все, что вам нужно, это

map (dir . fst) list

Это объединяет функцию fst с вашей пользовательской функцией dir, чтобы дать вам новую функцию, которая будет принимать первый элемент кортежа и делать с ним все, что делает с ним ваша функция dir. Затем карта применяет это ко всему списку.

person jkeuhlen    schedule 23.06.2016
comment
еще один вопрос: что, если я хочу применить карту к функции, которая принимает две переменные? Например, у меня есть функция с именем doubleUs здесь и doubleUs = x*2 + y*2. И x из списка [1,2,3], y из списка [2,3,4]. Как я могу этого добиться? - person Mia.M; 07.07.2016
comment
На этот сайт уже несколько раз отвечали. Взгляните на [этот вопрос (stackoverflow.com/questions/9448570/) в качестве примера. - person jkeuhlen; 07.07.2016