Как просмотреть список и вернуть несколько строк для каждой записи?

#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 ).