Nin*_*els 2 types elm union-types
我正在学习 elm 并试图从 TypeScript 的类型系统转换我的思维方式。我想知道使用这样的嵌套类型的最佳方法是什么:
type Player = X | O
type Cell = Player | Empty
viewCell: Cell -> string
viewCell cell =
case cell of
X -> "X"
O -> "O"
Empty -> " "
Run Code Online (Sandbox Code Playgroud)
编译器抱怨
The first pattern is trying to match `X` values of type:
Player
But the expression between `case` and `of` is:
Cell
Run Code Online (Sandbox Code Playgroud)
我可以像这样更改 viewCell,但是我不知道如何获得播放器
viewCell: Cell -> String
viewCell cell =
case cell of
Player -> -- how to get the player ??
Empty -> " "
Run Code Online (Sandbox Code Playgroud)
问题不在于显示值本身,而是“解构”嵌套的联合类型可以这么说。我想稍后在这样的事情中使用它:
check: (List Cell) -> string
check three =
case three of
[X, X, X] -> "X won"
[O, O, O] -> "O won"
_ -> "still going"
Run Code Online (Sandbox Code Playgroud)
这也给了我来自编译器的类似抱怨
在
type Cell = Player | Empty
Run Code Online (Sandbox Code Playgroud)
Player不是类型,而是 type 的值Cell。然而,您也可以给它一个参数,在这种情况下,它将是一个值构造函数,当给定参数时,它返回一个类型的值Cell。所以在
type Player = X | O
type Cell = Player Player | Empty
Run Code Online (Sandbox Code Playgroud)
第一个PlayerinPlayer Player本质上是一个函数,当给定 type 的值时,Player它将返回 type 的值Cell。或者Player -> Cell用类型说话。
另请注意,类型和构造函数可以具有相同的名称,因为它们位于不同的域中。它们并不冲突,因为它们引用不同的事物,一个引用类型,另一个引用值(构造函数)。但事实上你可以并不一定意味着你应该这样做,因为这可能会非常令人困惑。
然后,您可以进行模式匹配Cell和嵌套,Player如下所示:
type Player = X | O
type Cell = Player Player | Empty
viewCell: Cell -> String
viewCell cell =
case cell of
Player X -> "X"
Player O -> "O"
Empty -> " "
Run Code Online (Sandbox Code Playgroud)
Player这里Empty指的是 的构造函数/变体Cell,而不是类型。类似地X, 和O指的是 的变体Player,它们也不是类型。
| 归档时间: |
|
| 查看次数: |
183 次 |
| 最近记录: |