0

foldlを使用するこのメンバー関数をインターネットで見つけました

fun memeber3 (x,xs)=
              foldl (fn (y,b)=>b orelse x=y) false;

しかし、要素とリストを指定して実行すると機能しません.trueまたはfalseの代わりに、新しい関数を書いているように反応し、次のようなものを出力します:

fn int リスト ->bool

上記の関数が要素がリストに属しているかどうかを確認する方法と、それを適切に実行する方法を誰かに説明してもらえますか?

4

1 に答える 1

1

関数は次のように宣言する必要があると思います。

fun memeber3 (x,xs)= foldl (fn (y,b)=>b orelse x=y) false xs

最後に xs を使用していることに注意してください。この場合、次のようにして使用できます。

val x = memeber3(1,[1,2,3])

または、次のように宣言された可能性があります

fun memeber3 x = foldl (fn (y,b)=>b orelse x=y) false

この場合、カリー化を使用します: 引数の括弧の欠如と引数 xs の欠如に注意してください。これは、 member3 と fold の両方が最後の引数としてリストを想定しているため、宣言を回避できるためです。このようにして、member3 はリスト xs を期待する新しい関数を実際に生成します。

そして、あなたはそれを次のように使うことができました:

val x = memeber3 1 [1,2,3]

括弧を使用しない呼び出しに注意してください。これはカリー化された呼び出しです。

ここで fold を使用することの問題点は、最初の繰り返しで探していた要素が見つかったとしても、リスト全体を調べなければならないことです。それは次善の解決策です。

探していたものが見つかったら、それ以上の計算は避けたほうがよいと思います。やや好き:

fun exists(e, xs) =
    case xs of
         [] => false
       | x::xs' => x = e orelse exists(e, xs')

ここでの orelse 演算子の短絡的な性質により、要素が見つかった場合、exists の別の反復を呼び出すことを回避できます。

于 2013-10-08T16:00:39.953 に答える