Разнообразные функции расширения для модуля List.
(Я потратил довольно много времени на разработку "mapfold" - который накладывает такой накопитель как сгиб, но использует его как параметр для создания новых значений, таких как map, а затем обнаружил, что это то, что делает List.scan_left
)
Для генерации тестовых данных мне нужно было сделать перекрестное произведение из двух списков, вот что я придумал:
///Perform cross product of two lists, return tuple
let crossproduct l1 l2 =
let product lst v2 = List.map (fun v1 -> (v1, v2)) lst
List.map_concat (product l1) l2
Это хорошо, или есть ли еще лучший способ сделать это?
Тот же вопрос для этого:
///Perform cross product of three lists, return tuple
let crossproduct3 l1 l2 l3 =
let tuplelist = crossproduct l1 l2 //not sure this is the best way...
let product3 lst2 v3 = List.map (fun (v1, v2) -> (v1, v2, v3)) lst2
List.map_concat (product3 tuplelist) l3