2017-03-23 23 views
2

LYAHは言う:ユニット型がEnum型クラスのメンバであるのはなぜですか?

Enumメンバーが順次タイプを命じている - 彼らは列挙することができます。 Enum typeclassの主な利点は、リストの範囲で型を使用できることです。彼らはまた、succpred関数で得ることができる後継者と前任者を定義しました。このクラスのタイプは(),Bool,Char,Ordering,Int,Integer,FloatおよびDoubleです。

なぜ()はこのtypeclassのメンバーですか? succpredは常に失敗し、リスト範囲内でそれを使用すると、それ自体は()となります。という意味で、必要な機能をすべてサポートしています。

+0

また、「Bounded」なので、 '[minBound..maxBound]'が動作します。 –

答えて

4

これらの種類の非公式の方針は、「それが(法に準拠した形で)不可能でない限り、それをインスタンスにする」ことです。このポリシーは過去にいくつかの驚きを引き起こしています(タプルのためのインスタンスはFoldable/Traversable)が、大部分は正のものです。さまざまなクラスのポリモーフィックを使用したいいくつかの関数に遭遇し、具体的な型が適切な型を持っているので、現在のコードで必要となる具体的な型に対してうまく機能することがわかりますインスタンスは定位置にある。

+3

私はそれが公式かそれとも公式かとは思いません(私はそれに同意しないでしょう)。それ以外の場合は、インスタンスMonoid Int {mempty = 0; mappend =(+)} 'となります。私はむしろ、「法を遵守し、非病理学的にそれを行う方法が1つあれば、それをインスタンスにしてください」と言っています。 "非病的な"ビットは当然少し曖昧ですが、 'Enum()'の場合、インスタンスが何をしなければならないかははっきりしています。 – leftaroundabout

+0

@leftaroundaboutニュアンスに感謝します。私は、それが政策の重要な部分であることに同意します。 –

+0

'Foldable' /' Traversable'を展開するには、このコードを 'maximum(1,0)'と考えてください。タプルの 'Foldable'のインスタンスは' foldMap f(_、 ')のように2番目の要素を「折りたたみ」のものと見なすので、実際には '1'のように見えますが、 y)= fy'となる。 – Lazersmoke

関連する問題