我有一些使用类型来消除实例歧义的代码(真正的代码是使用 GHC.TypeLits 单例作为类型标签,但我认为这不是密切相关的),我想使用 let 绑定来避免文本级重复; 不幸的是,这使结果单一化。
以下是该问题的一个示例:
class Foo a where
foo :: a
instance Foo Int where
foo = 0
instance Foo Char where
foo = 'a'
data Bar a = Bar String
deriving (Show)
bar :: forall a. (Show a, Foo a) => a -> Bar a
bar _ = Bar $ show (foo :: a)
idInt :: Bar Int -> Bar Int
idInt = id
idChar :: Bar Char -> Bar Char
idChar = id
main = let quux = bar undefined in
print (idInt quux) >> print (idChar quux)
上面的代码不能编译(但是,当然,如果我输入 annotatequux
是多态的,一切正常),正确地抱怨它不能Int
与Char
. 有没有什么方法可以让编译成功而无需类型注释并且无需bar undefined
在每个使用站点重复?