'在多参数类型类中找不到类型类实例

时间:2016-12-11 06:00:17

标签: typeclass purescript

在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

2 个答案:

答案 0 :(得分:1)

来自FP松弛通道的右侧给出了这个答案:

  

添加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是正确的方法。