2016-06-30 2 views
9

私は、ユーザーにレンダリングする色の型結合を持っています。すべての型の共用体の値を反復処理できますか?Elmでユニオンタイプを反復処理できますか?

type Color = Red | Blue | Green | Black 

colorToStirng color = 
    case color of 
     Red -> "red" 
     Blue -> "blue" 
     Green -> "green" 
     Black -> "black" 

colorList = 
    ul 
     [] 
     List.map colorListItem Color -- <- this is the missing puzzle 

colorListItem color = 
    li [class "color-" ++ (colorToString color) ] [ text (colorToString color) ] 

答えて

6

残念ながら、それは不可能。

Colorタイプのような有限数の値を持つ単純な型の場合、コンパイラはそのようなリストを生成できるはずです。限りコンパイラがが懸念しているとして、

type Thing = Thing String 

のようなあなたのタイプと型の間に違いはタイプThingのすべての値を反復するにはありません、その後タイプStringのすべての値を反復が必要となります。

+0

代わりに単純な文字列リストを使用します。 –

3

もちろん、あなたはそれを行うことができます。コンパイラを介して自動的には行われません。

type Foo 
    = Bar 
    | Baz 
    | Wiz 

-- just write this for types 
-- you wish to use as enumerations 
enumFoo = 
    [ Bar 
    , Baz 
    , Wiz ] 

これはうまく動作しますが、明らかに列挙はこれまでに、コンパイラによってサポートされている場合、チェックをよりよいと網羅性だろう。

colorList = 
ul 
    [] 
    List.map colorListItem enumFoo 
10

のような関数を宣言すると問題:

type Foo 
    = Bar 
    | Baz 

enumFoo = 
    [ Bar 
    , Baz ] 

あなたはおそらくそれに新しい列挙型を追加するのを忘れということです。

enumFoo : List Foo 
enumFoo = 
    let 
    ignored thing = 
     case thing of 
      Bar -> () 
      Baz ->() 
      -- add new instances to the list below! 
in [ Bar, Baz ] 

あなたは、少なくとも機能のエラーを取得し、うまくいけば追加することを忘れないでください。この方法:この問題を解決するには、私がアイデア(ハックが、上記の考え方未満ハック)これでプレーしてきましたそれをリストに追加します。とにかくありがとうございます。

+3

これは実際にはこのような制限のための賢明な回避策です。ありがとう! – pietro909

+0

'thing'はどこで定義されますか? – JustGage

+1

"ignored"は関数なので、 "thing"が引数です。この関数は決して呼び出されませんが、すべての列挙がcaseステートメントにリストされていることをコンパイラーに確認するように指示します。これは以下の配列から完全に分離されています - "[Bar、Baz]" - このアプローチは、リストの近くにコンパイラエラーを表示する方法です。プログラマが配列にエントリを追加するよう注意する必要があります。 –

関連する問題