3
其中的練習真實世界哈斯克爾,ch。 24,要求實施嚴格的包裝Control.Concurrent.MVar
。正如書中所建議的那樣,我正在使用newtype
MVarS
包裝來確保evaluate
適用於傳遞給函數的任何參數,如newMVar
和putMVar
。什麼使fmap在沒有明確的方法聲明的情況下工作?
現在,要包裝的功能之一是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警告說,存在的fmap
爲Functor Weak
沒有明確的方法聲明。但它讓我很感興趣。是什麼讓fmap
在這種情況下工作?
只有'Weak'的'fmap'永遠不會被調用。 – augustss 2014-10-06 17:19:45