以下代码编译,但仅在bar
中使用显式类型签名:
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeFamilies #-}
type family ResultOf a where
ResultOf (a -> b) = ResultOf b
ResultOf a = a
wrap :: (Monad rnd, ResultOf bnch ~ rnd Int) => bnch -> rnd Int
wrap = undefined
foo :: (Monad m) => m Int
foo = undefined
bar :: forall rnd . (Monad rnd, ResultOf (rnd Int) ~ rnd Int) => rnd Int
bar = wrap (foo :: rnd Int)
我大致理解为什么需要类型签名:foo
是多态的,如果我们在{{1}实例化ResultOf (forall m . (MonadRandom m) => m Int) ~ rnd Int
,GHC无法告诉我m
的唯一方式}。我希望这是真的,因此GHC将使用正确的monad将'foo'单一化而没有明确的类型签名。有没有办法说服GHC这个?