以下定義:哈斯克爾級2個位由於編譯錯誤
import Control.Monad.ST
import Data.STRef
fourty_two = do
x <- newSTRef (42::Int)
readSTRef x
GHC在以下編譯:
main = (print . runST) fourty_two -- (1)
但這並不:
main = (print . runST) $ fourty_two -- (2)
但隨後由於bdonlan在評論中指出,這確實編譯:
main = ((print . runST) $) fourty_two -- (3)
但是,這並不編譯
main = (($) (print . runST)) fourty_two -- (4)
這似乎表明,(3)只編譯由於綴$
的特殊待遇,但是,它仍然沒有解釋爲什麼(1)沒有編譯。
問題:
1)我已經閱讀了以下兩個問題(first,second),我已經被引導相信$
只能與單態類型的實例化。但是我會同樣假設.
只能用單形類型實例化,結果也會失敗。 爲什麼第一個代碼成功,但第二個代碼卻不成功? (例如是否有一個特殊的規則GHC具有用於第一種情況下,它不能在第二應用?)
2)是否有編譯所述第二代碼的電流GHC延伸? (也許ImpredicativePolymorphism這樣做在某些時候,但似乎過時了,有什麼替代呢?)
3)是否有任何的方式來定義說`my_dollar`
使用GHC的擴展做什麼$
的做法,但也能夠處理多態類型,所以(print . runST) `my_dollar` fourty_two
編譯?
編輯:建議的答覆:
而且,下面的編譯失敗:
main = ((.) print runST) fourty_two -- (5)
這是一樣的(1),除了不使用的.
中綴版本。
結果,似乎GHC有兩個$
和.
特殊的規則,但只有他們中綴版本。
爲了使它更有趣,'((打印runST)$)。fourty_two' _does_工作 – bdonlan 2012-04-27 06:33:47
這很有趣,而且進一步混淆的東西! – Clinton 2012-04-27 06:37:39
我相當肯定GHC有一個特殊的規則來支持'runST $ do'這個例子,但我現在找不到一個引用。 – 2012-04-27 07:21:23