为什么说数组和字符串索引使用稍有不同的语法?语法字符串VS数组索引
例如
let _: int = [|1;2;3|].(0)
let _: char = "123".[0]
我(和其他人)发现这是既奇怪又混乱。
为什么说数组和字符串索引使用稍有不同的语法?语法字符串VS数组索引
例如
let _: int = [|1;2;3|].(0)
let _: char = "123".[0]
我(和其他人)发现这是既奇怪又混乱。
对于完全相同的原因,ocaml的使用+
为整数加法和+.
浮法加法:OCaml的foregoes特设多态/函数重载和索引运营商目前认为是OCaml中的功能的形式并因此受到与功能相同的限制。
更准确地说,索引运营商目前正在一个很浅的语法糖:解析器重写x.(n)
到Array.get x n
和x.(n) <- y
到Array.set x n y
(或Array.unsafe_get
和Array.unsafe_set
如果与-unsafe
选项编译)。同样, s.[n]
改写为String.get s n
和s.[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)
注意,有没有保证,这种hackish的代码将在今后的工作。如果要定义自己的索引操作符,就可以开始OCaml的≥4.06由点.
和左支架(无论是(
,[
,{
)之间插入至少一个(运营商)字符定义扩展索引操作。
let (.?()) dict key = Dict.find_opt dict key
如果你,不知何故,希望少索引的运营商,有一个命题,使索引数组类数据类型原始的操作,而不是一个函数调用。这将允许使用类型定向消除歧义,就像它已经为记录字段所做的那样。这意味着两者都是可能的,因为类型检查器将使用类型信息来解析应该使用哪种基本操作。
但是,此提案仍在进行中(请参阅https://github.com/ocaml/ocaml/pull/616),因此目前需要通过语法区分字符串和通用数组索引。