19

Typeclassopediaのすべての型クラスには、特定の演算子の結合性や交換性などの法則が関連付けられています。「法則」の定義は、型システムでは表現できない制約のようです。たとえばモナド則が必要な理由は確かに理解できますが、型システム内で完全に表現できる型クラスが無意味である根本的な理由はありますか?

4

3 に答える 3

19

ほとんどの場合、法は代数法であることに気付くでしょう。いくつかの拡張機能を使用して型システムで表現することもできますが、証明を表現するのは面倒です。したがって、未チェックの法律があり、実装によってそれらが破られる可能性があります。なぜこれが良いのですか?

その理由は、Haskellで使用されるデザインパターンは、通常は抽象代数からの数学的構造によって動機付けられている(そしてほとんどの場合ミラーリングされている)ためです。他のほとんどの言語には、安全性、パフォーマンス、セマンティクスなどの特定の機能の直感的な概念がありますが、Haskellプログラマーは正式な概念を確立することを好みます。これを行うことの利点は次のとおりです。タイプと関数が安全法に従うと、基礎となる代数的構造の意味で安全になります。それらは確かに安全です。

例としてファンクターを取り上げます。Haskellファンクターには次の2つの法則があります。

fmap f . fmap g = fmap (f . g)
fmap id         = id

まず、これは非常に重要です。Haskellの関数は不透明です。それらを調べたり、比較したりすることはできません。これはHaskellでは悪いことのように聞こえますが、実際には非常に良いことです。関数は、fmap渡した関数を調べることができません。特に、恒等関数に合格したか、コンポジションに合格したかを確認することはできません。要するに:それはごまかすことはできません!これらの2つの法則に従う唯一の方法は、実際にはそれ自体の効果を導入しないことです。つまり、適切なファンクターでは、予期しないことは何も起こりfmapません。実際、指定された関数をマップする以外に何もできません。これは非常に単純な例であり、なぜチートできないのかという微妙な点をすべて説明していませんが、その要点を示しています。fmap

これを言語、ベースライブラリ、最も賢明なサードパーティライブラリ全体に拡張します。これにより、言語が取得できるのと同じくらい予測可能な言語が得られます。あなたがコードを書くとき、あなたはそれが何をするのかを知っています。これが、Haskellコードが箱から出してすぐに機能することが多い主な理由の1つです。私はコンパイルする前にHaskellコードのページを書くことがよくあります。タイプエラーが修正されると、通常、プログラムは機能します。

これが望ましいもう1つの理由は、より構成的なスタイルのプログラミングが可能になることです。これは、チームで作業する場合に特に便利です。まず、アプリケーションを代数的構造にマッピングし、必要な法則を確立します。例:何かが有効なWebサーバーであるとはどういう意味かを表現します。特に、Webサーバー構成の正式な概念を確立します。2つの有効なWebサーバーを作成すると、結果は有効なWebサーバーになります。これがどこに向かっているのかわかりますか?これらの法律を制定した後、チームメイトは仕事に行き、彼らは孤立して働きます。彼らの仕事を成し遂げるためにコミュニケーションはほとんどまたはまったく必要ありません。彼らが再び会うとき、誰もが彼らの有効なウェブサーバーを提示し、彼らは最終製品であるウェブサイトを作るためにそれらを構成するだけです。個々のコンポーネントはすべて有効なWebサーバーであったため、最終結果は有効なWebサーバーである必要があります。たぶん。

于 2013-02-21T15:59:49.640 に答える
7

はいといいえ。たとえば、Showクラスには関連付けられた法律がなく、確かに便利です。

ただし、型クラスはインターフェイスを表現します。インターフェイスは単なる関数の集まりではなく、これらの関数が仕様を満たす必要があります。仕様は通常、Haskell の型システムで表現できるものよりも複雑です。たとえば、Eq授業を受けます。関数を提供するだけでよく、その型は でなければなりませんa -> a -> Bool。これは、Haskell の型システムが型のインスタンスから要求できる最大値ですEq。ただし、通常、この関数にはより多くのことが期待されます。おそらく、同値関係 (再帰的、対称的、および推移的) である必要があります。したがって、これらの要件を個別の「法律」として述べています。

于 2013-02-21T14:18:13.410 に答える
1

型クラスは法則を持つ必要はありませんが、法則があるとより便利になることがよくあります。多くの型クラスは特定の方法で機能することが期待されており、法則はユーザーの期待を体系化しています。法則により、ユーザーは型クラスのインスタンスがどのように機能するかについて仮定を立てることができます。型クラスの法則に違反しても、Haskell 警察に逮捕されることはなく、ユーザーを混乱させるだけです。

于 2013-02-21T14:13:03.657 に答える