我还是Haskell的新手(不断学习它).我想知道为什么Haskell没有文字Data.Map构造函数语法,比如Clojure或Ruby中的Map/Hash构造函数语法.有原因吗?我认为既然Haskell确实有一个文字构造函数的语法Data.List,那么应该有一个Data.Map.
这个问题根本不是至关重要的.我想通过答案了解有关Haskell的更多信息.
Dan*_*ner 17
与Clojure和Ruby不同,Haskell的有限映射以库的形式提供.这需要权衡:例如,正如您所注意到的,有限地图没有内置语法; 但是,因为它是一个库,我们可以(并且确实)有许多替代实现,并且作为程序员,您可以选择最适合您的用途.
Ash*_*she 13
除了已经给出的答案(尽管有"历史事故"),我认为Data.Map在Haskell中使用与HashRuby或类似事物相比还有一些东西可以说; 其他语言中的类似地图的对象倾向于看到更多用于一般ad-hoc存储.
在Haskell中,你可以立刻制定一个data定义,在其他语言中创建一个类往往会有点重量级,所以我们发现即使对于具有众所周知结构的数据,我们也只是使用一个Hash或dict或类似.事实上,我们有这样做的直接语法使得它更具吸引力.
与Lisp对比:使用MAKE-HASH-TABLE然后重复SETF它比较烦人(类似于使用Data.Map),所以一切都被抛入嵌套列表,而不是因为它是方便的.
同样,我很高兴存储数据最方便的选择是创建适合的新类型,然后Data.Map当我实际构建一个map或hash-table作为内部组件时,我会离开.在某些情况下,我认为语法会很好(通常只适用于较小的丢弃程序),但总的来说我不会错过它.
Haskell对列表有特殊的语法,因为在惰性函数语言中,它们或多或少取代了命令式语言中的循环控制结构.所以他们比Map在宏伟的计划中更重要.
另外,我知道你指的是[1,2,3]什么时候你说"列表语法",但我想补充一点,列表构造函数语法几乎可以在haskell-98中实现,因为类型构造函数可以在它们开头时为中缀:,例如
data Pair = Int :-- Int
Run Code Online (Sandbox Code Playgroud)
所以列表构造函数:只是这个通用语法规则的一个小例子,非常优雅.有些人想念那个.
实际上我不确定为什么没有人在答案中指出它(只有sam boosalis'评论),但OverloadedLists你可以得到文字语法Map和Set:
{-# 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是关于大胜利了不小的.