Как я могу вызвать привязку к вычислительному выражению без ключевого слова let?

Скажем, у меня есть это:

MyComputationExpression {
    let! addr = Salesrecord.Address
    let! name = Salesrecord.Name
    return (name + " " + addr)
}

Есть ли способ «развернуть» (вызвать метод bind) адрес и имя на лету? Вроде как:

MyComputationExpression {
    (Salesrecord.Name! + " " + Salesrecord.Address!)
}

(Если ! был оператором для развертывания на лету). Кажется немного многословным объявлять новую переменную каждый раз, когда я хочу использовать результат bind только один раз.


person Kurren    schedule 16.11.2017    source источник


Ответы (2)


Методы Bind и Return доступны на MyComputationExpression. Ваш исходный код преобразуется в этот эквивалентный код:

MyComputationExpression.Bind(
    Salesrecord.Address,
    fun addr -> MyComputationExpression.Bind(
        Salesrecord.Name,
        fun name -> async.Return (name + " " + addr)))

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

person TheQuickBrownFox    schedule 16.11.2017

Ваш конкретный пример может быть легко вызван из оператора, чтобы быть встроенным:

let inline (+?) a b =
    MyComputationExpression(){
        let! x = a
        let! y = b
        return x + y }

Some 3 +? None
salesrecord.Address +? Some " " +? salesrecord.Name

В более сложных случаях необходимость явного выполнения bind в оставшейся части вычисления может, по крайней мере, улучшить читаемость.

person kaefer    schedule 16.11.2017