gpt4 book ai didi

f# - 我将如何限制非功能?

转载 作者:行者123 更新时间:2023-12-02 09:28:38 25 4
gpt4 key购买 nike

我正在编写抽象 System.Data.IDbConnection 及其同级的代码。

目标代码

let inline runWithConnection connector f = 
match connector with
| ICon con -> f con
| CString cs ->
use conn = new SqlConnection(cs)
openConnection conn
f conn

我可以看到类型约束编译并运行,但约束对象没有达到预期的效果。我想限制一个对象或值,该对象或值不是需要更多输入才能返回某些内容的函数。或者以这样的方式编写:如果它确实返回一个函数,则可能创建的连接不会关闭,直到 f 完成它。

let inline runWithConnection connector (f:_ -> 't when 't :> obj) = 
match connector with
| ICon con -> f con
| CString cs ->
use conn = new SqlConnection(cs)
openConnection conn
f conn

It seems你可以说't : not struct,但不能说't: not delegate

我想过做 f.GetType() 但后来我不知道哪些类型属性,如 .IsClass.IsAbstract.IsValue 将与委托(delegate)类型一致,而不是其他简单类型。而且这将是运行时而不是编译时,并不能真正改善情况。

最佳答案

我认为你所说的,当你使用柯里化(Currying)的f调用runWithConnection时,这不起作用,因为连接在第一个部分函数返回后被释放.

没有通用约束可以解决这个问题,因为你不能约束一个不是函数的类型。这在 F#、C#、Java 等中都是相同的。

您可能会抛出运行时异常,但我认为重新审视您正在尝试的模式要容易得多。我想问的是,通过让外部函数执行它传递的函数,而不是仅仅将生成的连接作为 IDisposable 返回,可以节省什么。这将使调用函数控制连接的范围,例如:

use conn = getConnection myConnector
doSomethingWithConnection conn anotherArg

关于f# - 我将如何限制非功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35462215/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com