Haskell には構造型がありますが、構造型はありません。これは今後も変わらないでしょう。*
交換可能な引数として、名目上は異なるが構造的に類似した型を許可することを拒否することを、型安全性と呼びます。それは良いことです。Haskell には、名目上だけ異なる型を提供する newtype 宣言さえあり、型の安全性を強化することができます。型の安全性は、実行時にバグを許可するのではなく、バグを早期に発見する簡単な方法です。
型クラスを介したアドホック ポリモーフィズム (事実上、プログラマーが宣言した機能の等価性) を含む amindfv の優れた回答に加えて、絶対に任意の型を許可するパラメトリック ポリモーフィズムがあるため[a]
、リスト内のBTree a
任意の型を許可し、バイナリ ツリー内の任意の型を許可します。
これにより、「これらのタイプは互換性がありますか?」に対する 3 つの答えが得られます。
- いいえ; プログラマーはそうは言いませんでした。
- プログラマーがそう言ったので、特定の目的に相当します。
- 気にしないでください。データ自体のプロパティを使用しないため、このデータのコレクションに対して同じことを行うことができます。
4 はありません: コンパイラーは、他の関数のように 2 つの Int と String をたまたま使用したため、プログラマーを無効にします。
*Haskell が構造型付けに変わる可能性は低いと言いました。何らかの形式の拡張可能なレコードを導入するためのいくつかの議論がありますが、 と同じまたは同じように(Int,(Int,Int))
カウントする計画はありません。(Int, Int, Int)
Triple {one::Int, two::Int, three::Int}
Triple2 {one2::Int, two2::Int, three2::Int}