私が読んでいることから、$
「その引数に関数を適用する」と説明されています。ただし、二項演算子であるため、Lispのようには機能しないようです。したがって、実際には、の代わりに(apply ...)
かっこを避けるのに役立つように見えます。私はそれを正しく理解していますか?後者の形式は「悪いスタイル」と見なされますか?foo $ bar quux
foo (bar quux)
5 に答える
$
開き括弧と閉じ括弧の間の距離が読みやすさの保証よりも大きい場合、またはネストされた括弧の層が複数ある場合は、括弧よりも を使用することをお勧めします。
例えば
i (h (g (f x)))
書き換え可能
i $ h $ g $ f x
つまり、右結合関数適用を表します。これは、通常の関数の適用が左に関連付けられるため便利です。つまり、次のようになります。
i h g f x
...次のように書き換えることができます
(((i h) g) f) x
この関数の他の便利な使用法には($)
、リストを圧縮することが含まれます。
zipWith ($) fs xs
これは、関数のリスト内の各関数を listfs
内の対応する引数に適用xs
し、結果をリストに収集します。sequence fs x
関数のリストをfs
単一の引数に適用x
し、結果を収集する とは対照的です。そしてfs <*> xs
、リスト内の各関数をリストfs
のすべての要素に適用しますxs
。
あなたはほとんどそれを正しく理解しています---つまり、$ の使用の約 99% は括弧を避けるためであり、はい、ほとんどの場合、括弧よりも好まれるようです。
ただし、次の点に注意してください。
> :t ($) ($) :: (a -> b) -> a -> b
つまり、$ は関数です。そのため、関数に渡したり、合成したり、その他の処理を行うことができます。以前にコンビネータをいじっている人が使っているのを見たことがあると思います。
上記の良い答えがたくさんありますが、1つの省略があります:
$
常に括弧で置き換えることはできません
しかし、 の適用は$
括弧を使用することで排除でき、 の使用は($)
で置き換えることができます。これは、 が恒等関数の特殊化であるためid
です。の使用はに置き換えることができますが、 (関数を引数として取り、それを に適用する) のような使用には、明らかな置き換えはありません。$
(f$)
f
($x)
x
($) のドキュメントがあなたの質問に答えます。残念ながら、自動生成された Prelude のドキュメントには記載されていません。
ただし、ここにあるソースコードにリストされています。
http://darcs.haskell.org/packages/base/Prelude.hs
ただし、このモジュールは ($) を直接定義していません。前者によってインポートされた以下は、次のことを行います。
http://darcs.haskell.org/packages/base/GHC/Base.lhs
以下に関連するコードを含めました。
infixr 0 $
...
-- | Application operator. This operator is redundant, since ordinary
-- application @(f x)@ means the same as @(f '$' x)@. However, '$' has
-- low, right-associative binding precedence, so it sometimes allows
-- parentheses to be omitted; for example:
--
-- > f $ g $ h x = f (g (h x))
--
-- It is also useful in higher-order situations, such as @'map' ('$' 0) xs@,
-- or @'Data.List.zipWith' ('$') fs xs@.
{-# INLINE ($) #-}
($) :: (a -> b) -> a -> b
f $ x = f x
ここであなたの質問と回答を見ると、Apocalisp とあなたはどちらも正しいです。
$
特定の状況では括弧よりも優先されます(彼の答えを参照)foo (bar quux)
スタイルも悪くない!
また、との違いを確認してください。(ドット) と $ (ドル記号)、あなたに非常に関連する別の SO の質問です。