Ocaml преобразовать список строк в строку

Я новичок в Ocaml, и я выполняю задачу, в которой хочу преобразовать список строк в строку ( список строк -> строка = ), где он объединяет элементы, добавляя пробел между ними. Также, если это ведущий элемент, он также добавляет "" и игнорирует пустые строки.

Мой код до сих пор:

let rec join list = function 
  | [] -> ""
  | [e1] -> e1
  | ""::e2 -> join list e2
  | e1::e2 -> e1 ^ list ^ join list e2 ;;

Не уверен, что это правильно, однако я даже не могу проверить это, потому что я не знаю, как исправить ошибку и изменить параметр, поскольку он говорит, что ожидается вызов функции со строкой, а не со списком строк.

Также какие-либо дополнительные советы о том, как добавить «» ТОЛЬКО к первому ведущему элементу?

Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
0
0
47
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете просто использовать String.concat:

String.concat " " ["foo"; "bar"; "baz"]
- : string = "foo bar baz"
Ответ принят как подходящий

Проблема в том, что join имеет тип string -> string list -> string, а не string list -> string, потому что function создает функцию, а не совпадение. То, что вы хотите, это

let rec join = function
  | [] -> ""
  | ""::tail -> join tail
  | hd::tail -> hd ^ join tail

Обратите внимание, что ваш базовый регистр [e1] -> e1 бесполезен, потому что это также e1::[], который трансформируется в e1 ^ join [], который, в свою очередь, становится e1 ^ "", то есть e1.

Кроме того, вы можете сделать это с помощью String.concat, но, поскольку вы не хотите добавлять пробел, если у вас есть пустая строка, вы должны сначала filter.

let join l =
  List.filter (fun s -> s <> "") l
  |> String.concat ""

Другие вопросы по теме