1

我真正想做的是遍历字符串映射的键。我正在使用新奇的语法。我在 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 中的键?

4

1 回答 1

0

Function types have different arguments arity (2 versus 1)意味着您尝试使用带有 1 个参数的函数,而预期使用带有 2 个参数的函数。您仅在列表上values迭代,但您在地图上通过keysand迭代values

然后,List.iter或者StringMap.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>
}
于 2012-04-04T14:40:00.920 回答