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

标签 string f# slice

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

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

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

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

路径是 typechecker --> fsharp.core stuff --> 直到发射的调用链。

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

关于string - F# 中的表达式 "some string".[3 .. 7] 调用了哪个函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69043351/

相关文章:

ios - 如何转义正则表达式字符串

f# - 具有重复元素的无限序列

f# - FSlex/FSyacc 崩溃 - 无法找到 FSharp.Core 程序集

python - a[] 和 a[ :] when assigning values? 有什么区别

python - 无法在 python 列表中追加元素

c# - 字符串以顺序开头

c++ - 将字符串存储为 char[] 并放置新的并将其取回

.net - 使用测量单位计算轨迹

python - 连接字符串的每两个字符

python - 切片我的数据框返回意外结果