これは何故できないのでしょうか。
kakkun61さんの回答のとおり、残念ながら「そういう仕様だ」としか答えようがないですね...????
個人的にも GHC Proposals で提案しようかと思ったことがあるぐらい欲しい機能ではあります。
ただ、その場合一つ懸念すべき点があります。
演算子を定義した場合、次のように infixl
や infixr
、infix
というキーワードで、演算子の結合の優先順位や結合の方向を指定できるようになっています。
実はこれは名前が記号だけの関数(記号関数)だけでなく、普通の名前の関数にも指定できます。
例えば、elem
関数やdiv
関数をGHCiの:i
で調べてみると、infixl
やinfix
が指定されてることがわかります。
ghci> :i div
...
infixl 7 `div`
ghci> :i elem
infix 4 `elem`
なぜこんな指定ができるようになっているかというと、そう、div
やelem
を問題のバッククォートで囲って中置関数として使った場合の優先順位のためなんです。
つまり、バッククォートの中で自由な式を書いた場合、結合をどのような優先順位で解決するかがわからなくなってしまう、という問題があるのです(デフォルトをそのまま採用するというのは、場合によっては問題になり得ますが一案です)。
この問題をちゃんと解決できれば、採用される可能性はあるんじゃないかと企んでいます。
3つの引数の内2番目または3番目についてのみ具体的に指定することで2変数関数として扱うことは可能でしょうか。
一旦別の関数を定義するか、あるいは想像されている使い方と異なるかも知れませんが、Haskellの性質上、引数が3つ以上でも、実はそのままバッククォートで囲って中置記法が使えます。
質問者にあげていただいた func
を例に説明するとこう????
要するに、バッククォートを使って中置関数として使って両辺に値を適用した状態でも、返す値が関数になっていれば、そのままもう一つの引数を適用できるのです。