Присоединиться к массиву строк?

В JavaScript вы можете присоединиться к массиву строк, например:

fruits = ["orange", "apple", "banana"];
joined = fruits.join(", ");

console.log(joined)

// "orange, apple, banana"

Как это сделать в ReasonML?


person Rotareti    schedule 20.04.2018    source источник
comment
Что не так с вопросом?   -  person Rotareti    schedule 20.04.2018
comment
@glennsl Этот вопрос был задан и ответил почти на всех языках SO. Жаль, что никто не хочет отвечать за ReasonML. Я провел небольшое исследование, и нет, для новичка не очевидно, что любое из ваших решений является правильным. Какое гостеприимное сообщество.   -  person Rotareti    schedule 21.04.2018
comment
@glennsl причина, по которой stackoverflow полезен для разработчиков, заключается в том, что у него есть ответы практически на любой вопрос. Для многих языков stackoverflow становится намного проще, чем документация, чтобы найти решение. Только мое мнение.   -  person JasoonS    schedule 28.04.2018
comment
Вероятно, для нативного скрипта или для Bucklescript ответ будет другим, это нужно указывать в вопросе. Можете ли вы дать отзыв на полученные ответы?   -  person tokland    schedule 11.07.2018


Ответы (3)


Вы можете использовать Js.Array.joinWith:

let fruits = [|"orange", "apple", "banana"|];
let joined = Js.Array.joinWith(", ", fruits);
Js.log(joined);
// "orange, apple, banana"
person noziar    schedule 26.04.2018
comment
Использование Js.Array.join не рекомендуется, поскольку он компилируется в JS array.join(), в котором в качестве разделителя используется запятая. - person tokland; 11.07.2018
comment
Верно, я удалил ссылку на Js.Array.join из своего ответа. - person noziar; 18.07.2018

Преобразование массива в строку объединенных значений звучит как задание для Array.fold_left, однако выполняется

Array.fold_left((a, b) => a ++ "," ++ b, "", fruits);

производит "апельсин, яблоко, банан".

В идеале начальное значение для свертки (второй аргумент) должно быть первым элементом в массиве и фактически используемым массивом, это позволяет избежать начальной запятой. К сожалению, это нелегко сделать с массивами, но со списками:

let fruitList = Array.to_list(fruits);
let joined = List.fold_left((a, b) => a ++ "," ++ b, List.hd(fruitList), List.tl(fruitList));
/*joined = "orange,apple,banana"*/

Reasonml документы в списках

person shtanton    schedule 23.05.2018

Вот как реализовать вашу собственную join функцию в ReasonML:

let rec join = (char: string, list: list(string)): string => {
  switch(list) {
  | [] => raise(Failure("Passed an empty list"))
  | [tail] => tail
  | [head, ...tail] => head ++ char ++ join(char, tail)
  };
};

При этом Js.log(join("$", ["a", "b", "c"])) дает вам "a$b$c", как и JavaScript.

person Bertrand    schedule 03.07.2018