2012-04-04 27 views
1

私が本当にやりたいことは、文字列マップのキーを反復することです。私は、新鮮な構文を使用しています。私はStringMap.iter()に関する情報を見つけることができないので、List.iter()のどこかで見つかった構文を使用しました。私は元のコードが実際にキーを反復したとは思っていません。そして、もし私がそれを働かせることができれば、私は値を反復処理するために解決します。stringmapのキーを反復処理する方法は?

私が持っているコードはここにある: 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内のキーを何か別の方法で反復処理しますか?

答えて

0

Function types have different arguments arity (2 versus 1)は、1つの引数を取る関数を使用しようとしますが、2つの引数を持つ関数が必要です。リスト上ではvaluesまでしか反復しませんが、マップ上ではkeysvaluesまで繰り返すことになります。

次に、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> 
} 
+0

を、感謝を働きました!この「[render_item(item)| acc]」が何であるか不思議です。これは何とか出力を蓄積していますか? accとは何ですか? – alkazar

+0

accはタイプリストのアキュムレータで、xhtmlのリストです。 '[e | acc] '' acc'のリストの先頭に 'e'を追加します。 –

+0

http://doc.opalang.org/refcard#!/refcard/Standard-library/Containers/list –

関連する問題