2016-05-16 12 views
2

Model the problemのガイドラインに従って、Elmにパレットタイプを作成しようとしています。私の最初の考えは、言うべきことでした:しかし、これには欠点があります。パレットは色のリストですが、背景色と前景色の2つの色も必要です。これは良いですが、どのように私はfgフィールドは、少なくとも一つの要素を持つリストであることを確認してくださいパレットタイプのモデリングに役立つ

type alias Palette = 
    { bg : Color 
    , fg : List Color 
    } 

私の2回目の試行は、レコード・タイプを持っていましたか?

機能的に考える方法に関するヒントとmake illegal states unrepresentable

ありがとうございます!

答えて

3

質問を正しく理解している場合は、少なくとも1つの要素を含むリストを表すデータ型を探しています。あなたはこのようなものを使用して独自のようなリストを定義することができます。

type NonEmptyList a = ListItem a (NonEmptyList a) | RootItem a 

を人生を容易にするには、通常のエルムListにしてから変換することができるように、あなたは、いくつかのヘルパー関数を定義することができます。

toList : NonEmptyList a -> List a 
toList list = 
    case list of 
    RootItem x -> [x] 
    ListItem x rest -> x :: toList rest 

fromList : List a -> Maybe (NonEmptyList a) 
fromList list = 
    case list of 
    [] -> Nothing 
    [x] -> Just (RootItem x) 
    (x::xs) -> Maybe.map (ListItem x) <| fromList xs 

これで、新しい空でないリストに関してパレットを定義できます。

type alias Palette = 
    { bg : Color 
    , fg : NonEmptyList Color 
    } 

今、あなたのfgフィールドは常に少なくとも1つの値を持つことがコンパイラによって保証されています。

関連する問題