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

寻找佛罗里达

将 f 应用于列表 l 的每个元素 x,从左到右,直到 x 评估为真。如果存在这样的 x,则返回 SOME(x);否则返回 NONE。

来源

现在您可以执行以下操作:

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

WhereList.find返回匹配的元组(key, val)or NONE,并从元组中Option.map返回or 。valNONE

于 2013-02-01T18:26:07.200 回答