3
我有一些代碼使用類型來消除實例的歧義(真正的代碼是使用GHC.TypeLits類型標記的singletons,但我認爲這不是密切相關的),我想使用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)
上面的代碼不編譯(但是,當然,如果我輸入註釋quux
是多態的,一切工作正常),正確地抱怨它不能匹配Int
與Char
。有沒有什麼辦法可以編譯成功,而不需要鍵入註釋,也不需要在每個使用站點重複bar undefined
?
我認爲'NoMonomorphismRestriction'只適用於頂級綁定。呵呵。讓我感到驚訝的是運行代碼。 –