2016-02-21 2 views
0

Как передать аргумент в 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 } 
+1

Почему не это компилировать? Я бы ожидал этого. Кроме того, выглядит лучше;) – scrwtp

+0

Вы можете связать два вопроса вместе. –

ответ

0

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

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

Клиент:

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 
0

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

Async.RunSynchronously (connectAsync brick) 

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

Async.RunSynchronously (moveAsync(brick)) 

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

+0

@ Fyodor - Клиент фактически компилируется. Можете ли вы уточнить, что мне нужно сделать, чтобы сделать кирпич определенным. Я пытаюсь узнать F #. Следовательно, я не профессиональный разработчик F #. –

+0

Чтобы определить 'brick', вам нужно определить его, как вы делаете в первой строке' main'. Если компиляция «клиент» означает, что вы определили «кирпич» где-то в приведенном выше коде, который вы не показываете нам. –

Смежные вопросы