我对新类型的理解是它们是由GHC编译的。但是,这并不是全部,因为幻像类型可以保存信息。
从这里:
您可以将[a type]包装在新类型中,这将被视为与类型检查器不同,但在运行时相同。然后,您可以使用各种深层欺骗手段,例如幻像或递归类型,而无需担心GHC洗牌的字节桶。
例如,假设有一个表示算术模q的新类型:
newtype Zq q = Zq Int
class Modulus q where
getModulus :: q -> Int
addZq :: (Modulus q) => Zq q -> Zq q -> Zq q
addZq (Zq a) (Zq b) = Zq $ (a+b) `mod` (getModulus (undefined :: q))
addZq
无法编译为
addZq :: Int -> Int -> Int
那么从什么意义上说新类型被编译出来了,幻象类型信息存储在哪里?
要记住的是,您不会“编译”到Haskell;您可以编译成其他更明确的语言-在GHC的情况下,下一个众所周知的降级是核心。而且,尽管您不能在Core中将其编译addZq
为某种类型Int -> Int -> Int
,但可以将其编译为您可以将其编写为的类型Modulus q => Int -> Int -> Int
。在这种更明确的语言中,=>
其含义与Haskell中的含义不同。用这种语言c => t
表示的是函数的类型,该函数为索偿要求提供证据(在这种情况下,为类字典)c
并产生type t
。所以Modulus q => Int -> Int -> Int
是大致相同的(q -> Int) -> Int -> Int -> Int
,并且addZq
肯定能够给予这种类型的,甚至在Haskell。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句