あなたの質問は、ポイントフリー関数をインライン化できるかどうかだと思います。
あなたが見つけた制限は、カリー化された関数によるものではありません。あなたの例では、カリー化された関数が右側にあり、左側にポイントフリー関数があることに注意してください。
F# では、定数ではなく、関数のインライン化のみが許可されます。
型推論が(ポイントフリー)関数であることを発見するのに十分スマートであることを考えると、これはバグと見なされる可能性があると思うかもしれませんが、副作用に関するTomasのメモを読んでください。
どうやら、コンパイラが左側に識別子のみを見つけると、次のエラーで失敗します。
let inline myfunction x y = x + y
let inline mycurried = myfunction 1
--> Only functions may be marked 'inline'
ブライアンが言ったように、回避策は両側に明示的なパラメーターを追加することです:
let inline mycurried x = (myfunction 1) x
しかし、あなたの関数はもはやポイントフリーではありません。それは次と同じです:
let inline mycurried x = myfunction 1 x
もう 1 つの方法は、明示的なジェネリック パラメーターを追加することです。
let inline mycurried<'a> = myfunction 1
汎用パラメーターが左側に明示的に存在する場合、コンパイルされます。
エラーメッセージを削除して、次のような警告に変えてほしい:
Since only functions can be 'inline' this value will be compiled as a function.
アップデート
Tomas さん、回答 (および反対票) に感謝します。
私の個人的な意見では、これは警告であるべきです。そのため、コードのセマンティックが最終的に変更されることは承知していますが、その後どうするかを決めるのはあなた次第です。
インラインは「単なる最適化」であると言いますが、それは完全に真実ではありません。
. すべての関数をインライン化するだけでは、最適なコードは保証されません。
. 静的制約を使用したい場合は、インラインを使用する必要があります。
F# ライブラリが既に行っているように、(一種の) ジェネリック定数を定義できるようにしたいと考えています (つまり、GenericZero と GenericOne)。コードが純粋であることはわかっているので、毎回実行されるかどうかは気にしません。