Если бы я писал это, я бы предпочел цикл for
вместо функции более высокого порядка iter
. Вы все равно пишете императивный код (для работы с императивными объектами), и я не думаю, что использование iter
делает его «более функциональным». F # также поддерживает императивное программирование, поэтому мы можем использовать эти императивные функции в этом случае:
let myHash = Hashtable()
for (KeyValue(k, v)) in myMap do
myHash.Add(k, v)
Я обычно предпочитаю iter
функцию только тогда, когда мне не нужно писать явную лямбда-функцию в качестве второго параметра. Например, если будет работать следующее:
myMap |> Seq.iter myHash.Add // This doesn't work, so I prefer 'for' instead
Если у вас есть некоторый контроль над кодом C #, вы также можете рассмотреть возможность использования IDictionary<'K, 'V>
в C # вместо Hashtable
. В этом случае вы можете легко передать F # Map<'K, 'V>
в результате, потому что map реализует интерфейс IDictionary<'K, 'V>
(именно для обеспечения плавного использования из C #).