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
?
'cast'檢查'f'的'TypeRep'並將其與所需類型的'TypeRep'進行比較。如果'TypeRep's相同,則返回'Just f',否則返回'Nothing'。 – 2012-07-07 20:31:35
我想我現在看到了。我錯過了右手類型限制如何工作的基本概念。我想接受你的答案,但你可以編輯/澄清w.r.t.在這個例子中'cast'是如何用'mkT'簽名的右邊部分'(a - > a)'填充'正確的類型類型約束'(因爲' - >'是右對應的)? – afsmi 2012-07-07 21:55:44
右側類型必須由調用上下文來決定,就像它必須用於'read'(或'fromIntegral',但是這個類型默認爲type)。這說明了嗎? – 2012-07-07 22:25:39