我有一个想要呈现给用户的颜色类型联合。是否有可能遍历所有类型的联合值?
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) ]
声明函数的问题:
type Foo
= Bar
| Baz
enumFoo =
[ Bar
, Baz ]
是您可能会忘记向其添加新枚举。为了解决这个问题,我一直在玩这个(很hacky,但没有上面的想法那么hacky)的想法:
enumFoo : List Foo
enumFoo =
let
ignored thing =
case thing of
Bar -> ()
Baz -> ()
-- add new instances to the list below!
in [ Bar, Baz ]
这样至少可以得到函数的错误,希望不要忘记将其添加到列表中。
遗憾的是,没有。这是不可能的。
对于具有有限数量值的简单类型,例如您的Color
类型,编译器似乎应该能够生成这样的列表。但就编译器而言,您的类型与
type Thing = Thing String
如果要遍历所有类型为Thing
的值,则需要遍历所有类型为String
的值。
当然可以。只是不会自动通过编译器。
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
这并没有完全回答你的问题,但是由于Elm与Haskell非常相似,我可能不是唯一一个想知道Haskell的故事是什么的人。
在Haskell(显示ghci)中,你可以这样做:
Prelude> data Color = Red | Blue | Green | Black deriving (Show, Bounded, Enum)
Prelude> [minBound..maxBound]::[Color]
[Red,Blue,Green,Black]
也许elm的未来版本会借鉴它。
编辑:我发现在Haskell中获得所有可能的数据类型值的列表,这也回答了这个问题。