在PureScript中使用多参数类型类是否合理?
编译器针对以下类型类定义引发了一个不合理的“找不到类型类实例”错误(请参阅full output):
class Transform model turn where
transform :: turn -> model -> model
delay :: Maybe turn -> Int
错误源于delay
函数的定义,该函数不依赖于model
类型参数。从上面链接的编译器输出可以看出,它将t0替换为缺席模型。
解决此问题的正确方法是什么?目前,我通过更改turn
的类型来解决此问题,如下所示:
class Turnable model turn where
runTurn :: turn model -> model -> model
turnDelay :: Maybe (turn model) -> Int
答案 0 :(得分:1)
添加fundep
| turn -> model
然后仅通过
查找实例turn
因此我将类型类定义更改为:
class Turnable model turn | turn -> model where
runTurn :: turn -> model -> model
turnDelay :: Maybe turn -> Int
这让编译器感到高兴。有关详细信息,请参阅Haskell wiki中的Functional dependencies(fundep)和24 days of PureScript post。
答案 1 :(得分:0)
...在过去,我们使用了代理(https://github.com/purescript/purescript-proxy)来帮助编译器决定选择哪个实例。 例如:
this.y -= 0.1
并通过传递代理来调用它:
this.incr = 0;
this.incr += 0.1;
if(this.incr == 1){
this.y += 0.1;
}
else if(this.incr == -1){
this.y -= 0.1;
}
我同意FunDeps是正确的方法。