Печать значений внутри кортежа в Haskell

#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