【发布时间】:2015-12-12 07:18:32
【问题描述】:
我有一个带有幻像类型的newtype,但我无法轻松使用它。
考虑以下示例:
import Data.Coerce
newtype F a b = F b
myzip :: (Num b) => F a b -> F a b
myzip = (coerce (+)) myf
myf :: F a b
myf = undefined
GHC 抱怨它Couldn't match representation of type ‘a0’ with that of ‘Int’。基本上coerce (+)的类型是F a0 -> F a -> F a,而不是我想要的类型F a -> F a -> F a。
鉴于a 的当前角色phantom,这是合理的。我想知道是否有一种简单的方法来获取类型推断(我不想写出签名,这就是我首先使用coerce 的原因!)通过其他方法。
特别是,我希望如果我将参数a 的角色限制为标称,那么 GHC 将能够判断签名的唯一可能选择是我想要的那个。没有这样的运气:GHC 给出了同样的错误。
如果重要的话,在我的真实代码中,a 的角色必须至少具有代表性,b 必须是名义上的。
【问题讨论】: