Предоставляет ли F# какой-либо "стандартный" набор операторов для работы с монадическими (в частности Async) операциями вне вычислительных выражений? Я обнаружил, что мой код в конечном итоге засорен множеством локальных определений операторов, таких как:

let (>>=) a b = async.Bind (a, b)

С учетом того, насколько хорош набор операторов для составления чистых функций - <|, |> и >> и т.д. - я чувствую, что, должно быть, я что-то упускаю.

Предвосхищая возможные комментарии - вычислительные выражения хороши для некоторых вещей, но для конвейеризации серии асинхронных операций:

async {
    let! a' = a
    let! b' = b a'
    return! c b'
}

Не так приятно, как:

a >>= b >>= c

geoff_h

Ответов: 1

Ответы (1)

В основных библиотеках F# ничего подобного нет.

Я бы сказал, что эти операторы - дело вкуса. Не все пришли в F# из Haskell, и для тех, кто не пришел, такой код может показаться не совсем "приятным".

Для меня лучше всего работает наличие "дружественных к конвейеру" версий этих операций, как нечто среднее между рабочими процессами и встроенными операторами:

module Async = 
    let bind f a = async.Bind (a, f)

Это дает вам достаточно веревки для работы с монадическими типами вне рабочих процессов, при этом используя стандартный набор операторов композиции функций:

a
|> Async.bind b
|> Async.bind c  

Для получения более хаскелеподобного опыта в F#, FsControl может быть тем, что вы ищете. Он предоставляет вам общие операторы связывания, а также другие вещи, связанные с типовыми классами.

2022 WebDevInsider