我正在使用linear
库,我试图创建一种推理三角矩阵的方法。
作为第一步,我尝试创建一种方法来计算下三角矩阵的大小。例如,M22
具有包含3个元素的下三角矩阵,因此它将映射到V3
。
这是我的尝试:
import Linear
type family LowerTriPacked v :: * -> *
type instance LowerTriPacked V0 = V0
type instance LowerTriPacked V1 = V1
type instance LowerTriPacked V2 = V3
但它没有打字,但是:
Expecting one more argument to ‘V0’
The first argument of ‘LowerTriPacked’ should have kind ‘*’,
but ‘V0’ has kind ‘* -> *’
In the type ‘V0’
In the type instance declaration for ‘LowerTriPacked’
这是类型检查:
type family LowerTriPacked2 v :: *
type instance LowerTriPacked2 (V0 a) = V0 a
type instance LowerTriPacked2 (V1 a) = V1 a
type instance LowerTriPacked2 (V2 a) = V3 a
但它不是我想要的,因为现在我无法使用
class (Traversable (LowerTriPacked2 v a)) => Triangular v a
因为Traversable
有* -> *
种。
第一次尝试的语法出了什么问题?
答案 0 :(得分:11)
参数的默认种类是*
;但您可以通过提供类型注释来覆盖默认值。像这样:
type family LowerTriPacked (v :: * -> *) :: * -> *