- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
通过函数依赖,我可以声明 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/
这里是 MonadState 的定义,但问题适用于具有 FunctionalDependencies 的任何此类: class Monad m => MonadState s m | m -> s w
通过函数依赖,我可以声明 Foo 类: class Foo a b c | a -> b where foo1 :: a -> b -> c foo2 :: a -> c 当我调用fo
我只是设法理解了类的定义MonadReader class Monad m => MonadReader r m | m -> r where ... 看了Haskell中的Functional De
我是一名优秀的程序员,十分优秀!