2013-07-28 11 views
5

"15"を整数に変換して結果を出力するには、次のコードが期待しますが、エラーが発生します。

main = print $ read "15" :: Integer 

Couldn't match expected type `Integer' with actual type `IO()' 

しかし、ちょうどmain = print (read "15" :: Integer)がうまく動作します。私は括弧内の行の残りの部分を効果的に取り囲んでいるという印象を受けました。 この場合、$がなぜ機能しないのですか?

答えて

12

$は、行の最後に現在の場所と)(を置くシンタックスシュガーではありません。

したがってprint $ read "15" :: Integer(print (read "15")) :: Integerと解釈されます。これは、$ :: (a -> b) -> a -> b(機能構成中置演算子)が2つの関数printread "15"を受け取り、それらを互いに適用するために発生します。 :: Integerはここでは機能していないようですが、それはキーワードのようなものなので、$は期待通りの動作をしません。

+10

簡潔に言えば(ただし、正しくはありません)、 '::'は '$'よりも優先順位が低くなります。 –

+0

ハスケルの_is_構文砂糖。さもなければ、それはrank-N型付き引数では機能しません。これはPureScriptの関数です。 –

関連する問題