2016-07-03 9 views
1

以下を考慮してください。なぜそれは動作しません。そして私はそれをどのように機能させることができますか?elmのcase文で文字列の値を取得する方法

type IntOrString 
    = String 
    | Int 

getInt : IntOrString -> String 
getInt intOrString = 
    case intOrString of 
    String -> 
     intOrString 

    Int -> 
     toString intOrString 

答えて

6

IntOrStringタイプのあなたの宣言は、あなたが、整数または文字列を保持できるタイプにしたいことを示していると思われます。しかし、それはあなたが作成したものではありません。私はエルムガイドでsection on Union Typesを読むことをお勧めします。

ユニオンタイプを宣言するときは、コンストラクタを作成する必要があります。あなたの例では、実際には2つのコンストラクタを持つ型を作成していますが、いずれもパラメータを含んでいないので、IntStringと呼びますが、エルムのネイティブ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 
+0

こんにちはチャド、明確にするためのおかげで。私は、組み込みタイプのものと組み合わせることができるタイプスクリプトのような言語でユニオンタイプを考えていました。それは同じ名前で違うものです。 – Prabhjot

関連する問題