F # эквивалент оператора C # / символ "?." - PullRequest
0 голосов
/ 12 февраля 2019

У меня следующий код f #

product.code <- productPage.Html
    .Descendants["li"]
    .Select(fun node -> node.InnerText())
    .Where(fun link -> (Regex.Match(link,@"code:").Success))
    .FirstOrDefault()
    .Replace("code:", "")
    .Trim()

У меня проблемы с нулями.В c # я бы сделал что-то вроде этого.

product.code = productPage?.Html
    ?.Descendants["li"]
    ?.Select(node => node.InnerText())
    ?.Where(link => Regex.Match(link,@"code:").Success)
    ?.FirstOrDefault()
    ?.Replace("code:", "")
    ?.Trim() ?? "Not Found"

Возможно ли это?

1 Ответ

0 голосов
/ 12 февраля 2019

Во втором примере это выглядит как «?».должен быть перенесен по всей цепочке вызовов из-за его первоначального использования.Вместо того, чтобы пытаться воссоздать этот оператор и сохранить то, как это выглядит в C #, я предлагаю вам перейти на более идиоматический F #.Например:

module String =
    let replace (oldValue: string) (newValue: string) (s: string) =
        s.Replace (oldValue, newValue)

    let trim (s: string) =
        s.Trim()

let result =
    match isNull productPage with
    | true -> None
    | false ->
        productPage.Html.Descendants.["li"]
        |> Seq.map (fun node -> node.InnerText())
        |> Seq.tryPick (fun link -> (Regex.Match (link, "code:").Success))

let code =
    match result with
    | Some html -> 
        html
        |> String.replace "code:" ""
        |> String.trim
    | None -> "Not Found" 

product.code <- code
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...