Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Generics F#和泛型:我可以有一个泛型函数集合,每个函数都有它';什么是自己的泛型类型?_Generics_F# - Fatal编程技术网

Generics F#和泛型:我可以有一个泛型函数集合,每个函数都有它';什么是自己的泛型类型?

Generics F#和泛型:我可以有一个泛型函数集合,每个函数都有它';什么是自己的泛型类型?,generics,f#,Generics,F#,我想定义这样的通用工作流(简化) 现在我需要进入中间,在每个工作流中间做一些“通用”的东西。所以我决定将其拆分为两步函数,但现在我无法定义包含所有定义的集合 编辑#2 试图更精确地解释我所做的事情:原始工作流需要被分割成部分并在中间注入“通用”代码,让我们说: type FnBefore<'a> = RawInput -> 'a // --I was wrong here: type FnVerify<'a> = 'a -> bool type FnUni

我想定义这样的通用工作流(简化)

现在我需要进入中间,在每个工作流中间做一些“通用”的东西。所以我决定将其拆分为两步函数,但现在我无法定义包含所有定义的集合


编辑#2

试图更精确地解释我所做的事情:原始工作流需要被分割成部分并在中间注入“通用”代码,让我们说:

type FnBefore<'a> = RawInput -> 'a 
// --I was wrong here: type FnVerify<'a> = 'a -> bool
type FnUniqueKey<'a> = 'a -> UniqueKey
type FnAfter<'a>  = 'a -> RawOutput
type Workflow<'a> = RoutingKey * FnBefore<'a> * FnUniqueKey<'a> * FnAfter<'a>
let workflows: Workflow list = […] // how can I declare'em all?
在bool之前键入fn
类型FNIQUEKEY UniqueKey
输出后输入fn
输入Workflow*funiquekey
let workflows:Workflow list=[…]//如何声明它们?

因此,从现在起,每个工作流将定义3个功能,而不是一个,我希望将所有工作流保留在一个列表中,以便我可以在每个新邮件上选择一个(基于RoutingKey)。
fUniqueKey
应该为验证函数生成唯一密钥,以便在消息之前处理过的情况下查找数据库。

似乎无法创建这样的集合,我决定隐藏
'a
,因此每个元素将公开两个函数,大致如下:

type UniqueKey = UniqueKey of string

type Workflow = // the 'a is hidden within, I cannot see it from here
    { UniqueKeyGetter: unit -> UniqueKey
      Exec           : unit -> RawOutput }

type MkWorkflow = RawInput -> Workflow
现在,我可以创建一个
RoutingKey*MkWorkflow
集合,每个
MkWorkflow
将“创建一个工作流”,产生两个功能:

  • UniqueKeyGetter
    将提供一个函数,用于关闭从
    RawInput
    解码的未知对象(因此我可以点击以检查唯一性)
  • Exec
    仅在工作流运行程序发出绿灯时使用(通过基于
    UniqueKey检查已处理工作流的数据库

现在我可以真正隐藏
'a
。这个
MkWorkflow
让我有点害怕,这是“SometingFactoryProxyProducerGenerator”中的一个步骤虽然从OOP框架中可以看出地狱。

简短的答案是,这是不可能的,但是为了提出替代方案,我们需要知道你到底想做什么。这感觉就像我现在的工作流程只是“代码>某个输入”>某个输出,而且很好,但是现在我需要介入中间,做一些“通用”的事情。在每个工作流中间,所以决定把它分成两步函数,但是现在我没有办法定义包含所有定义的集合。你能给出一个假设插入“类”的例子吗?如果它不编译的话,没关系,只要写一些能传达想法的东西。“工作流功能"在我意识到我需要处理消息副本之前,一切正常。因此,在处理工作流之前,我需要检查它是否已被处理。
SomeInput
只是一条原始RabbitMQ消息。每个工作流都会对其进行反序列化、处理并发布响应。我想在消息反序列化之后和处理之前介入在我的例子中,这个反序列化的消息是<代码> 'A/COD>。好吧,如果您只想在中间应用验证,为什么您需要知道中间<代码> A/<代码>类型?每个工作流都可以有一个函数<代码> RAWPUTH-> RAWOutlook选项< /C> >,其中返回<代码> No.< /代码>将指示失败的验证。
type FnBefore<'a> = RawInput -> 'a 
// --I was wrong here: type FnVerify<'a> = 'a -> bool
type FnUniqueKey<'a> = 'a -> UniqueKey
type FnAfter<'a>  = 'a -> RawOutput
type Workflow<'a> = RoutingKey * FnBefore<'a> * FnUniqueKey<'a> * FnAfter<'a>
let workflows: Workflow list = […] // how can I declare'em all?
type UniqueKey = UniqueKey of string

type Workflow = // the 'a is hidden within, I cannot see it from here
    { UniqueKeyGetter: unit -> UniqueKey
      Exec           : unit -> RawOutput }

type MkWorkflow = RawInput -> Workflow