次の定義が与えられた場合:
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) infix の特別な処理のためにのみコンパイルされることを示しているようですが$
、(1) がコンパイルされる理由はまだ説明されていません。
質問:
1) 次の 2 つの質問 ( first、second )を読みましたが$
、モノモーフィック型でのみインスタンス化できると信じるようになりました。しかし、同様.
にモノモーフィック型でのみインスタンス化できると仮定し、その結果、同様に失敗します。最初のコードは成功するのに、2 番目のコードは成功しないのはなぜですか? (たとえば、GHC が最初のケースに対して持っていて、2 番目のケースには適用できない特別なルールはありますか?)
2) 2 番目のコードをコンパイルする現在の GHC 拡張機能はありますか? (おそらくImpredicativePolymorphismはある時点でこれを行いましたが、廃止されたようです。何かに取って代わりましたか?)
`my_dollar`
3) GHC拡張機能を使用して何をするかを定義する方法はあります$
が、ポリモーフィック型も処理できるため、(print . runST) `my_dollar` fourty_two
コンパイルできますか?
編集:提案された回答:
また、以下はコンパイルに失敗します。
main = ((.) print runST) fourty_two -- (5)
これは (1) と同じですが、 の中置バージョンを使用しない点が異なり.
ます。
その結果、GHC は と の両方に特別なルールを持っているようです$
が.
、それらの中置バージョンだけです。