2016-07-26 4 views
4

ハスケルのData.Collectionライブラリの設計を理解しようとしていますが、これはScalaを熟知したバックグラウンドからのものです。Haskell Collection APIの `Unfoldable` typeclassにおける関数依存関係の役割

Scala analogを持っています)Functional Dependenciesを使用していますが、使用方法はわかりません。 クラスでは、要素タイプiは、コレクションタイプcで決定されたとして示されています。観察不能な要素を持つコレクションの

class Unfoldable c i | c -> i 

クラス。それはFoldableクラスのデュアルです。

c -> iがここで果たしている役割とデザインの意図、理想的には使用例を説明してください。

答えて

7

この関数の依存関係で表される制約は、コレクションタイプがcの場合、そのアイテムのタイプはiです。たとえば、c ~ [a]、つまりコレクションがaのリストである場合は、i ~ aと判断できるはずです。

このような関数の依存関係がなければ、2つのインスタンスを持つことができます。 Unfoldable [a] a(明らか/意図されたインスタンス)およびUnfoldable [a] [a]insert = concat,singleton = idのようなものを持つ)

{-# 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 

をこれがその結果:

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 
型チェッカーは、その後 empty :: [a]のようなものを見ている場合、それはインスタンスが使用することを選択する方法はありません
関連する問題