2012-07-07 15 views
2

在由Laemmel和SPJ 2003 Scrap Your Boilerplate paper有頁面上的代碼片段3理解轉型操作的廢料類型您樣板

mkT :: (Typeable a, Typeable b) => (b -> b) -> a -> a 
mkT f = case cast f of 
    Just g -> g 
    Nothing -> id 

,然後將文件解釋

也就是說,如果x的類型與f的參數類型相同,則mkT fx將f應用於x0

在本文前面例子的模式中, nk cast f的類型必須與Maybe (b -> b)的類型進行比較,上述評估爲Just g,但這看起來不正確。

發生了什麼事cast f

回答

4

類型的cast

cast :: (Typeable x, Typeable y) => x -> Maybe y 

它產生Nothing如果xy是不同類型和Just argument如果它們是相同的。請注意,當使用cast時,結果類型y必須根據調用上下文確定。如果不是,則編譯失敗並顯示無法解析的重載/模糊類型變量錯誤。

在此特定示例中,類型是函數類型,參數爲(b -> b),結果爲(a -> a)。所以

cast f :: Maybe (a -> a) 

mkT也可以寫mkT = fromMaybe id . cast

+0

'cast'檢查'f'的'TypeRep'並將其與所需類型的'TypeRep'進行比較。如果'TypeRep's相同,則返回'Just f',否則返回'Nothing'。 – 2012-07-07 20:31:35

+0

我想我現在看到了。我錯過了右手類型限制如何工作的基本概念。我想接受你的答案,但你可以編輯/澄清w.r.t.在這個例子中'cast'是如何用'mkT'簽名的右邊部分'(a - > a)'填充'正確的類型類型約束'(因爲' - >'是右對應的)? – afsmi 2012-07-07 21:55:44

+0

右側類型必須由調用上下文來決定,就像它必須用於'read'(或'fromIntegral',但是這個類型默認爲type)。這說明了嗎? – 2012-07-07 22:25:39