Есть ли способ, чтобы улучшить (сократить) этот код F#?


У меня есть очень хорошее понимание синтаксис и особенности языка F#, а также некоторые понятия, которые сочетаются с языком. Однако, мне не хватает опыта пишу это, чтобы чувствовать себя комфортно, что путь я обрабатываю язык вполне уместен.

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

Также, есть ли способ, что я мог бы написать это более надежно, так что при добавлении в escape-последовательность для символа было бы легче?

module Comments

open System.IO

type Comment = { Author: string; Body: string }

let parseComment (line:string) =
    match line.Split(';') with
    | [|author; body|] -> Some({Author=author; Body=body})
    | _                -> None

let filterOutNone maybe = match maybe with | Some(_) -> true | _ -> false
let makeSome some = match some with | Some(v) -> v | _ -> failwith "error"

let readAllComments () = 
    File.ReadAllLines("comments.txt")
    |> Array.map parseComment
    |> Array.filter filterOutNone
    |> Array.map makeSome


532
6
задан 27 мая 2011 в 10:05 Источник Поделиться
Комментарии
3 ответа

Посмотри в массиве.выбрать. Используя эту функцию сокращения длины кода в половину, так как по сути заново его. (Я сделал то же самое в какой-то момент ;-)

6
ответ дан 28 мая 2011 в 01:05 Источник Поделиться

Большую часть кода можно заменить понимания:

type Comment = { Author: string; Body: string }

let readAllComments () =
[|for line in System.IO.File.ReadAllLines("comments.txt") do
match line.Split ';' with
| [|author; body|] -> yield {Author=author; Body=body}
| _ -> ()|]

6
ответ дан 9 марта 2012 в 09:03 Источник Поделиться

Вашему делаю некоторые функции смешения имени. Слово "сделай" предполагает, что это создаст некоторые, но что она действительно делает это взять немного и потом возвратить его значение. Так это должно называться что-то вроде getValueFromSome или getValueFromOption. Однако все это не имеет значения, поскольку это просто перевыполнение встроенный вариант.вам функции, так что вы должны использовать это.

При этом вы на самом деле не нужна эта функция, если вы используете массив.выбрать как wmeyer предполагает (который вы должны). Тем не менее, если вам понадобится эта функция в другом контексте, вы должны использовать опцию.вам , а не повторно его самостоятельно.

2
ответ дан 28 мая 2011 в 04:05 Источник Поделиться