F #: есть ли инфиксный оператор, который мог бы позволить повторно использовать методы объекта для последующего |>? - PullRequest
3 голосов
/ 05 июня 2019

Мой коллега конвертирует C # ниже в F #:

string GetLatestTestResultXmlPath() =>
    new DirectoryInfo(Path.Combine(projFolder, "TestResults"))
        .GetDirectories()
        .OrderByDescending(d => d.LastWriteTime)
        .First()
        .GetDirectories("Out")
        .First()
        .GetFiles("*.log")
        .First()
        .FullName

Самый естественный результат, который он получил:

let latestTestResultFilePath =
    (new DirectoryInfo(Path.Combine(projFolder, "TestResults")))
        .GetDirectories()
        .OrderByDescending(fun d -> d.LastWriteTime)
        .First()
        .GetDirectories("Out")
        .First()
        .GetFiles("*.log")
        .First()
        .FullName

Хотя это совершенно нормально, ему было интересно, может ли он получить что-то, используя оператор инфикса над последующими |> операторами конвейерной передачи. Что-то в этом роде:

let latestTestResultFilePath =
    let directoryInfo = new DirectoryInfo(Path.Combine(projFolder, "TestResults"))
    directoryInfo 
    |> (// magic operator here).GetDirectories()
    |> (// magic operator here).OrderByDescending(fun d -> d.LastWriteTime)
    |> (// magic operator here).First()
    |> (// magic operator here).GetDirectories("Out")
    |> (// magic operator here).First()
    |> (// magic operator here).GetFiles("*.log")
    |> (// magic operator here).First()
    |> (// magic operator here).FullName

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

Это чисто из любопытства.

1 Ответ

0 голосов
/ 21 июня 2019

Это невозможно, потому что вы используете LINQ, который является статическим расширением.

...