[英]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.