5

たとえば、代わりに

- op =;
val it = fn : ''a * ''a -> bool

私はむしろ持っていたい

- op =;
val it = fn : ''a -> ''a -> bool

で使用するため

val x = getX()
val l = getList()
val l' = if List.exists ((op =) x) l then l else x::l

明らかに、私は自分でこれを行うことができます、例えば、

val l' = if List.exists (fn y => x = y) l then l else x::l

しかし、私はもっとエレガントな方法を見逃していないことを確認したいと思います。

4

2 に答える 2

6

関数をカレーするヘルパー関数を書くことができます:

fun curry f x y = f (x, y)

その後、あなたは次のようなことをすることができます

val curried_equals = curry (op =)
val l' = if List.exists (curried_equals x) l then l else x::l
于 2009-09-07T00:53:02.437 に答える
2

私のSMLの知識は乏しいですが、Ullmanの本を調べたところ、タプルを受け入れる関数をカリー化された関数に変換する簡単な方法を見つけることができませんでした。それらには2つの異なる署名があり、互いに直接互換性はありません。

私はあなたがあなた自身を転がさなければならないだろうと思います。

または、Haskellに切り替えます。

編集:私はそれについて考えました、そして今、一方が他方と同じでない理由を知っています。SMLでは、使用しているほとんどすべての関数が実際には1つのパラメーターのみを受け入れます。ほとんどの場合、実際には複数の要素を持つタプルを渡しています。それでも、タプルは単一の値であり、関数によってそのように扱われます。このような関数を部分タプルに渡すことはできません。タプル全体か、何もないかのどちらかです。

複数のパラメーターを受け入れる関数は、定義上、カレーされます。(複数の要素を持つ単一のタプルではなく)複数のパラメーターを受け入れる関数を定義する場合、それを部分的に適用し、その戻り値を別の関数の引数として使用できます。

于 2009-09-07T00:16:14.690 に答える