string - 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
所以我真的很想知道这里会发生什么?切片操作调用哪个函数?
解决方案
类型检查器在此处查找切片的语法形式: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 --> 调用链直到发射。
那么,为什么不只是String
FSharp.Core 中的类型扩展呢?不知道。这是很久以前做出的决定。有时编译器的这些路径会跳动一点。
推荐阅读
- javascript - 请问有人可以批评这张邮票卡密码笔吗?
- javascript - 如何通过纯 JavaScript 自动调整博客图片大小?
- google-sheets - 从最小值获取列标题,不包括零
- powershell - 如何从来自文件的多个开始时间和结束时间获取时差?
- c++ - 编译 opencv4 基本程序时出现链接错误?
- javascript - 我是正确地链接 Promise 还是犯了罪?
- python - 使用 Python 填充相同品牌代码的缺失字符串值
- bixby - Bixby:登录工具
- jboss7.x - 在 openshift 中从 jboss cli 将 web-context 从 /auth 修改为 /ddu-auth 时出错
- rest - Delphi Rest Client 组件有什么问题