如何迭代字符串映射中的键?

时间:2012-04-04 14:05:38

标签: opa

我真正想做的是迭代字符串图的键。我正在使用新的语法。我在StringMap.iter()上找不到任何信息,所以我使用了我在List.iter()的某处找到的语法。我不认为原始代码实际上是在密钥上进行迭代,现在如果我可以让它工作,我会满足于迭代这些值。

我的代码在这里: http://pastebin.com/9HB20yzy

我收到以下错误:

Error
File "test.opa", line 23, characters 1-64, (23:1-23:64 | 472-535)
Function was found of type
(string, 'a -> void), ordered_map(string, 'a, String.order) -> void but
application expects it to be of type
(string -> xhtml), stringmap(item) -> 'b.
Types string, 'a -> void and string -> xhtml are not compatible
Hint:
  Function types have different arguments arity (2 versus 1).

我尝试了其他几种方法,但它们似乎使用了旧的语法,并没有与编译器一起使用。我真的不明白这个错误伏都教告诉我什么,所以问题是,如何使用StringMap.iter()?或者以其他方式迭代StringMap中的键?

1 个答案:

答案 0 :(得分:0)

Function types have different arguments arity (2 versus 1)表示您尝试使用带有1个参数的函数,而具有2个参数的函数是预期的。您只通过values迭代列表,但是您通过keysvalues迭代地图。

然后,List.iterStringMap.iter意味着不执行副作用(例如登录控制台)。他们没有任何价值。这可能不是您想要在代码中执行的操作。

您应该使用StringMap.fold:

// item is a record of type {string description, string url}
function render_item(item) {
<>
  <li>
    <h4>item</h4>
    <a href="{item.url}">{item.description}</a>
  </li>
</>
}

function render_index() {
    function f(key, item, acc){
        [render_item(item) | acc]
    }
    <ul>
      { StringMap.fold(f, /mydb/items, []) }
    </ul>
}