#haskell
#haskell
Вопрос:
У меня есть список кортежей. Например: [("A",100,1),("B",101,2)]
. Мне нужно отобразить это простым способом. Например: "your name is: A", "Your id is: 100"
.
Если кто-нибудь сможет найти решение для этого, это было бы большим подспорьем. Заранее спасибо.
Ответ №1:
Самый простой способ сделать это — создать функцию, которая работает для одного из элементов в вашем списке. Итак, вам понадобится что-то вроде:
showDetails :: (String, Int, Int) -> String
showDetails (name, uid, _) = "Your name is:" name " Your ID is: " show uid
Затем вы должны применить эту функцию к каждому элементу в списке, что означает, что вы хотите использовать функцию сопоставления:
map :: (a -> b) -> [a] -> [b]
Итак, если ваш список вызывается xs
, вы хотели бы что-то вроде:
map showDetails xs
Очевидно, что это дает вам результат типа [String]
, поэтому вас может заинтересовать unlines
функция:
unlines :: [String] -> String
Это просто берет список строк и создает строку, в которой каждый элемент разделяется новой строкой.
Затем, собрав все это вместе, вы получаете:
main :: IO ()
main = putStrLn . unlines . map showDetails $ [("A",100,1),("B",101,2)]
Ответ №2:
Для одного кортежа просто сопоставьте все элементы по шаблону и что-нибудь с ними сделайте. Имея функцию, которая делает это, вы можете использовать map
для преобразования всего списка.
import Data.List (foldl')
show_tuple :: (Num a, Num b) => (String, a, b) -> String
show_tuple (name, id, something) =
"Your name is: " name "n"
"Your ID is: " (show id) "n"
"Your something: " (show something) "nn"
-- transforms the list, and then concatenates it into a single string
show_tuple_list :: (Num a, Num b) => [(String, a, b)] -> String
show_tuple_list = (foldl' ( ) "") . (map show_tuple)
Вывод:
*Main Data.List> putStr $ show_tuple_list [("ab", 2, 3), ("cd", 4, 5)]
Your name is: ab
Your ID is: 2
Your something: 3
Your name is: cd
Your ID is: 4
Your something: 5
Комментарии:
1. Я пытаюсь взять список кортежей из файла и отобразить его вышеупомянутым способом. Но в конечном итоге выдается сообщение об ошибке «Ошибка типа в конечном генераторе».
2. Если вы используете это решение, я был бы осторожен, чтобы не использовать «id» в качестве имени переменной, поскольку оно обычно читается как функция идентификации.
Ответ №3:
Быстрое и грязное решение
f (x,y,z) = "your id is " (show y) ", your name is " (show x) "n"
main = putStrLn $ foldr ( ) "" (map f [("A",100,1),("B",101,2)])
ИЛИ (автор @maksenov)
main = putStrLn $ concatMap f [("A",100,1),("B",101,2)]
Комментарии:
1.
foldr ( ) "" $ map
в основномconcatMap
Ответ №4:
Пожалуйста, попробуйте:
get1st (a,_,_) = a
get2nd (_,a,_) = a
get3rd (_,_,a) = a
showTuples [] = ""
showTuples (x:xs) = "Your name is:" show(get1st(x)) " Your ID is: " show(get2nd(x)) "n" showTuples xs
main = do
let x = [("A",100,1),("B",101,2)]
putStrLn . showTuples $ x