为什么Haskell缺少文字Data.Map构造函数语法?

时间:2012-05-28 14:19:44

标签: haskell

我还是Haskell的新手(不断学习它)。我想知道为什么Haskell没有文字Data.Map构造函数语法,比如Clojure或Ruby中的Map / Hash构造函数语法。有原因吗?我认为既然Haskell确实有Data.List的文字构造函数语法,那么Data.Map应该有一个。{/ p>

这个问题根本不是至关重要的。我想通过答案了解有关Haskell的更多信息。

5 个答案:

答案 0 :(得分:17)

与Clojure和Ruby不同,Haskell的有限映射以库的形式提供。这需要权衡:例如,正如您所注意到的,有限地图没有内置语法;但是,因为它是一个库,我们可以(并且确实)有许多替代实现,并且作为程序员,您可以选择最适合您的用途。

答案 1 :(得分:13)

除了已经给出的答案(尽管有“历史事故”),我认为在Haskell中使用Data.Map与在Ruby中使用Hash相比还有一些东西可以说。事情;其他语言中类似地图的对象倾向于看到更多用于一般临时存储。

然而在Haskell中,你可以立刻制定一个data定义,用其他语言创建一个类往往会有点重量级,所以我们发现即使是有良好数据的数据 - 已知的结构,我们只会使用Hashdict或类似的。事实上,我们有这样做的直接语法使得它更具吸引力。

与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 构造函数,但不建议这样做。