2017-01-16 6 views
0

Я начинаю учиться в Haskell и пытаюсь его изучить, поэтому, пожалуйста, извините мое забывание.Список Haskell с кортежами, которые могут быть расширены - как словарь

В настоящее время я пытаюсь реализовать телефонную книгу, которая представляет собой список кортежей [(Name, Number)] (Оба являются String).

type TelephoneBook = [(String),(String)] (?) 

Однако я не знаю, как я могу расширить этот список другим кортежем. Например: [(«Fred», «47/273»)], и теперь я хочу добавить еще один кортеж.

Я пытался понять, как работает словарь модуля, чтобы увидеть, как я могу расширить этот список, и я наткнулся на «данные» и «тип».

Идея у меня было создать несколько типов этого TelephonBook:

let a = TelephoneBook ("Fred","42/2321") 

, но это всего лишь простая идея ... Я любопытное потерял о том, как расширить этот список еще один кортеж, принимая что, как только что-то определено, оно не может быть изменено (или может быть).

(Пожалуйста, не дают решение проблемы, а просто мысль о том, как начать и что я должен Исследовать дальше)

+3

Вам нужно больше оснований. Попробуйте перейти к началу учебника или книги, например. Learn You A Haskell For Great Good, или Real World Haskell (оба доступны бесплатно) – luqui

+0

Просто небольшая деталь: это * tuple * not * touple * ... –

+0

Да, я сейчас это делаю, но из-за необходимости учиться для нескольких тестов мне нужно бросить его и сделать много задач и т. д., пока просто читайте, поскольку мы должны знать, что haskel wuite в глубине, но делал это только в течение 2 недель в университете. ^^ Остается до нас учиться: P спасибо за помощь, хотя – Fapprentice

ответ

1

потому, что вы просите, чтобы расширить список: я должен разочаровать вас. Это невозможно в Haskell. Вы можете построить новый. Из одного элемента и другого списка.

тип списка в Haskell определен аналогична:

-- 1  2  3 4 
data [a] = a : [a] | [] 
-- 1: if you encounter the type [a] 
-- 3: it is either 
-- 2: an element `e` and a list `l` forming the new list `e:l` 
-- 4: or an empty List `[]` 
-- so the types of the constructors are: 
-- (:) :: a -> [a] -> [a] 
-- [] :: [a] 

Итак, имеющих новый элемент и список можно построить новую, используя (:)!

type Entry = (String, String) 
type Book = [Entry] 

addEntry :: Entry -> Book -> Book 
addEntry e b = e : b -- this works, because book is just a list 

-- without type aliases: (this is the same, but maybe slightly less nice to read) 
addEntry' :: (String, String) -> [(String, String)] -> [(String, String)] 
addEntry' e b = e : b 

-- or even simpler: 
addEntry'' = (:) 

type ключевого слово в Haskell следует понимать как псевдоним типа, так что это просто другое название для чего-то, представления в Haskell является тем же самым.

2

Оператор (:) препендов элементы списков. Например:

> ("John", "555-1212") : [("Fred", "42/2321")] 
[("John","555-1212"),("Fred","42/2321")] 
+0

В конце концов это всегда самое легкое решение -_- thanks Daniel – Fapprentice

Смежные вопросы