Haskell 函数上下文中的歧义类型是什么?
我正在阅读以下关于函数依赖性的内容。在第5页,它描述了不明确的类型: 首先,空函数的类型不明确:Haskell 函数上下文中的歧义类型是什么?,haskell,Haskell,我正在阅读以下关于函数依赖性的内容。在第5页,它描述了不明确的类型: 首先,空函数的类型不明确: empty :: Collects e ce ⇒ ce. “不明确”是指有一个类型变量e出现在 左边⇒ 符号,但不在右侧。这个问题是什么 根据Haskell的理论基础,是这样的吗 重载时,我们不能保证对任何 类型不明确的术语[2,4]。因此,Haskell系统 将拒绝任何定义或使用此类术语的尝试 我有几个问题: 什么是确切的不明确类型 作者所说的是什么意思?我们不能保证一个定义良好的 具有不明确类
empty :: Collects e ce ⇒ ce.
“不明确”是指有一个类型变量e出现在
左边⇒ 符号,但不在右侧。这个问题是什么
根据Haskell的理论基础,是这样的吗
重载时,我们不能保证对任何
类型不明确的术语[2,4]。因此,Haskell系统
将拒绝任何定义或使用此类术语的尝试
我有几个问题:
是什么意思?我们不能保证一个定义良好的
具有不明确类型的任何术语的语义,即受不明确类型的影响
正如其他人指出的,我们不知道
e
变量,因为它只出现在左边:
empty :: Collects e ce ⇒ ce
假设存在两个集合的实例:
instance Collects Int SomeType
instance Collects Char SomeType
那么empty
在这里应该使用什么实例:
let result = empty :: SomeType
它可以是第一个或第二个。但是因为我们不知道该用哪一种,所以它是不明确的。不明确类型的定义实际上就在眼前。该类型的变量出现在=>
的左侧,但不在右侧。只需按照以下顺序拼写句子:“通过‘含糊不清’我们的意思是有一个类型变量出现在⇒ 符号,但不在右边(在上面的例子中,该变量被命名为e)。“句子的问题是,根据Haskell重载的理论基础,我们不能保证任何具有歧义类型[2,4]的术语都有定义良好的语义。
的意思是“歧义”只是意味着我们不知道e
代表什么。如果我们不知道e
是什么意思,我们就不知道empty
是什么意思。引文中说“我们不能保证”,因为可能到处都会出现empty
,它获取元素类型为的显式签名:collections Int SomeType=>SomeType
或empty
是具有已知类型元素的insert
的参数。但是编译器不会冒这个风险,除非您设置AllowAmbiguousTypes
。