簡體   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