21

私はまだHaskellに不慣れです(オンとオフを学びます)。なぜHaskellData.MapにClojureやRubyのMap/Hashコンストラクター構文のようなリテラルコンストラクター構文がないのか疑問に思います。理由はありますか?Data.ListHaskellには。のリテラルコンストラクタ構文があるので、。のコンストラクタ構文があるはずだと思いましたData.Map

この質問は、まったく重要なことを意味するものではありません。答えを通してHaskellについてもっと知りたいです。

4

5 に答える 5

18

ClojureやRubyとは異なり、Haskellの有限マップはライブラリとして提供されます。これにはトレードオフがあります。たとえば、お気づきのとおり、有限マップの組み込み構文はありません。ただし、これはライブラリであるため、多くの代替実装を使用できます(実際に実行できます)。プログラマーは、使用に最も適した実装を選択できます。

于 2012-05-28T14:27:28.203 に答える
13

すでに与えられた答え(「歴史的な事故」にもかかわらず)に加えて、Rubyや同様のものData.Mapと比較してHaskellでの使用についても言うべきことがあると思います。Hash他の言語の地図のようなオブジェクトは、一般的なアドホックストレージでより多く使用される傾向があります。

Haskellではすぐにdata定義を作成しますが、他の言語でクラスを作成するのはやや重い傾向があるため、よく知られている構造のデータであっても、使用するだけであることがわかります。Hashまたはdictまたは同様のもの。そうするための直接構文があるという事実は、それをさらに魅力的なオプションにします。

Lispとは対照的に、Lispを使用しMAKE-HASH-TABLEてから繰り返し使用SETFするのは比較的煩わしいので(を使用するのと同様Data.Map)、代わりにすべてがネストされたリストにスローされます。これは便利なためです。

同様に、データを格納するための最も便利な選択は、それに合わせて新しい型を作成することであり、それから、Data.Map実際にマップまたはハッシュテーブルを組み込みコンポーネントとして構築するときに任せます。構文が良いと思う場合がいくつかありますが(通常は小さな使い捨てプログラムの場合)、一般的には見逃しません。

于 2012-05-29T10:49:34.013 に答える
8

実際、答えの中で誰もそれを指摘していない理由はわかりませんが(sam boosalisのコメントのみがあります)、とのリテラルOverloadedLists構文をほとんど取得できます:MapSet

{-# LANGUAGE OverloadedLists #-}

import Data.Map
import Data.Set

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

bar :: Set Int
bar = [1]

そこから、さらに見栄えの良い地図を取得するためのもう1つのステップがあります。たとえば、次のようになります。

a =: b = (a,b)

ages :: Map String Int
ages = [ "erik"  =: 30
       , "john"  =: 45
       , "peter" =: 21 ]

私は個人的に暗黙的よりも明示的を好むので、DSLを構築しない限り、私はそれでも固執しますfromList(foo, bar)Haskellは、小さなものではなく、大きな勝利についてです。

于 2016-01-05T13:17:59.783 に答える
7

怠惰な関数型言語では、命令型言語のループ制御構造の代わりにリストが多かれ少なかれ使用されるため、Haskellにはリスト用の特別な構文があります。Mapしたがって、それらは壮大な計画よりもはるかに重要です。

また、「リスト構文」と言ったときに参照していたことは知っていますが、リストコンストラクター構文はhaskell-98でほぼ[1,2,3]実装できることを追加したいと思います。たとえば、型コンストラクターは、で始まるときに中置することができます。:

data Pair = Int :-- Int

したがって、リストコンストラクターは、この一般的な構文規則の:ほんのわずかな特殊なケースであり、非常に洗練されています。一部の人々はそれを逃します。

于 2012-05-28T16:30:27.130 に答える
0

HaskellにはMapコンストラクターがありますが、それは「隠されています」(オブジェクト指向パラダイムのプライベートメソッドのように)。emptysingletonfromListなどの「パブリック」コンストラクターを使用することをお勧めします。ただし、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)

TipおよびBinコンストラクターを使用できますが、これはお勧めしません。

于 2015-03-02T17:36:28.723 に答える