IntOrString
タイプのあなたの宣言は、あなたが、整数または文字列を保持できるタイプにしたいことを示していると思われます。しかし、それはあなたが作成したものではありません。私はエルムガイドでsection on Union Typesを読むことをお勧めします。
ユニオンタイプを宣言するときは、コンストラクタを作成する必要があります。あなたの例では、実際には2つのコンストラクタを持つ型を作成していますが、いずれもパラメータを含んでいないので、Int
とString
と呼びますが、エルムのネイティブInt
およびString
型とは関係しません。この場合、C#やJavaなどの言語の列挙型とほぼ同じと見なすことができます。
さらに、既存の型と衝突するコンストラクタ名が作成されているため、コンパイラの混乱が生じます。コード内のどこかで、Int
またはString
と言ったときに混乱します。
整数型または文字列型の値を保持できる単一の型になるように型を再定義しましょう。名前の衝突を避けるためにコンストラクタの名前を変更します。
type IntOrString
= MyString String
| MyInt Int
そして今、あなたは新しい定義に基づいてgetInt
機能を微調整することができます。パターンマッチングは、それを作成するために使用されたコンストラクタに基づいてIntOrString
値のうち、文字列または整数値を引くために使用されている様子がわかります
getInt : IntOrString -> String
getInt intOrString =
case intOrString of
MyString s ->
s
MyInt i ->
toString i
こんにちはチャド、明確にするためのおかげで。私は、組み込みタイプのものと組み合わせることができるタイプスクリプトのような言語でユニオンタイプを考えていました。それは同じ名前で違うものです。 – Prabhjot