Ben*_*son 4 haskell typeclass functional-dependencies
我试图了解Haskell的Data.Collection图书馆的设计,来自Scala识字的背景.
它使用功能依赖(具有Scala模拟),但它们的使用方式对我来说没有意义.在Unfoldable下面再现的类中,元素类型i显示为由集合类型确定c.
Run Code Online (Sandbox Code Playgroud)class Unfoldable c i | c -> i具有不可观察元素的集合类.这是
Foldable班级的双重性.
请解释依赖关系c -> i在这里扮演的角色和设计意图,理想情况下是一个使用示例?
由该函数依赖性表示的约束是给定集合类型c,其项目的类型i已经确定.例如,如果c ~ [a],即集合是as 的列表,那么我们应该能够确定i ~ a.
如果没有这个函数依赖,我们可以有两个实例如Unfoldable [a] a(明显的/预期的实例)和Unfoldable [a] [a](喜欢的东西insert = concat,singleton = id).如果类型检查器看到类似的东西empty :: [a],它将无法选择使用哪个实例:
{-# LANGUAGE MultiParamTypeClasses, FlexibleInstances #-}
class Unfoldable c i where
empty :: c
instance Unfoldable [a] a where
empty = []
instance Unfoldable [a] [a] where
empty = []
xs :: [a]
xs = empty
Run Code Online (Sandbox Code Playgroud)
这导致:
No instance for (Unfoldable [a] i0) arising from a use of `empty'
The type variable `i0' is ambiguous
Relevant bindings include
xs :: [a]
Note: there are several potential instances:
instance Unfoldable [a] a
instance Unfoldable [a] [a]
In the expression: empty
In an equation for `xs': xs = empty
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
96 次 |
| 最近记录: |