gpt4 book ai didi

haskell - MultiParamTypeClasses、FunctionalDependency 和调用不明确的函数

转载 作者:行者123 更新时间:2023-12-02 16:10:52 25 4
gpt4 key购买 nike

通过函数依赖,我可以声明 Foo 类:

class Foo a b c | a -> b where
foo1 :: a -> b -> c
foo2 :: a -> c

当我调用foo2时,一切正常。由于依赖关系,编译器知道要使用哪个实例。

但是如果我删除创建 Foo' 的依赖关系:

class Foo' a b c where
foo1' :: a -> b -> c
foo2' :: a -> c

一切仍然可以正常编译,但现在每当我尝试调用 foo2' 时,GHC 都会抛出一个错误,无法解析要使用的实例,因为 b 不明确。

是否可以无错误地调用 foo2'?如果是这样,怎么办?如果不是,为什么不产生编译错误?

最佳答案

在这种情况下不可能调用 foo2',因为正如 Daniel Fischer 所说,无法确定要使用哪个实例。例如,如果您有:

instance Foo' Int Int Int where
foo2' x = x

instance Foo' Int Bool Int where
foo2' x = x + 1

这两个 foo2 具有相同的类型签名,因此无法确定调用哪一个。

解决此问题的常用方法是使用代理:

data Proxy a = Proxy

class Foo'' a b c = where
foo2'' :: Proxy b -> a -> c

您可以像这样使用它来选择哪个实例:

foo'' (Proxy :: Proxy Bool) 42

关于haskell - MultiParamTypeClasses、FunctionalDependency 和调用不明确的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14163629/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com