我还是Haskell的新手(不断学习它)。我想知道为什么Haskell没有文字Data.Map
构造函数语法,比如Clojure或Ruby中的Map / Hash构造函数语法。有原因吗?我认为既然Haskell确实有Data.List
的文字构造函数语法,那么Data.Map
应该有一个。{/ p>
这个问题根本不是至关重要的。我想通过答案了解有关Haskell的更多信息。
答案 0 :(得分:17)
与Clojure和Ruby不同,Haskell的有限映射以库的形式提供。这需要权衡:例如,正如您所注意到的,有限地图没有内置语法;但是,因为它是一个库,我们可以(并且确实)有许多替代实现,并且作为程序员,您可以选择最适合您的用途。
答案 1 :(得分:13)
除了已经给出的答案(尽管有“历史事故”),我认为在Haskell中使用Data.Map
与在Ruby中使用Hash
相比还有一些东西可以说。事情;其他语言中类似地图的对象倾向于看到更多用于一般临时存储。
然而在Haskell中,你可以立刻制定一个data
定义,用其他语言创建一个类往往会有点重量级,所以我们发现即使是有良好数据的数据 - 已知的结构,我们只会使用Hash
或dict
或类似的。事实上,我们有这样做的直接语法使得它更具吸引力。
与Lisp对比:使用MAKE-HASH-TABLE
然后重复SETF
它相对烦人(类似于使用Data.Map
),所以所有内容都被抛入嵌套列表中,而不是因为它是什么的方便。
同样,我很高兴存储数据最方便的选择是创建适合的新类型,然后当我实际构建一个map或hash-table作为内在组件时,我将Data.Map
留给。在一些情况下我认为语法会很好(通常只适用于较小的丢弃程序),但总的来说我不会错过它。
答案 2 :(得分:7)
Haskell对列表有特殊的语法,因为在一种懒惰的函数式语言中,它们或多或少取代了命令式语言中的循环控制结构。所以他们在宏观计划中比Map
重要得多。
此外,当您说“列表语法”时,我知道您指的是[1,2,3]
,但我想添加列表构造函数语法几乎是在haskell-98中实现,因为类型构造函数在以:
开头时可以是中缀,例如
data Pair = Int :-- Int
因此列表构造函数:
只是这个通用语法规则的轻微特例,非常优雅。有些人想念那个。
答案 3 :(得分:6)
实际上我不确定为什么没有人在答案中指出它(只有sam boosalis'评论)但是$s: 23.750em;
...
你几乎可以获得OverloadedLists
和{{1}的字面语法}}:
Map
从那里开始,只有一步可以获得更好看的地图,例如:
Set
虽然我个人更喜欢显式过度隐含,但除非我正在构建DSL,否则我仍然坚持{-# LANGUAGE OverloadedLists #-}
import Data.Map
import Data.Set
foo :: Map Int Int
foo = [(1,2)]
bar :: Set Int
bar = [1]
和a =: b = (a,b)
ages :: Map String Int
ages = [ "erik" =: 30
, "john" =: 45
, "peter" =: 21 ]
- Haskell是关于大赢而不是小赢。
答案 4 :(得分:-1)
Haskell确实有一个Map构造函数,但它是“隐藏的”(就像面向对象范例中的私有方法)。建议您使用“public”构造函数,例如 empty , singleton 或 fromList 。 但是,如果您检查https://hackage.haskell.org/package/containers-0.4.0.0/docs/src/Data-Map.html处提供的代码,则会得到以下定义
data Map k a = Tip
| Bin {-# UNPACK #-} !Size !k a !(Map k a) !(Map k a)
您可以使用提示和 Bin 构造函数,但不建议这样做。