F# 中的表达式 "some string".[3 .. 7] 调用了哪个函数?

Which function is called for the expression "some string".[3 .. 7] in F#?

刚刚发现使用 f# 可以将子字符串定义为切片:

let s = "the quick brown fox"
s.[4..8] // returns a string!
val it : string = "quick"

值得注意的是切片表达式 return 是一个字符串,而不是一个字符集合。 我以为 F# 核心中的字符串实现了 GetSlice,它会 return 一个字符串,但事实并非如此:

https://github.com/dotnet/fsharp/blob/main/src/fsharp/FSharp.Core/string.fs

所以我真的很想知道这里发生了什么?切片操作调用了哪个函数?

类型检查器在此处查找切片的语法形式:https://github.com/dotnet/fsharp/blob/main/src/fsharp/CheckExpressions.fs#L6351

这最终导致发出对 GetStringSlice 的调用:https://github.com/dotnet/fsharp/blob/d5cc1167df4201b7cf9adf4b6b71e9494be556f4/src/fsharp/FSharp.Core/prim-types.fs#L6039

路径是类型检查器 --> fsharp.core 东西 --> 直到发射的调用链。

那么,为什么不只是 FSharp.Core 中 String 的类型扩展呢?不知道。这是很久以前做出的决定。有时编译器的这些路径会跳来跳去。