刚刚发现使用 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/