【发布时间】:2015-12-21 10:38:29
【问题描述】:
我想让以下类型可推断:
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 类型检查器构建类型化 EDSL。例如,如果变量(Int 或 Float)“p”乘以 Float,我想将“p”推断为 Float。所以也欢迎解决这个问题。
【问题讨论】:
-
如前所述,由于您提到的原因,这是无法解决的:类型类是开放的。你可以尝试使用函数依赖或类型族,如果它们可以实现你自己的目标。
-
没错,我尝试了一些不同风格的代码,但任何尝试都没有成功......我想知道这可以使用封闭类型族解决,但我不知道怎么办。
-
封闭类型族是不够的,你还需要单射类型族,它们很快就会出现(tm)。