types - 榆树中的“嵌套”联合类型
问题描述
我正在学习 elm 并试图从 TypeScript 的类型系统中转换我的思维方式。我想知道使用这样的嵌套类型的最佳方法是什么:
type Player = X | O
type Cell = Player | Empty
viewCell: Cell -> string
viewCell cell =
case cell of
X -> "X"
O -> "O"
Empty -> " "
编译器抱怨
The first pattern is trying to match `X` values of type:
Player
But the expression between `case` and `of` is:
Cell
我可以像这样更改 viewCell ,但是我不知道如何获取播放器
viewCell: Cell -> String
viewCell cell =
case cell of
Player -> -- how to get the player ??
Empty -> " "
问题不在于显示值本身,而是可以说“解构”嵌套联合类型。我想稍后在这样的地方使用它:
check: (List Cell) -> string
check three =
case three of
[X, X, X] -> "X won"
[O, O, O] -> "O won"
_ -> "still going"
这也给了我来自编译器的类似抱怨
解决方案
在
type Cell = Player | Empty
Player
不是类型,而是类型的值Cell
。但是,您也可以给它一个参数,在这种情况下,它将是一个值构造函数,当给定一个参数时,它会返回一个 type 的值Cell
。所以在
type Player = X | O
type Cell = Player Player | Empty
first Player
inPlayer 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 -> " "
Player
这里Empty
指的是 的构造函数/变体Cell
,而不是类型。同样X
, andO
指的是 的变体Player
,它们也不是类型。
推荐阅读
- typescript - 如何在 Ionic React 中将道具传递给选项卡
- c++ - 在编译时检测 std::tuple 中的类型包含
- angular - 刷新页面时 AuthGuard 不起作用
- python - 通过不同的功能携带结果数据帧
- python - 向 JSON 对象挂钩添加类型提示的正确方法
- python - 如何测试方法中的单个调用?
- javascript - why does this function not work? I want it to count backwards from 10 to 1
- javascript - Eventbrite 与 Webflow 表单的集成
- json - 未处理的异常:类型 '(dynamic) => Welcome' 不是类型 '(String, dynamic) => MapEntry 的子类型
'的'转变' - java - 在管道作业期间找不到托管在 GitLab 的 maven 存储库中的依赖项