o
構成演算子 (例: val x = foo o bar
wherefoo
とare both functions)はbar
、引数が 1 つの関数および/または同数の引数を持つ関数でのみ使用できますか? そうでない場合、たとえば、で構成foo(x,y)
するための構文は何ですかbar(x)
。
3 に答える
Michael がすでに言ったように、はい、SML には引数関数が 1 つしかありません。とはいえ、もう少し詳しく説明したい。
次の関数:
fun foo (x,y) = x + y
次のタイプがあります。
fn : int * int -> int
これは、最初の引数が 2 つの int のタプルであることを意味します。したがって、次のようなことができます。
(sign o foo) (4,~5)
と同じ結果が得られますsign (foo (4,~5))
。
わかりましたが、このようなものはどうですか?
fun bar x y = x + y
次のタイプがあります。
fn : int -> int -> int
つまり、bar は実際には整数を 1 つだけ取り、関数を返します。したがって、これを行うことはできません:
(sign o bar) 4 ~5
bar は関数を返し、sign は整数を取るためです。ただし、これを行うことができます:
(sign o bar 4) ~5
bar 4
数字に4を足す関数だからです。
SML には引数関数が 1 つしかありません。tuple という単一の引数を取るfoo(x,y)
関数です。そのため、特別な処理は必要なく、適切なタイプのタプルを返して で構成する必要があります。foo
(x, y)
bar(x)
foo
この種の状況を処理するトップレベル環境に追加の構成演算子を配置する標準 ML コード (特に Poly/ML コード Isabelle/Pure) を見てきました。例えば:
fun (f oo g) x y = f (g x y)
fun (f ooo g) x y z = f (g x y z)
fun (f oooo g) x y z w = f (g x y z w)
一般に、そのようなものは控えめに使用する必要があります (4 つ以上の o は少しばかげています) が、少なくともoo
周りにあると非常に便利です。