0

高階関数を使用するようにメソッドを書き直すのに少し問題があります。これがその試みです(コンパイルされますが実行されません):

fun lookup2 key hash = 
  List.foldr (fn ((k, v), r) => if k = key then SOME v else r) NONE hash;

バックグラウンド:

アイデアは、そのようなハッシュがあり、文字列キーでintオプションを検索するというものです。

- val h = [("a", 5), ("b", 4)];
- lookup "a" h;
val it = SOME 5 : int option

私はうまく機能するものを書きました:

fun lookup _ nil = NONE
  | lookup key ((k, v)::xs) = if k = key then SOME v else lookup key xs;

ただし、smlに慣れるために書き直したかったのです。よくわからないこっそり疑惑がありますfoldr...


私の間違い-私は誤って別のでそれを上書きしていましたlookup2。期待どおりに動作します。

4

1 に答える 1

1

あなたが探しているのはList.foldrではなくList.find:

フロリダを見つける

x が true と評価されるまで、リスト l の各要素 x に f を左から右に適用します。そのような x が存在する場合、SOME(x) を返します。それ以外の場合は NONE を返します。

ソース

これで、次のことができます。

fun lookup key hash = Option.map (fn (_,v) => v)
  ( List.find (fn (k,_) => k = key) hash );

WhereList.findは、一致するタプル(key, val)またはNONEOption.map返しval、タプルから または も返しますNONE

于 2013-02-01T18:26:07.200 に答える