これは哲学的な質問ですが、私は公式の文書や「神の言葉」(読者:SPJ)によって答えたいと思っています。ハスケル委員会が、パターンマッチングに基づいたより統一的な解決策ではなく、明示的なインタフェースを型式で要求することを選択したという特別な理由はありますか?パターンマッチングだけでなく、なぜタイプキャスティングを使用するのですか?
例として、Eq
を取る:
class Eq a where
(==), (/=) :: a -> a -> Bool
x == y = not $ x /= y
x /= y = not $ x == y
instance Eq Int where
(==) = internalIntEq
を私たちは、代わりにこのような何かを行うことができなかったのはなぜ(疑似ハスケルとクマ):Haskellはした場合、ある
(==), (/=) :: a -> a -> Bool
default x == y = not $ x /= y -- 1
default x /= y = not $ x == y
(Int a) == (Int b) = a `internalIntEq` b -- 2
通常のデータ型のパターンマッチングを可能にする:
プログラマーが作成できるアドホックのクラス、すなわち、
instance
は暗黙のだろう(2)タイプまだ推測されると、静的マッチした可能性があり(
SupportsEqualsEquals a => ...
)デフォルトの実装は、「無料で」
クラスの来る可能性
デフォルトのパターン(1)を指定する方法が必要になりますが、それ以前に宣言されていますがs、常に最後に一致します。これらの仮想的な特徴のいずれかがハスケルに固有のものと衝突するか?タイプを正確に推論することが困難または不可能になるか?それは、Haskellの残りの部分と非常にうまく連携する強力な機能のように思われるので、We Do It Do It Way™という理由があると思います。アドホック多型のこのメカニズムは単に ad-hocですか?
私はこのに精通していないんだけど、私は一つの大きな問題は、あなたがparametricityを失うということだと思うので、無料の定理:あなたはどのような 'ID ::知っている - (> A'または' FST ::、 b) - > a'は型のシグネチャだけで行います。なぜならそれらはパラメトリック多形性しか持たないからです。何らかのタイプチェイスの仕組みがあれば、パラメトリック性が失われます。たとえば、 'a - > a - > Bool'は、Haskell(' const $ const True'と 'const $ const False')で2つの(合計)実装しか許されません。 typecaseがある場合、この保証は失われます。 –
@ AntalS-Z:私はあなたを正しく理解していることを確認しています。 'id :: a - > a'を宣言し、' id(Int i)= i + 1'を定義できると言っていますか?これはそうではないので、後者の定義は 'SupportsPlus a => a - > a'のタイプになります。これは互換性がありません。 –
それはあなたの質問から聞こえるようなものです。 '(==)'の型署名は 'a - > a - > Bool'として与えられます。 「タイプクラス」「SupportsEquals」を指定する必要がある場合は、あなたが行ったすべての構文が周囲の構文と交換されているように見えます。なぜそれが*別のものかはわかりません。そして、私はマルチパラメータ型のクラス、関数の依存関係、または関連する型を表現することはできないと考えていますが、これらは当然のことではありませんでした。実際、より高級なタイプのクラスを表現することはできますか? 'return :: a m a'は' a'ではなく 'm'の上でアドホックになるはずです。 –