首页 > 解决方案 > F# 中的表达式“some string”.[3 .. 7] 调用哪个函数?

问题描述

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

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

标签: stringf#slice

解决方案


类型检查器在此处查找切片的语法形式: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 --> 调用链直到发射。

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


推荐阅读