A fold
рекурсивно применяет вашу функцию сворачивания ко всем значениям списка, начиная с начального состояния, которое в данном случае вам особенно не нужно.
Проще использовать сокращение, использующее заголовок списка в качестве его начального состояния:
listOfThings |> List.reduce (fun sum cur -> sum + "," + cur) // "a,b,c"
Незначительный недостаток заключается в том, что, поскольку он использует заголовок списка, вызов метода visible с пустым списком завершится неудачно. Вы можете уменьшить это с помощью проверки пустого списка.
Без встроенных модулей, как вы описали, мы пропускаем добавление запятой в конце для последнего элемента:
let rec join = function
| [] -> ""
| [x] -> x
| x::xs -> x + "," + join xs
["a"; "b"; "c"] |> join // a,b,c
Однако наиболее эффективным методом будет использование String.Join
, который внутренне использует StringBuilder
, тогда как reduce
выделяет новую строку для каждого вызова:
String.Join(",", listOfThings) // "a,b,c"