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).

他のいくつかの方法を試してみましたが、それらは古い構文を使用しているようで、コンパイラーには合いませんでした。このエラー voodoo が何を言っているのかよくわかりません。そこで問題は、StringMap.iter() をどのように使用するかです または、他の方法で StringMap のキーを反復処理しますか?

4

1 に答える 1

0

Function types have different arguments arity (2 versus 1)2つの引数を持つ関数が期待されているのに対し、1つの引数を取る関数を使用しようとすることを意味します. valuesのみを介してリストを反復しますが、keysとを介してマップを反復します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 に答える