我正在尝试按照Model the problem文章中的指南在Elm中创建一个Palette类型。我的第一个想法是说:
type alias Palette = List Color
但这有缺点。调色板是一个颜色列表,但它也必须有两种颜色,一种用于背景,一种用于前景。
我的第二次尝试是记录类型:
type alias Palette =
{ bg : Color
, fg : List Color
}
这样更好,但如何确保fg
字段是包含至少一个元素的列表?
有关如何在功能上思考的任何提示和make illegal states unrepresentable?
谢谢!
答案 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
字段至少有一个值。