固定大小矩阵和 Maybe

Fixed size matrix and Maybe

我正在用 PureScript 编写一个棋盘游戏,它涉及一个精确大小为 2x7 的矩阵(在某些变体中它可以是 4x7)。我正在使用的包有一个 Matrix.getRow 函数 return 是 Maybe (Array a)

当我确定 Matrix.getRow 0 总是转到 return 第一行(因为矩阵的大小固定为 2x7)?

目前我有处理 Maybes 的丑陋代码,这显然不是很理想:

notPossible :: Array Cell
notPossible = [99, 99, 99, 99, 99, 99, 99]  -- never used

row n = fromMaybe notPossible $ Matrix.getRow n state.cells

PureScript 使用类型系统来跟踪偏向性,其中偏向性是 属性 函数不会为所有可能的输入生成 return 值。

如果您想规避类型系统并保证自己不会传递无效输入,您可以使用 purescript-partial 包中的 Partial.Unsafe.unsafePartial :: forall a. (Partial => a) -> a 函数。

通过使用来自 Data.Maybe

的偏函数 fromJust
Data.Maybe.fromJust :: forall a. Partial => Maybe a -> a

然后您可以构建不安全行函数:

unsafeRow n xs = unsafePartial fromJust (Matrix.getRow n xs)

您还可以将 unsafePartial 的调用延迟到可以保证您的索引永远不会越界的程度,因为类型系统会自动为您传播它。