Одно из упражнений в Real World Haskell, гл. 24, просит реализовать оболочку строгости вокруг Control.Concurrent.MVar
. Я делаю это, как предлагается в книге, используя оболочку newtype
MVarS
, чтобы гарантировать, что evaluate
применяется ко всем аргументам, передаваемым таким функциям, как newMVar
и putMVar
.
Теперь одной из функций для переноса является mkWeakMVar
, тип которой MVar a -> IO () -> IO (Weak (MVar a))
. Предполагая, что мои функции построения MVarS
реализуют строгость, я рассудил, что для mkWeakMVar
будет достаточно поставить MVarS
вместо его MVar
s. Поэтому я написал следующее:
import Control.Concurrent.MVar
import System.Mem.Weak
instance Functor Weak
newtype MVarS a = MVarS (MVar a)
mkWeakMVarS :: MVarS a -> IO () -> IO (Weak (MVarS a))
mkWeakMVarS (MVarS mv) x = (fmap . fmap) MVarS (mkWeakMVar mv x)
Похоже, это работает, даже несмотря на то, что GHCi предупреждает, что нет явного объявления метода fmap
для Functor Weak
. Но это оставляет меня заинтригованным. Что заставляет fmap
работать в этом случае?
fmap
дляWeak
никогда не вызывается. - person augustss   schedule 06.10.2014