我要让以下类型推断出来:型一流难以推断
class Lit a
instance Lit Int
instance Lit Float
class App a b
instance App Float b
f :: (Lit a, App a b) => a -> b -- a should be Float
我知道这个样品无法推断a
到Float
因为类型的类可以不是封闭的,至少。
我该怎么做才能达到目的?
此外,我想要做的事情是使用TH和Haskell类型检查器构造Typed EDSL。例如如果变量(Int或Float)“p”乘以Float,我想推断“p”为Float。所以这个解决方案也是受欢迎的。
如前所述,由于您提到的原因,它是无法解决的:typeclasses是开放的。您可以尝试使用功能依赖关系或键入系列,如果这些可以使您自己的目标成为可能的话。 – chi
这是正确的,我尝试了一些不同的代码风格,但任何尝试都没有成功......我想知道这可以使用封闭类型的家庭来解决,但我不知道该怎么做。 – phi16
封闭式家庭是不够的,你也需要内射型家庭,这些家庭即将到来(tm)。 – sclv