F# 具有ROP-F的SQL类型提供程序#

F# 具有ROP-F的SQL类型提供程序#,f#,type-providers,f#-data,F#,Type Providers,F# Data,我试图使用面向铁路的编程原理,并以此作为参考 我已经在大多数代码库中成功地实现了这一点,但现在我们开始将项目放入SQL,并希望使用ROP来验证这些类型。典型的模式是 图1: let createSomething a b c = {A = a; B = b; C = c} let createValidSomething so = createSomething <!> validateFunction1 so.param1 <*> valida

我试图使用面向铁路的编程原理,并以此作为参考

我已经在大多数代码库中成功地实现了这一点,但现在我们开始将项目放入SQL,并希望使用ROP来验证这些类型。典型的模式是

图1:

let createSomething a b c = {A = a; B = b; C = c}
let createValidSomething so = 
    createSomething
    <!> validateFunction1 so.param1
    <*> validateFunction2 so.param2
    <*> ...so forth and so on
在这一点上,我们知道这已经不起作用了,我们有一个->b->c->d->e->f->g->上下文

我知道我可以有一个中间记录类型并遵循ROP原则,在成功/失败时匹配,然后在已经验证的基础上创建我的对象。但这似乎不是太多步骤吗

有人知道这有什么好模式吗?理想情况下,我们可以使用一个类似于图1的函数来生成与类型提供程序兼容的记录类型


我愿意尝试一些东西并在Skype上玩:)。

您的函数
createSQS
是否应该像这样更好:

let createSQS a b c d e f g =
    context.``[dbo].[Something]``.Create(a, b, c, d, e, f, g)
[<HttpPost>]
x.member Add(sa:Something) =
           sa|>ValidateSomething
           >>= converttoSSA
           >>= persistSSA

这一个将具有所需的签名
a->b->c->d->e->f->g->context。[dbo].[Something].Entity

,因此我们在开发会议上提出了一个答案,并决定我们实际上希望在其各自的函数中执行每个部分。对于内部绑定,我们发明了自己的操作符;类似于plus(&&&)(我将在我的网站上发布博客),在顶层,我们使用普通绑定运行

我们的顶级代码如下所示:

let createSQS a b c d e f g =
    context.``[dbo].[Something]``.Create(a, b, c, d, e, f, g)
[<HttpPost>]
x.member Add(sa:Something) =
           sa|>ValidateSomething
           >>= converttoSSA
           >>= persistSSA
[]
x、 成员添加(sa:某物)=
sa |>验证方法
>>=converttoSSA
>>=persissa
由于验证、转换和持久性的独立可测试性,我们决定将关注点分开。该理论认为,如果功能组合由保证工作的功能组成,那么它本身就保证工作(或者有更好的机会)


如果我们使用所提出的方法(我们还没有解决这个问题),我们将混合对创建、验证和转换的关注。这也会导致创建一个不必要的额外记录类型。

您指的是哪个SQL类型提供程序?您可以通过提供另一个方法来实现它吗?FSharp.Data.SQL.sqldataprovider不确定我是否可以提供另一个以相同方式公开类型构造的方法。示例?啊,这两种风格的函数实际上返回的是完全相同的东西。我继续从我的风格中删除了额外的代码。我们正在寻找的签名是:a->b->c->a'->b'->c'在您的示例中,createSomething的确切签名是什么?如果我看得对的话,它是a->b->c->Foo,其中Foo={a:a;b:b;c:c}。参见下面的答案。createSomething的签名是a->b->c->a'->b'->c'