List 带有元组的Haskell列表,元组可以像字典一样扩展

List 带有元组的Haskell列表,元组可以像字典一样扩展,list,haskell,dictionary,List,Haskell,Dictionary,我是Haskell的初学者,正在努力学习,请原谅我的健忘 我目前正在尝试实现一个电话簿,它是一个元组列表[(名称、编号)](两者都是字符串s) 然而,我不知道如何通过另一个元组扩展这个列表。 例如:[(“Fred”,“47/273”)]现在我想添加另一个元组 我试图理解模块字典是如何工作的,看看如何扩展这个列表,我偶然发现了“数据”和“类型” 我的一个想法是创建一个多种类型的电话簿: let a = TelephoneBook ("Fred","42/2321") 但这只是一个简单的想法。。。

我是Haskell的初学者,正在努力学习,请原谅我的健忘

我目前正在尝试实现一个电话簿,它是一个元组列表
[(名称、编号)]
(两者都是
字符串
s)

然而,我不知道如何通过另一个元组扩展这个列表。 例如:[(“Fred”,“47/273”)]现在我想添加另一个元组

我试图理解模块字典是如何工作的,看看如何扩展这个列表,我偶然发现了“数据”和“类型”

我的一个想法是创建一个多种类型的
电话簿

let a = TelephoneBook ("Fred","42/2321")
但这只是一个简单的想法。。。我有点不知道如何通过另一个元组扩展这个列表,考虑到一旦定义了某个元素,它就不能被更改(或者可以被更改)

(请不要给出问题的解决方案,而只是简单地说明如何开始或我应该进一步研究什么)

操作符将元素预先添加到列表中。例如:

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

因为您要求扩展列表: 我不得不让你失望。这在哈斯克尔是不可能的。你可以构造一个新的。从一个元素和另一个列表中删除

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]
因此,拥有一个新元素和一个列表,您可以使用
(:)
构建一个新元素


Haskell中的
type
关键字必须理解为一个类型别名,因此它只是某些东西的另一个名称,Haskell中的表示形式是相同的。

您需要更多的基础知识。尝试阅读教程或书籍的开头部分,例如,学习Haskell For Great Good或真实世界的Haskell(两者都是在线免费的)只是一个小细节:它是元组而不是元组…是的,我目前也在做这件事,但由于要为几次考试学习,我不得不赶时间,做很多任务等,而只是阅读,因为我们必须深入了解haskel wuite,但在大学里只做了两周^^其余的取决于我们学习:P谢谢你的帮助和信任我正在用我的每一分钟学习变得更好。。。昨天我一直想解决问题直到晚上10点:)有时候你只需要轻轻推一下。(我在Learning yourself a haskell中寻找了类似的东西,但没有找到/错过)最后,这总是最简单的解决方案-谢谢Daniel
--   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'' = (:)