gpt4 book ai didi

arrays - 字符串与数组索引的语法

转载 作者:行者123 更新时间:2023-12-04 23:14:40 26 4
gpt4 key购买 nike

为什么数组和字符串索引使用微妙不同的语法?

例如。

let _: int  = [|1;2;3|].(0)
let _: char = "123".[0]

我(和其他人)发现这既奇怪又令人困惑。

最佳答案

出于与 Ocaml 使用 + 完全相同的原因用于整数加法和 +.对于浮点加法:OCaml 放弃了临时多态性/函数重载和索引运算符目前被认为是 OCaml 中的一种函数形式,因此受到与函数相同的限制。

更准确地说,索引运算符目前是一种非常浅的语法糖:解析器重写 x.(n)Array.get x nx.(n) <- yArray.set x n y (或 Array.unsafe_getArray.unsafe_set 如果使用 -unsafe 选项编译)。相似地,s.[n]被改写为 String.get s ns.[n]<-x变成 String.set s n x .

这意味着可以通过定义一个新的 Array 来定义您自己的索引运算符。模块。例如,以下不明智的
技巧将使数组索引从 1 开始:

 module Array = struct
include Array
let get a n = get a (n-1)
let unsafe_get a n
end
;; [|1|].(1)

请注意,不能保证这种骇人听闻的代码将来会起作用。如果要定义自己的索引运算符,可以从 OCaml ≥ 4.06 开始,通过在点 . 之间插入至少一个(运算符)字符来定义扩展索引运算符。和左括号( ([{)。
let (.?()) dict key = Dict.find_opt dict key 

如果您以某种方式希望使用更少的索引运算符,那么有一个建议是将类似数组的数据类型的索引作为基本操作而不是函数调用。这将允许使用类型导向的消歧,就像它已经为记录字段所做的那样。这意味着两者
 let first (s:string) = s.(0)
let first (a: _ array) = a.(0)

这是可能的,因为类型检查器将使用类型信息来解决应该使用哪个原始操作。

然而,该提议仍在进行中(参见 https://github.com/ocaml/ocaml/pull/616),因此目前需要通过语法区分字符串索引和泛型数组索引。

关于arrays - 字符串与数组索引的语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46394245/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com