在Haskell中表达类型关系与函数依赖关系

时间:2013-01-25 09:41:48

标签: haskell typeclass functional-dependencies

我想表达我有3个相关的类型类。

我有两个文件。第一:

{-# LANGUAGE MultiParamTypeClasses, FunctionalDependencies #-}
module ModA where

class Class a b c | a -> b, b -> c where
    getB :: a -> b
    getC :: b -> c

第二

{-# LANGUAGE MultiParamTypeClasses, FunctionalDependencies #-}
module B where

import qualified ModA

data A = A {f1::String}

data B = B {f2::String}

data C = C {f3::String}

instance ModA.Class A B C where
    getB a = B "hey"
    getC a = C "ho"

getABForMe = ModA.getB (A "boo")

getACForMe = ModA.getC (B "yo")

我得到的错误:

No instance for (ModA.Class a0 B C)
  arising from a use of `ModA.getC'
Possible fix: add an instance declaration for (ModA.Class a0 B C)
In the expression: ModA.getC (B "yo")
In an equation for `getACForMe': getACForMe = ModA.getC (B "yo")

我错过了什么?

2 个答案:

答案 0 :(得分:6)

您可以将功能依赖性设为“循环”:

class Class a b c | a->b, b->c, c->a where
    getB :: a -> b
    getC :: b -> c

所以任何一个类型参数都可以从任何其他参数推导出来。但我不确定你是否真的想要这个;为什么不只有一个带有一个fundep和一个方法的类型类,并创建它的两个实例(instance Class A Binstance Class B C)?

答案 1 :(得分:2)

GHC无法知道a调用中第一类参数getC的类型。调用将b修复为B类型,然后函数依赖项允许GHC推断c必须为C。但是没有关于a的信息。