2016-04-16 5 views
4

Я новичок в функциональном программировании и F #, и там очень много информации о том, как это сделать (удаление определенных символов из строки) в F #, но я столкнулся со следующей функцией и буду признателен небольшая помощь, чтобы точно понять, что происходит:Сбрасывание символов из строки в F #

let stripchars chars str = 
    Seq.fold 
    (fun (str: string) chr -> 
     str.Replace(chr |> Char.ToUpper |> string, "").Replace(chr |> Char.ToLower |> string, "")) 
    str chars 

Я использовал функцию stripchars, вызвав его в функции разделенного я определил так:

let split (str : string) = 
    ((stripchars "?,.,!,," str).Split ' ') |> Array.toList 

Что мне трудно понять прямо сейчас в функции stripchars, когда аргумент «chars» равен пройденный, содержащий последовательность символов для удаления из строки str, она даже не используется в коде до последней строки «str chars». Так как это может работать?

+3

'chars' - это не последняя строка функции. Это всего лишь одна функция, которая действительно длинна, поэтому они разделяли ее на несколько строк. Это действительно 'Seq.fold str chars'. Поскольку '' настолько длинный, это делается для удобства чтения. Поместите все это на одну строку и запустите ее, чтобы увидеть. –

+0

Я получаю это сейчас, большое спасибо! –

+0

Если вы используете это на больших строках, вызов String.Replace дважды для каждого символа, который вы хотите разбить, будет довольно медленным. Если у вас очень большой ввод и небольшой список символов для полосы, эта функция проходит небольшой список символов один раз, а большой вход много раз, что точно в обратном порядке. Для небольших входных строк это, конечно, не имеет значения, если эта функция не называется много. –

ответ

4

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

let stripchars chars str = 
    let removeOneChar (str : string) chr = 
     str.Replace(chr |> Char.ToUpper |> string, "").Replace(chr |> Char.ToLower |> string, "") 
    Seq.fold removeOneChar str chars 

Возвращаемое значение этой функции последнее выражение, Seq.fold removeOneChar str chars.

Функция removeOneChar имеет тип string -> char -> string.

+0

Спасибо за объяснение! Ваша переформатированная функция работает как очарование и действительно более читаема. –

 Смежные вопросы

  • Нет связанных вопросов^_^