函数依赖在Haskell Collection API的"Unfoldable"类型类中的作用

Ben*_*son 4 haskell typeclass functional-dependencies

我试图了解Haskell的Data.Collection图书馆的设计,来自Scala识字的背景.

它使用功能依赖(具有Scala模拟),但它们的使用方式对我来说没有意义.在Unfoldable下面再现的类中,元素类型i显示为由集合类型确定c.

class Unfoldable c i | c -> i
Run Code Online (Sandbox Code Playgroud)

具有不可观察元素的集合类.这是Foldable班级的双重性.

请解释依赖关系c -> i在这里扮演的角色和设计意图,理想情况下是一个使用示例?

Cac*_*tus 7

由该函数依赖性表示的约束是给定集合类型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)