2013-12-11 47 views
1

为什么没有此代码的工作:使用函数依赖:有两种类型的确定第三类

class Foo a b c | a b -> c where 
    foo :: a -> b -> c 

instance Foo Int Int Int where 
    foo a b = a + b 

ghci > foo 4 4 -- This produces run time error 

而且通过函数依赖,为什么下面的代码会产生编译时错误:

instance Foo Float Float Int where 
    foo a b = a + b 

我知道上面的例子是一个疯狂的例子,但是不是函数依赖的目的在于帮助类型检查器解决这些问题吗?

+3

你忘了,包括你在你的问题正在接受错误的文本。 –

回答

4

实际上它确实解决了不确定性。问题是,这样4 :: Num a => a GHC不能决定你要使用foo :: Int -> Int -> Int。现在,如果您改为

foo (4 :: Int) (4 :: Int) 
> 8 

从现在开始我们很清楚要使用哪个实例。为了使这个更清楚,假设我们有

class Foo a b c | a -> b, a -> c where 
    ... 

现在我们可以做

foo (4 :: Int) 4 
> 8 

因为一旦GHC填补了所有类型的变量不是一个->的右侧,它可以在填休息。

+0

为什么你有'a - > b'两次? – Sibi

+0

@Sibi只是一个错字 – jozefg

+0

谢谢,现在我能理解这更好。 – Sibi

2
instance Foo Float Float Int where 
    foo a b = a + b 

即使没有函数依赖关系,这仍是错误。如果abFloat,然后a + bFloat,不是Int