7

誰もが私にこのコードを説明できますか?

let safe_division n = function
| 0 -> failwith "divide by 0"
| m -> n / m

を実行するとき、この場合のandsafeDiv 3 0は何ですか?mn

一般に、関数が 1 番目と 2 番目のパターンに一致するのはいつですか?

4

4 に答える 4

11

これが何を意味するかは、一度理解すれば簡単に理解できます

let f x y z = e

は単なる省略形です

let f = function x -> function y -> function z -> e

つまり、n 引数の関数は、実際には 1 引数の n 個のネストされた関数です。その表現は「カリー化」と呼ばれます。関数を部分的に適用できるようにするものです。

let g = f 3

引数が 2 つの関数を返します。

もちろん、上記の短縮形は右側の明示的な形式と自由に組み合わせることができます。それがあなたの例が行うことです。次のように脱糖できます。

let safe_division = function n -> function
                                  | 0 -> failwith "divide by 0"
                                  | m -> n / m
于 2013-05-17T09:18:45.780 に答える
10

を実行するsafe_division 3 0と、最初に3名前にバインドされ、n次に宣言の右側が評価されます。

これは であるfunctionため、次の引数0は異なるケースに対して順番に照合されます。ここでは、最初のケースに一致するため、右側が評価され、例外がスローされます。この場合、名前mは何にもバインドされません。

たとえば、2 番目の引数が の場合、21番目のケースに一致し (このケースは可能なすべての値に一致します。デフォルトのケースです)、名前mを値にバインドしてから、1の結果を返しn / mます。

于 2013-05-17T08:27:28.140 に答える
7
let safe_division n 

タイプが int の関数を定義 -> ...

function
| 0 -> failwith "divide by 0"
| m -> n / m

int -> int 型の関数を定義する

したがって、全体の結果の型はint -> int -> intです。n は最初の引数で、m は 2 番目の引数です。最後の int は結果です。

于 2013-05-17T08:05:50.693 に答える