ghci の次の関数定義を検討してください。
let myF = sin . cos . sum
どこ、 。2 つの関数の合成 (右結合) を表します。これは私が呼び出すことができます
myF [3.14, 3.14]
そして、それは私に望ましい結果をもたらします。どうやら、リスト [3.14, 3.14] を関数「sum」に渡し、その「結果」を cos などに渡します。ただし、これをインタープリターで行うと
let myF y = sin . cos . sum y
また
let myF y = sin . cos (sum y)
それから私はトラブルに遭遇します。これを次のように変更すると、望ましい結果が得られます。
let myF y = sin . cos $ sum y
また
let myF y = sin . cos . sum $ y
(.) の型は、'sum y' も関数であるため、次の形式に問題がないことを示唆しています (そうではありませんか? 結局、Haskell ではすべてが関数なのでしょうか?)。
let myF y = sin . cos . sum y -- this should work?
さらに興味深いのは、2 つ (または多数) の引数 (リスト [3.14, 3.14] を 2 つの引数 x と y として渡すことを考えてください) で動作させることができることです。次のように記述する必要があります。
let (myF x) y = (sin . cos . (+ x)) y
myF 3.14 3.14 -- it works!
let myF = sin . cos . (+)
myF 3.14 3.14 -- -- Doesn't work!
HaskellWiki には、「PointFree」フォームhttp://www.haskell.org/haskellwiki/Pointfreeと呼ばれるこのフォームに関するいくつかの議論があります。この記事を読んで、この形式は 2 つのラムダ式の合成とは異なるのではないかと疑っています。これらのスタイルの両方を区切る線を引こうとすると、混乱してしまいます。