2017-01-16 29 views
0

我是哈斯克爾的初學者,並試圖學習它,所以請原諒我的遺忘。哈斯克爾列表可以擴展的元組 - 像一本字典

我目前正試圖實施一個電話簿,這是一個元組列表[(Name, Number)](都是String s)。

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

但是,我不知道我怎麼能由另一元組延長這一名單。 例如:[(「Fred」,「47/273」)]現在我想添加另一個元組。

我想了解模塊字典是如何工作的,以瞭解如何擴展這個List,並且我偶然發現了「data」和「type」。

一個想法我是要建立一個多種類型的這種TelephonBook

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

但是,這只是一個簡單的想法......我有點失去了如何通過另一個多元組來擴展此列表,以考慮到一旦定義了某些東西,就不能改變(或者可以)。

(請不給解決問題,而只是對如何開始或者我應該進一步研究什麼的想法)

+3

你需要更多的基礎知識。嘗試閱讀教程或書籍的開頭部分,例如學習你一個Haskell爲好,或真實世界Haskell(兩者都免費在線) – luqui

+0

只是一個小細節:它是*元組* *不* 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

最後它總是最簡單的解決方案-_-謝謝Daniel – Fapprentice