使用以下类型和类定义,我不明白为什么在创建时会出现错误instance
below.
我需要 MyMap 来保存异构值的映射。
{-# LANGUAGE ExistentialQuantification #-}
module Scratch.SO_ExtistentialTypes where
import Data.Map
type MyMap a = Map String a
class MyClass c where
getMyMap :: forall a. c -> MyMap a
data MyData = forall a. MyData {
myMap :: MyMap a
}
instance MyClass MyData where
getMyMap = myMap -- <= ERROR
一方面,forall
这里是多余的:
class MyClass c where
getMyMap :: forall a. c -> MyMap a
没有显式绑定的类型变量在最外层普遍量化,所以这与刚才的完全相同c -> MyMap a
.
除此之外,普遍量化类型肯定不会与存在量化类型相匹配。的类型getMyMap
就是说,给定一个类型的值c
,它将产生一个类型的值MyMap a
对于任何可能的类型选择a
。另一方面,访问器myMap
就是说,给定一个类型的值MyData
,它将产生一个类型的值MyMap a
对于某些特定但未知的类型a
.
不可能让未包装的存在类型自行浮动(这需要一个exists
量词对应于forall
),所以没有办法重写类型getMyMap
这样myMap
是一个有效的实现。
对于具有存在类型的东西,您所能做的就是将其包装回隐藏存在量词的另一种数据类型中,或者将其提供给具有通用量化类型参数的函数。例如,您可以使用length
在清单上[a]
with a
存在主义类型。
在你的情况下,Map
具有没有其他结构或约束的存在类型,因此它们几乎没有用,也可能是()
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)