PureScript无法匹配相同的约束类型

时间:2016-12-11 16:08:00

标签: compiler-errors purescript

我想知道为什么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

1 个答案:

答案 0 :(得分:2)

错误信息不是很好,但并不是说这些类型不是统一的。它说编译器不会尝试统一约束类型,因为传递正确的字典变得复杂。因此,如果我们在类型检查器中达到这一点,我们就会放弃并显示此错误消息。

幸运的是,它只出现在非常特殊的情况下,涉及类型系统特征之间的各种交互(在这种情况下,其字段类型是多态的并且涉及类型类的记录)。

一种解决方案是使用newtype而不是类型同义词。