2014-10-06 109 views
3

其中的練習真實世界哈斯克爾,ch。 24,要求實施嚴格的包裝Control.Concurrent.MVar。正如書中所建議的那樣,我正在使用newtypeMVarS包裝來確保evaluate適用於傳遞給函數的任何參數,如newMVarputMVar什麼使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警告說,存在的fmapFunctor Weak沒有明確的方法聲明。但它讓我很感興趣。是什麼讓fmap在這種情況下工作?

+2

只有'Weak'的'fmap'永遠不會被調用。 – augustss 2014-10-06 17:19:45

回答

10

雖然上面的代碼會檢查,但當試圖評估需要調用缺失的fmap實現的值時,GHC會崩潰。它會看起來有點像:

*** Exception: /Users/tel/tmp/SO.hs:31:10-18: 
    No instance nor default method for class operation GHC.Base.fmap 

由於這是一個相當災難性和完全可以避免的運行時錯誤它應該作爲證明的-Wall的重要性。

相關問題