使用类型族进行单形化

时间:2016-10-10 16:24:41

标签: haskell ghc

以下代码编译,但仅在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这个?

0 个答案:

没有答案