2

私は SML を学ぼうとしていますが、私の教授ノートのいくつかは、map「型 ('a -> 'b) -> ('a list -> 'b list) を持つ関数」について述べています。彼は続けて、これは「'as を 'bs... に変換する関数を私に与えてください」という意味であると説明しています。

ただし、実装は次のようになります。

fun map f [] = []
  | map f (a::l) = (f a)::(map f l)

これは 2 つの引数に相当するように見えます (技術的には sml のすべてが 1 つの引数しかとらないことはわかっていますが、タプルまたはカリー化を使用すると 2 のように見える可能性があります)。関数とリストを取っているようです。ただし、上記の説明では、関数を取っているだけのように聞こえます。私は何が欠けていますか?

4

1 に答える 1

4

あなたが言ったように、SML には実際にはポリアディック関数がなく、タプルまたはカリー化を使用してシミュレートするだけです。この場合mapはカリー化された関数です。あなたの教授の声明が理にかなっている理由は、カリー化された関数は、1 つの引数を取り、次の引数を取る関数を返す単純な関数だからです。

これを確認する 1 つの方法は、 で書き直すfunことですval。一般的fun f x y = blaには と同等val rec f = fn x => fn y => blaです。したがって、 の定義はmap同等に次のように記述できます。

val rec map = fn f => fn as => case as of
    [] => []
  | (a::l) => (f a)::(map f l)

その定義を見ると、最初fnの関数が別の関数を返す関数を作成することが明らかです (2 番目のfn)。

mapまた、引数を 1 つだけ指定して呼び出すことが正当であり、結果が関数であることを観察することで、これが事実であることがわかります。

val my_map = map my_function
val mapped_list = my_map my_list

上記my_map my_listでは と同等map my_function my_listです。これは、 (関数適用が左結合であるためmap my_function my_listと同等の) 呼び出しが、単純に引数を使用して呼び出し、次にwithによって返された関数をその引数として呼び出すことを示しています。(map my_function) my_listmapmy_functionmapmy_list

それがカレーのすべてです。

于 2013-01-21T17:26:59.467 に答える