gpt4 book ai didi

f# - 在柯里化(Currying)参数中通过引用传递参数

转载 作者:行者123 更新时间:2023-12-01 07:33:37 25 4
gpt4 key购买 nike

我正在尝试在 F# 中实现接口(interface) IDispatchMessageInspector(WCF 的名声):

open System.ServiceModel.Dispatcher
open System.ServiceModel.Channels

type ServiceInterceptor() as interceptor =

abstract member PreInvoke : byref<Message> -> obj
abstract member PostInvoke : byref<Message> -> obj -> unit

default x.PreInvoke m = null
default x.PostInvoke m s = ()

interface IDispatchMessageInspector with
member x.AfterReceiveRequest(request, channel, instanceContext) = interceptor.PreInvoke(&request)
member x.BeforeSendReply(reply : byref<Message>, correlationState) = interceptor.PostInvoke &reply correlationState

编译失败,出现以下错误:

enter image description here

但是,如果我将我的代码修改为以下内容(请注意 PostInvoke 中签名的更改)一切正常:

open System.ServiceModel.Dispatcher
open System.ServiceModel.Channels

type ServiceInterceptor() as interceptor =

abstract member PreInvoke : byref<Message> -> obj
abstract member PostInvoke : byref<Message> * obj -> unit

default x.PreInvoke m = null
default x.PostInvoke (m, s) = ()

interface IDispatchMessageInspector with
member x.AfterReceiveRequest(request, channel, instanceContext) = interceptor.PreInvoke(&request)
member x.BeforeSendReply(reply : byref<Message>, correlationState) = interceptor.PostInvoke(&reply, correlationState)

这种行为是预期的吗?如果可以,有人可以解释其背后的原因....

最佳答案

原因是byref<'T>不是 .NET 中的真实类型。 F# 使用它来表示通过 ref 传递的值和 out参数,但它不是可以出现在程序中任何地方的普通类型。

F# 限制了它们的使用范围——您只能将它们用于局部变量(基本上传递引用或指针)并且您可以将它们用作方法参数(编译器可以将其编译为方法参数)。

使用 curried 方法,编译器会生成一个返回函数值的属性,因此(在幕后),您会得到类似于属性 PostInvoke 的东西。类型 FSharpFunc<T1, FSharpFunc<T2, T3>> .在这里,T1T2不能是 byref<T>类型,因为 byref不是真正的 .NET 类型。所以这就是柯里化(Currying)方法不能有 byref 的原因参数。

您可以看到的另一种情况是,例如,如果您尝试创建 byref 的列表值(value)观:

let foo () =
let a : list<byref<int>> = []
a

在这里你得到:

error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL.

关于f# - 在柯里化(Currying)参数中通过引用传递参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33307473/

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