moscow mlで2つの関数(どちらも実数型)を減算しようとしています。次に、「オーバーロード - 実数型の引数には適用できません -> 実数です。では、関数をどのように記述すればよいですか?
fun CircleArea x = x*x*Math.pi
fun SquareArea x:real = 4*x*x
fun Area x = SquareArea - CircleArea
おそらく、実際にはある関数を別の関数から減算したくはありませんが、それらの関数が適用されると、それらの関数の戻り値が得られます。これは次の方法で実現できます。
fun Area x = (SquareArea x) - (CircleArea x)
SquareArea
関数の適用 (つまり、との間のスペースx
) は、 を含むどの二項演算子よりも強く結合するため、括弧は必須ではありません-
。
ML では、次の命名規則を使用することを検討する必要があります。通常の関数には小文字の開始記号があり、代数型の値コンストラクターには大文字の開始記号があります。例えば:
fun area x = squareArea x - circleArea x
しかし:
datatype shape = Square of int * int
| Circle of int
数学のような関数の減算は、組み込み演算子として提供されていません。ただし、独自に定義することはできます。
数学的に言えば、定義します
(f - g)(x) = f(x) - g(x)
この定義を SML で次のように複製できます。
infix 5 --
fun f -- g = fn x => f x - g x
これが行うことは、 に対応する関数、つまり与えられた が を計算する関数を生成する演算子--
を生成することです。f -- g
fn x => f x - g x
x
f x - g x
演算子の型があいまいであるため、-
デフォルトで関数を減算できるようになることに注意してください'a -> int
。あなたの場合'a -> real
、関数を減算する必要があるため、わずかな変更が必要になります。
infix 5 --
fun f -- g = fn x => f x - g x : real
この--
-operatorを使用すると、Area
関数を次のように定義できます。
val area = squareArea -- circleArea;
(関数名の最初の文字を小文字にして、SML 命名規則に一致させました。)