固定大小矩阵和 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 的调用延迟到可以保证您的索引永远不会越界的程度,因为类型系统会自动为您传播它。
我正在用 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 的调用延迟到可以保证您的索引永远不会越界的程度,因为类型系统会自动为您传播它。