在《Real World Haskell》第24章的练习中,有一个要求在
现在,其中一个需要包装的函数是
Control.Concurrent.MVar
周围实现严格性包装器的练习。我正在按照书中建议的方法完成这个练习,使用newtype
MVarS
包装器来确保对传递给函数(如newMVar
和putMVar
)的任何参数都应用了evaluate
。现在,其中一个需要包装的函数是
mkWeakMVar
,其类型为MVar a -> IO () -> IO (Weak (MVar a))
。假设我的MVarS
构建函数实现了严格性,我推断出对于mkWeakMVar
,只需将MVarS
放置在其MVar
的位置即可。因此,我写了以下代码: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警告没有Functor Weak
的显式方法声明,但这似乎可以正常工作。但是它让我感到好奇。是什么使得fmap
在这种情况下工作?
Weak
的fmap
时,它才能正常工作。 - augustss