Haskell: Как мне добавить список списков кортежей? - PullRequest
0 голосов
/ 23 сентября 2018

Извините, я только начал изучать Haskell.Я не понимаю, как добавить кортеж к каждому подсписку.

Мой текущий список:

[[("String", "String", 2.0)],[("String", "String", 2.0),("String", "String", 2.0)]]

Я хочу добавить кортеж в каждый подсписок, поэтому мой новый список:

[[("String", "String", 2.0),("String","String",0.0)],[("String", "String", 2.0),("String", "String", 2.0),("String","String",0.0)]]

Я пытаюсь написать функцию, но она продолжает выдавать мне ошибку

append :: a -> [a] -> [a]
append i (x:xs) = x : append i xs
append i [] = i : []

Затем я делаю:

map append ("String","String",0.0)

Это дает мне многоошибок, таких как неправильное «сопоставление типов».Я не уверен, как добавить в Haskell.

1 Ответ

0 голосов
/ 23 сентября 2018

Тип [[("String", "String", 2.0)],[("String", "String", 2.0),("String", "String", 2.0)]] равен Fractional t => [[(String, String, t)]], или для упрощения [[(String, String, Double)]].

Итак, чтобы добавить элемент в каждый вложенный список, нам нужна функция (String, String, Double) -> [[(String, String, Double)]] -> [[(String, String, Double)]].Другими словами, a -> [[a]] -> [[a]]:

append :: a -> [[a]] -> [[a]]
append x xs = map (\xss -> xss ++ [x]) xs

И, наконец,

> append ("String","String",0.0) [[("String", "String", 2.0)],[("String", "String", 2.0),("String", "String", 2.0)]]
[[("String","String",2.0),("String","String",0.0)],[("String","String",2.0),("String","String",2.0),("String","String",0.0)]]

Кстати, обратите внимание, что добавление элементов в конец списка - это O (n), таким образом, вывозможно, стоит добавить его в начало:

append' :: a -> [[a]] -> [[a]]
append' x = map ((:) x)
...