繁体   English   中英

如何在 F# 中创建 System.Buffers.SpanAction 类型的委托以在 String.Create 中使用?

[英]How can I create a delegate in F# of the type System.Buffers.SpanAction for use in String.Create?

在 F# Slack 上也有人问过这个问题,但由于更广泛的社区看不到这个问题,而且我还没有解决方案,所以我认为在这里问这个问题是有意义的。

基本上, String.CreateSpan一起创建一个新字符串并接受一个委托来填充跨度。 这通常比以正常方式更改字符串更快:创建一个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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM