我正在用F#编写一个国际象棋引擎,我正在考虑如何表示棋盘位置。
电路板数据结构是64个元素的数组。由于只有64个可能的索引,我想把它限制为一个单例区分的联合,而不是一个普通的int [<Struct>]type BoardPosition = Position of int
,这将有助于我更好地推理,并可能减少测试的数量。
如何使用Position
类型来索引数组?我试着测试将其转换为显式((int) data
),但似乎不起作用
我的方法是否理想?使用区分联合是否有一些主要的开销,我应该坚持使用常规的int?
3条答案
按热度按时间zsohkypk1#
由于您已经将索引 Package 在一个新类型中,因此必须将该类型展开,以便访问原始索引。您可以使用模式匹配来实现这一点:
简单用法示例:
这里有一些性能和认知开销,因此您必须决定是否值得。一般来说,这个主题被称为“primitive obsession”。
xxhby3vn2#
使用数组来表示棋盘绝对是一种选择--但是如果您想使用不可变的数据结构以函数的方式编写象棋引擎,那么它可能不会产生最好的代码。
我会考虑使用
Map
来代表董事会,将棋子分配到位置。这一点的好处是,它可以很容易地创建一个更改了一个位置的董事会副本(以便您可以使用它)。例如,模拟各种移动)。我主要考虑的是写代码有多容易--效率是另一个关注点(但也许不是一个值得以后担心的问题)。我会从以下内容开始:
js81xvg63#
将元数据附加到
int
等原语的一种零开销方法是使用Units of Measure上面展示了如何围绕数组创建度量安全 Package 器并访问它。