>> =运算符是否不接受函数?

时间:2017-09-16 21:37:48

标签: f# hopac

我正在进行一个侧面项目,我第一次使用Hopac。我遇到了一个奇怪的(对我来说)编译问题,我无法理解。我怀疑这是我的问题,而不是Hopac。

该程序应该是一个简单的控制台应用程序,它消耗来自各种服务的通知。这是有问题的模块:

module Provider

open System
open System.IO
open Hopac
open BitThicket.NotificationHelper.Core
open BitThicket.NotificationHelper.Providers

let defaultProviderTypes =
    [| typeof<GitHub.GitHubNotificationProvider> |]

type Provider = {
    getCh : Ch<Providers.INotification seq>
}

let giveLatest ch latest =
    Ch.give 

let start config logger (providerType:Type) = Job.delay <| fun () ->
    let providerImpl = Activator.CreateInstance(providerType) :?> Providers.INotificationProvider
    let p = { getCh = Ch() }

    let rec server = 
        let latest = providerImpl.GetLatestNotificationsAsync(None) |> Job.fromAsync 
        latest >>= Ch.give p.getCh // error here
    }

    Job.start server

在这种情况下,编译器会抱怨:Expecting a type supporting the operator '>>=' but given a function type. You may be missing an argument to a function.

同样,如果我使用稍微不同的语法:

// ...
    let rec server =
        let latest = providerImpl.GetLatestNotificationsAsync(None) |> Job.fromAsync
        latest >>= fun l -> Ch.give p.getCh l // error here
// ...

在这种情况下,错误是:This function takes too many arguments, or is used in a context where a function is not expected.

我向哈夫询问他的懈怠,他的建议是检查>>=的其他定义。工具并没有真正帮助我解决这个问题,但我打开的唯一定义>>=的命名空间/模块是HopacBitThicket只是{简单的名称空间,其中包含一些类型定义。)

我在这里做错了什么?

1 个答案:

答案 0 :(得分:2)

我正在查看源代码,我发现绑定运算符实际上是在Hopac.Infixes中定义的,而不是Hopac中的。