Я знаю, что вы написали "без добавления таких вещей, как активные шаблоны", но я опубликую решение, которое использует их в любом случае. Они идеально подходят для подобных задач и представляют собой довольно стандартную функцию F #, поэтому на самом деле нет причин, по которым вы бы хотели их избежать. Использование здесь активных шаблонов делает код определенно более читабельным.
(Если вы новичок в F #, то я не понимаю, почему вы хотите начать с простого решения - в любом случае, это может быть хорошей мотивацией для вас, чтобы в конечном итоге выучить активные паттерны :-), они не так сложно, как они могут показаться на первый взгляд)
Вы можете определить активный шаблон, который соответствует, если строка отформатирована как IP-адрес (состоящий из четырех подстрок, разделенных "."):
let (|IPString|_|) (s:string) =
match s.Split('.') with
| [|a;b;c;d|] -> Some(a, b, c, d) // Returns 'Some' denoting a success
| _ -> None // The pattern failed (string was ill-formed)
match s with
| IPString(a, b, c, d) ->
// Matches if the active pattern 'IPString' succeeds and gives
// us the four parts of the IP address (as strings)
(parseOrParts a, parseOrParts b, parseOrParts c, parseOrParts d)
| _ -> failwith "wrong format"
Это правильный способ, который позволяет вам обрабатывать случай, когда строка неверна. Конечно, вы можете определить версию, которая никогда не завершится с ошибкой (и возвращает, например, 0.0.0.0, если строка неверна):
// This active pattern always succeeds, so it doesn't include the "|_|" part
// in the name. In both branches we return a tuple of four values.
let (|IPString|) (s:string) =
match s.Split('.') with
| [|a;b;c;d|] -> (a, b, c, d)
| _ -> ("0", "0", "0", "0")
let (IPString(a, b, c, d)) = str
(parseOrParts a, parseOrParts b, parseOrParts c, parseOrParts d)
Я думаю, что большинство людей согласится, что это более читабельно. Конечно, если вы хотите написать что-то простое только для сценария единственного назначения, вы можете просто проигнорировать предупреждение, но для всего более крупного я бы предпочел активные шаблоны.