[英]How can I create a delegate in F# of the type System.Buffers.SpanAction for use in String.Create?
在 F# Slack 上也有人问过这个问题,但由于更广泛的社区看不到这个问题,而且我还没有解决方案,所以我认为在这里问这个问题是有意义的。
基本上, String.Create
与Span
一起创建一个新字符串并接受一个委托来填充跨度。 这通常比以正常方式更改字符串更快:创建一个char
数组,调用AsSpan
,然后使用结果调用适当的String
构造函数。
这工作正常:
let create value =
String.Create(12, value, fun buf v->
for i = 0 to buf.Length do
buf.[i] <- v)
但是,当我尝试使用咖喱的 function 或尝试使用委托时,我收到了类型错误。 根据 F#,委托的类型为SpanAction<'T, 'TArg>
,其中'T
在回调中转换为Span<'T>
,而'TArg
是可用于防止关闭的任何参数。
我尝试了几种变体,但都归结为这个基本思想:
type SpanDelegate<'T, 'TArg> = delegate of Span<'T> * 'TArg -> unit
let callback =
new SpanDelegate<char, char>(fun buf v ->
for i = 0 to buf.Length do buf.[i] <- v)
let create (value: char) =
String.Create(12, value, callback) // type error on callback
无论我是否将它与原始 lambda 一起使用,我似乎都无法让它工作。 欢迎提出想法:)。
您的代码不起作用的原因是您正在创建自定义委托SpanDelegate
,但代码需要预定义的委托SpanAction
。
我不确定我是否正确理解了您的问题(因此我可能遗漏了一些东西),但是如果您创建了预定义的SpanAction
委托,那么一切似乎都运行良好:
open System
open System.Buffers
let callback =
SpanAction<char, char>(fun buf v ->
for i = 0 to buf.Length do buf.[i] <- v)
let create (value: char) =
String.Create(12, value, callback)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.