提问人: 提问时间:7/8/2021 最后编辑:David Young 更新时间:7/9/2021 访问量:176
是否有可行且类型安全的替代方法,以替代 1:1 类型/类型类实例关系?
Are there viable and type safe alternatives to the 1:1 type/type-class-instance relation?
问:
这个问题最初是在我研究动态 JS 类型验证器时出现的,该验证器依赖于字典传递样式作为相当简单的类型类机制,但我认为它也适用于 Haskell 或其他具有类型类机制的语言。
起初,我认为在具有字典传递样式的设置中允许每种类型使用多个类型类实例不会有太大的问题,因为我可以完全控制类型类的解析。但实际问题似乎是维护类型安全而不是类型类解析,因为我将使用类型验证器进行演示。由于代码是类型注释的,因此在某种程度上与语言无关。
// please assume `Number` to be a non-polymorphic `Int` type
Sum.Monoid // Monoid<Number>
Prod.Monoid // Monoid<Number>
Function.Monoid // Monoid<b> -> Monoid<(a -> b)>
Function.Monoid(Prod.Monoid) // Monoid<(a -> Number)>
Function.Monoid(Prod.Monoid).append // (a -> Number) -> (a -> Number) -> a -> Number
当您应用这些类型时,类型安全是可以简化的,因为可以只编写以下人为的表达式,而不会让验证者抱怨:
Function.Monoid(Prod.Monoid)
.append(inc) (inc) (Sum.Monoid.empty); // yields 1 ((0 + 1) * (0 + 1)) instead of 4 ((1 + 1) * (1 + 1))
在Haskell中,每个实例都有自己独特的类型,以防止这种无意义的表达。但是,必须从一个类型包装器转换为另一个类型包装器可能会很乏味。
有没有一个可行的、类型安全的替代方案,或者这就是 Haskell 的设计者选择每个类实例的不同类型简化的原因?
答:
在某些情况下,您可以安全地使用本地显式实例。在 Haskell 中,该库可用于创建这样的本地实例。例如,请参阅 Reified Monoids。reflection
还有一篇关于将其构建到语言中并可能使其更可用和更通用的论文,但我没有读过它:Thomas Winant 和 Dominique Devriese 的 Haskell 的 Coherent Explicit Dictionary Application,以下是他们贡献部分的引述:
在本文中,我们提出了一种新的显式词典形式 实例化,保持连贯性,并且安全 尊重实例的全局唯一性,但可以直接 适用于常见用例。
评论
Fold
Foldable
Traversal
Traversable
Monoid
Functor
Applicative
也许一种可能性是具有某种作用域实例机制。有点半生不熟,但想象一下写这样的东西:
with Prod.Monoid, Function.Monoid {
append(inc)(inc)(empty)
}
(Say 是 的缩写。据推测,在该范围内为给定的类/类型对引入第二个实例将是一个错误:with X, Y, Z {e}
with X {with Y {with Z {e}}}
with Prod.Monoid, Function.Monoid {
-- error: conflicting instances for Number
-- currently in scope: Prod.Monoid
-- proposed additional instance: Sum.Monoid
append(inc)(inc)(with Sum.Monoid {empty})
}
但是,允许在不同的范围内使用不同的实例:
with Prod.Monoid, Function.Monoid {
append(inc)(inc)
}(with Sum.Monoid {empty})
尽管你提出的术语仍然可以这样写,但至少它会明确抽象边界的位置。
使这样的特征在存在多态性和高阶函数的情况下正常工作似乎是......令人兴奋的。可能是可发表的研究水平令人兴奋。我很想知道是否可以一直推动一个专注的尝试。
评论
ST
Data.Map
Ord
Ord
Ord
Data.Map
Ord k
merge
下一个:将闭包表示为有限项
评论
Sum
Prod
Number
Symbol