2012-04-04 4 views
1

Was ich wirklich tun möchte, ist über die Schlüssel einer Zeichenkette zu iterieren. Ich benutze die new-fangled Syntax. Ich kann keine Informationen über StringMap.iter() finden, also habe ich die Syntax verwendet, die ich irgendwo für List.iter() gefunden habe. Ich glaube nicht, dass der ursprüngliche Code tatsächlich über die Schlüssel iteriert wurde, und im Moment würde ich mich damit begnügen, über die Werte zu iterieren, wenn ich das zum Funktionieren bringen könnte.Wie man über die Schlüssel in einer Zeichenkette iteriert?

Der Code Ich habe hier ist: http://pastebin.com/9HB20yzy

Ich erhalte die folgende Fehlermeldung:

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

ich mehrere andere Methoden ausprobiert, aber sie schien die alte Syntax und nicht besonders gut harmonierten zu verwenden mit dem Compiler. Ich verstehe nicht wirklich, was dieser Fehler Voodoo mir sagt, so ist die Frage, wie verwendet man StringMap.iter()? Oder in anderer Weise über die Schlüssel in einer StringMap iterieren?

Antwort

0

Function types have different arguments arity (2 versus 1) bedeutet, dass Sie versuchen, eine Funktion mit 1 Argument zu verwenden, während eine Funktion mit 2 Argumenten erwartet wird. Sie durchlaufen eine Liste nur über values, aber Sie durchlaufen eine Karte durch keys und values.

Dann sind List.iter oder StringMap.iter sind Nebenwirkung (wie Anmeldung in der Konsole zum Beispiel). Sie geben keinen Wert zurück. Dies ist wahrscheinlich nicht das, was Sie in Ihrem Code tun möchten.

sollten Sie StringMap.fold statt:

// 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

Das funktionierte, danke! Ich frage mich nur, worum es bei "[render_item (item) | acc]" geht? Sammelt das irgendwie die Ausgabe? Was genau ist das? – alkazar

+0

acc ist ein Akkumulator der Typenliste, eine Liste von xhtml. '[e | acc] 'add' e' am Anfang der Liste 'acc'. –

+0

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