我想知道为什么PureScript无法匹配角色与角色相同的两种约束类型!请参阅下面的错误消息。生成它的代码紧接在下面给出:
db.trails.find({}, {"Copper": { $elemMatch: { "name" : "Spaulding Bowl" } } } )
编译错误:
-- We are using https://pursuit.purescript.org/packages/purescript-sized-vectors/1.0.0
import Data.Typelevel.Num (class Lt, class Nat, D2, D7)
import Data.Vec (Vec, modifyAt)
import Prelude (($))
newtype FixedMatrix72 a = FixedMatrix72 (Vec D2 (Vec D7 a))
type Row = forall n. (Nat n, Lt n D2) => n
type Col = forall n. (Nat n, Lt n D7) => n
newtype Ref = Ref { row :: Row, col :: Col }
-- Compiler error is for this function
modify :: forall a. Ref -> (a -> a) -> FixedMatrix72 a -> FixedMatrix72 a
modify (Ref ref) f (FixedMatrix72 m) =
FixedMatrix72 $ modifyAt ref.row (modifyAt ref.col f) m
答案 0 :(得分:2)
错误信息不是很好,但并不是说这些类型不是统一的。它说编译器不会尝试统一约束类型,因为传递正确的字典变得复杂。因此,如果我们在类型检查器中达到这一点,我们就会放弃并显示此错误消息。
幸运的是,它只出现在非常特殊的情况下,涉及类型系统特征之间的各种交互(在这种情况下,其字段类型是多态的并且涉及类型类的记录)。
一种解决方案是使用newtype
而不是类型同义词。