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

dan*_*dan 20 haskell

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

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

Dan*_*ner 17

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

  • @hvr因为我们通过`OverloadedStrings`扩展了解了我们的课程... (5认同)
  • 另一方面,我们有`OverloadedStrings`扩展,为什么不应该有`OverloadedLists`扩展呢?:-) (2认同)

Ash*_*she 13

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

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

与Lisp对比:使用MAKE-HASH-TABLE然后重复SETF它比较烦人(类似于使用Data.Map),所以一切都被抛入嵌套列表,而不是因为它是方便的.

同样,我很高兴存储数据最方便的选择是创建适合的新类型,然后Data.Map当我实际构建一个map或hash-table作为内部组件时,我会离开.在某些情况下,我认为语法会很好(通常只适用于较小的丢弃程序),但总的来说我不会错过它.


jbe*_*man 7

Haskell对列表有特殊的语法,因为在惰性函数语言中,它们或多或少取代了命令式语言中的循环控制结构.所以他们比Map在宏伟的计划中更重要.

另外,我知道你指的是[1,2,3]什么时候你说"列表语法",但我想补充一点,列表构造函数语法几乎可以在haskell-98中实现,因为类型构造函数可以在它们开头时为中缀:,例如

data Pair = Int :-- Int
Run Code Online (Sandbox Code Playgroud)

所以列表构造函数:只是这个通用语法规则的一个例子,非常优雅.有些人想念那个.

  • @stephentetley好点,谢谢.但是我觉得懒惰的评估对于替换循环的列表是必要的(例如`while true; do`)并且我认为这是关于haskell中列表的基本要素. (4认同)

Eri*_*lun 7

实际上我不确定为什么没有人在答案中指出它(只有sam boosalis'评论),但OverloadedLists你可以得到文字语法MapSet:

{-# LANGUAGE OverloadedLists #-}

import Data.Map
import Data.Set

foo :: Map Int Int
foo = [(1,2)]

bar :: Set Int
bar = [1]
Run Code Online (Sandbox Code Playgroud)

从那里,只有一步,以获得更好看的地图,例如:

a =: b = (a,b)

ages :: Map String Int
ages = [ "erik"  =: 30
       , "john"  =: 45
       , "peter" =: 21 ]
Run Code Online (Sandbox Code Playgroud)

尽管我个人更喜欢隐显式的,所以,除非我建立一个DSL,我还是会坚持fromList(foo, bar)- Haskell是关于大胜利了不小的.