是否有可能迭代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) ]

声明函数的问题:

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中获得所有可能的数据类型值的列表,这也回答了这个问题。

相关内容

最新更新