#haskell
#haskell
Вопрос:
Как я могу просмотреть список и вернуть что-то для каждого элемента?
Вот небольшой пример:
stack = [("ax","bx"),("cx","dx")]
test :: [(String, String)] -> String
test [] = ""
test (x:xs) = do
reverse (fst x)
test xs
Как я могу это сделать?
Комментарии:
1. Этот вопрос очень неясен. Можете ли вы привести пример вывода? Пример использования?
Ответ №1:
Я не совсем уверен, что вы пытаетесь сделать. Если вы хотите изменить первый элемент каждого кортежа и вернуть результаты в виде списка:
stack = [("ax","bx"),("cx","dx")]
test :: [(String, String)] -> [String]
test [] = []
test (x:xs) = reverse (fst x) : test xs
Если вы хотите получить результат в виде одной строки, попробуйте:
stack = [("ax","bx"),("cx","dx")]
test :: [(String, String)] -> String
test [] = ""
test (x:xs) = reverse (fst x) test xs
Чтобы применить функцию к каждому элементу списка, вы также можете захотеть взглянуть на map
.
Ответ №2:
test = concatMap (reverse . fst)
Ответ №3:
test :: [(String, String)] -> String
test = foldr (x r -> reverse (fst x) r) ""
?
Комментарии:
1. По какой-то причине людям действительно нравится
foldr
. Вы знаете этоfoldr (x r -> f x r) [] = map f
, верно?2.
foldr (x r -> reverse (fst x) r) "" [("12", "13"), ("324", "56")]
=> «21423».map (x -> reverse (fst x)) [("12", "13"), ("324", "56")]
=> [«21″,»423»].не является
:
3. @hoha, есть также
concat
, и если уж на то пошлоconcatMap
.4. @dave4420, да, но я новичок в Haskell, поэтому я не знал об этих функциях. «если все, что у вас есть, это лямбда-выражение, все выглядит как фолд» 🙂
5. @hoha:
concatMap
это довольно стандартная операция сбора данных: Ruby (flat_map
, псевдонимcollect_concat
), Scala (flatMap
), .NET (SelectMany
).