29

私はHaskellを学んでいるところですが、型クラスは型セーフなポリモーフィック関数を作成するための強力な方法のようです。しかし、HaskellPrelude関数の多くはそれらを使用していません。すなわち:

  • ほとんどのリスト関数は他のデータ構造では機能しません(たとえば、foldrリストlengthに対してのみ実装され、配列では使用できません)。

  • のようなモジュールは、プレリュード関数と同じ名前の関数が含まれているため、 Data.ByteString使用しない限り使用できません。import qualified

標準ライブラリが型クラスを持つジェネリック関数を使用した場合、これらの問題は両方とも解消されるようです(これで完全にベースから外れているかどうかを知らせてください)。

2つの質問があります:

  1. プレリュードがこのようなものであるという技術的または設計上の理由はありますか、それとも歴史的な理由だけですか?

  2. 周りを見回すと、標準のPrelude関数を一般的な代替関数に置き換えるライブラリがいくつかあるようです( Data.Foldable私が間違っていない場合は、Scrap Your Boilerplateなど)。これらのアイデアをHaskellの将来のバージョンに組み込む計画はありますか?

4

4 に答える 4

19

「標準的な」Haskell(プレリュード+ベース+多分それ以上)がより多くのポリモーフィズムを使用しないという非常に実用的な理由があります。

汎用型クラスの設計は難しいです。リスト、配列、「bytestrings」(個人的にはBytestringをコンテナとは見なしていません)などのコンテナタイプを抽象化するクラスの優れたデザインは、Haskell2012に含まれるのを待って浮かんでいません。Listlikeやエジソンのクラス、そして多くの人々がこの問題に取り組んできましたが、FoldableとTraversableを除いて、説得力のあるデザインを作成した人は誰もいません。

于 2011-01-24T09:19:39.223 に答える
11

Haskellベースライブラリは、以前はより多形的でした。リスト内包表記は、任意のモナドで機能するために使用され、リストやおそらく他のものに限定されていませんでしたmap++

しかし、当時の人々は、それが初心者にとって紛らわしいエラーメッセージにつながり、初心者でない人々は特に多形バージョンを使用できると考えていました。

于 2011-01-25T05:52:00.183 に答える
8
  1. ベースには多くのものがあり、特にプレリュードは歴史的ですが、一般化すると技術的な反発がたくさん見られると思います。主な問題は速度です。関数に型クラスの制約がある場合は、型クラス関数の辞書を渡し、特殊化のためにより多くのスペースを消費することになります。

  2. SYBなどの一部のライブラリは、Haskellの一部ではない拡張機能を使用しています。最初のタスクは、これらの機能のサポートを形式化して構築することです。Haskellのドキュメントを見て、Haskellがどこに向かっているのか、そしてその道にどのように影響を与えることができるのかを確認してください。

于 2011-01-24T06:10:47.050 に答える
6

実世界のハスケルは、モナド変換子の章でこれについていくつかの洞察を持っています:

理想的な世界では、過去から脱却し、プレリュードを切り替えてトラバース可能タイプと折りたたみ可能タイプを使用しますか?おそらくそうではありません。Haskellを学ぶことは、すでに新参者にとって十分に刺激的な冒険です。フォールダブルとトラバース可能な抽象化は、ファンクターとモナドをすでに理解している場合は簡単に理解できますが、初期の学習者は純粋すぎる抽象化の食事になります。言語を教えるために、マップがファンクターではなくリストで動作するのは良いことです。

于 2011-01-24T11:50:20.617 に答える