需要帮助建模调色板类型

时间:2016-05-16 15:05:33

标签: functional-programming elm

我正在尝试按照Model the problem文章中的指南在Elm中创建一个Palette类型。我的第一个想法是说:

type alias Palette = List Color

但这有缺点。调色板是一个颜色列表,但它也必须有两种颜色,一种用于背景,一种用于前景。

我的第二次尝试是记录类型:

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

这样更好,但如何确保fg字段是包含至少一个元素的列表?

有关如何在功能上思考的任何提示和make illegal states unrepresentable

谢谢!

1 个答案:

答案 0 :(得分:3)

如果我正确理解您的问题,您正在寻找表示至少包含一个元素的列表的数据类型。您可以使用以下内容定义自己的列表:

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

为了让生活更轻松,您可以定义一些辅助函数,以便您可以转换为正常的Elm 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字段至少有一个值。