Как я могу использовать String.tokens более одного разделителя?

Поскольку String.tokens является каррированной функцией, я знаю, что могу изменить

String.tokens (fn c =\> c = #" ") "hello world";

в строку, которая будет содержать все разделители, но я просто смущен фактической диктовкой того, как.

Одна из форм, которые я пробовал, была:

fun splitter nil = nil
  | splitter str = 
    let
      val c = " ,.;?:!\t\n"
      val s = String.tokens (fn (c:string,x:char) => c=Char.toString c x) str
    in
      s
end;

C - это строка разделителей, но я знаю, что что-то не так. Если бы кто-нибудь мог указать мне в правильном направлении, это было бы очень признательно.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
57
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Если вы превратите строку, содержащую символы токена, в список с помощью String.explode, то легко использовать List.exists, чтобы узнать, есть ли символ в этой строке токена.

fun splitOn(str, tokens) =
  let 
    val tokens' = String.explode tokens
    fun isToken c = List.exists (fn c' => c = c') tokens'
  in
    String.tokens isToken str
  end;

splitOn("hello world | wooble. foo? bar!", " |.?!");
(* ["hello", "world", "wooble", "foo", "bar"] *)

Я просто хочу уточнить, String.tokens принимает isTokens как функцию, которая принимает токены, которые представляют собой список символов? List.exists возвращает true или false в зависимости от того, находится ли один из символов в токенах в строке str? Затем, основываясь на этом true или false, String.tokens удаляет соответствующие символы из токенов?

johnlewenskal 27.10.2022 22:22
isToken не принимает tokens' в качестве аргумента. Скорее isToken — это замыкание, которое имеет доступ к tokens', когда оно оценивается позже. String.tokens использует эту функцию, чтобы определить, является ли символ токеном, и использует эту информацию для разделения входной строки str.
Chris 27.10.2022 22:25

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