Как передать аргумент в Async.RunSynchronously?

Как передать аргумент в Async.RunSynchronously?

Я пытаюсь сделать следующее:

Async.RunSynchronously (moveAsync brick)

Конечно, это не компилируется:

Значение или конструктор «кирпич» не определен

Я обновил свой код, но все еще сталкиваюсь с той же проблемой, связанной с передачей аргумента в Async.RunSynchronously.

Клиент:

открыть LegoCommands

[<EntryPoint>]
let main argv =
    connectAsync |> Async.RunSynchronously |> ignore
    moveAsync    |> Async.RunSynchronously |> ignore
    speakAsync   |> Async.RunSynchronously |> ignore

    0 // return an integer exit code

Домен:

В настоящее время мой код работает, устанавливая внешнюю переменную-член, и мои функции ссылаются на нее.

let brick = Brick(UsbCommunication())

Я не хочу этого.

module LegoCommands

open Lego.Ev3.Core
open Lego.Ev3.Desktop
open System.Threading.Tasks
open Arguments

let brick = Brick(UsbCommunication())

let awaitTask (task: Task) = task |> Async.AwaitIAsyncResult
                                  |> Async.Ignore
let connectAsync = async {
    do! brick.ConnectAsync() |> awaitTask }

let moveAsync = async {
    do! brick.DirectCommand.TurnMotorAtPowerForTimeAsync(motors, power, uint32 duration, breakEnabled) |> awaitTask }

let speakAsync = async {
    do! brick.DirectCommand.PlayToneAsync(volume, frequency, duration) |> awaitTask }

person Scott Nimrod    schedule 21.02.2016    source источник
comment
Почему не компилируется? Я ожидал этого. К тому же выглядит лучше ;)   -  person scrwtp    schedule 21.02.2016
comment
Возможно, вы захотите связать два вопроса вместе.   -  person Guy Coder    schedule 21.02.2016


Ответы (2)


В третьей строке «клиент» вы используете brick, который еще не определен на тот момент.

Async.RunSynchronously (connectAsync brick)

То же самое происходит в последней строке «домена»:

Async.RunSynchronously (moveAsync(brick))

Сообщение об ошибке говорит вам именно об этом: brick не определено.

person Fyodor Soikin    schedule 21.02.2016
comment
@ Федор - Клиент действительно компилируется. Можете ли вы уточнить, что мне нужно сделать, чтобы определить кирпич. Я пытаюсь изучить F#. Следовательно, я не профессиональный разработчик F #. - person Scott Nimrod; 21.02.2016
comment
Чтобы определить brick, вам нужно определить его, как вы это делаете в первой строке main. Если клиент компилируется, это означает, что вы определили brick где-то в приведенном выше коде, который вы нам не показываете. - person Fyodor Soikin; 21.02.2016

Я не уверен, что я сделал неправильно.

Но я больше не наблюдаю ошибку.

Клиент:

open LegoCommands
open Lego.Ev3.Core
open Lego.Ev3.Desktop

[<EntryPoint>]
let main argv =
    let brick = Brick(UsbCommunication())
    brick |> connectAsync |> Async.RunSynchronously |> ignore
    brick |> moveAsync    |> Async.RunSynchronously |> ignore
    brick |> speakAsync   |> Async.RunSynchronously |> ignore

    0 // return an integer exit code

Домен:

module LegoCommands

open Lego.Ev3.Core
open Lego.Ev3.Desktop
open System.Threading.Tasks
open Arguments

let awaitTask (task: Task) = task |> Async.AwaitIAsyncResult
                                  |> Async.Ignore
let connectAsync (brick:Brick) = async {
    do! brick.ConnectAsync() |> awaitTask }

let moveAsync (brick:Brick) = async {
    do! brick.DirectCommand.TurnMotorAtPowerForTimeAsync(motors, power, uint32 duration, breakEnabled) |> awaitTask }

let speakAsync (brick:Brick) = async {
    do! brick.DirectCommand.PlayToneAsync(volume, frequency, duration) |> awaitTask }

Параметры:

module Arguments
open Lego.Ev3.Core

let volume = 50
let frequency = uint16 3000
let duration = uint16 333
let power = 100
let motors = OutputPort.B ||| OutputPort.C
let breakEnabled = false
person Scott Nimrod    schedule 21.02.2016