2017-09-24 65 views
3

为什么说数组和字符串索引使用稍有不同的语法?语法字符串VS数组索引

例如

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

我(和其他人)发现这是既奇怪又混乱。

回答

5

对于完全相同的原因,ocaml的使用+为整数加法和+.浮法加法:OCaml的foregoes特设多态/函数重载和索引运营商目前认为是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) 

注意,有没有保证,这种hackish的代码将在今后的工作。如果要定义自己的索引操作符,就可以开始OCaml的≥4.06由点.和左支架(无论是([{)之间插入至少一个(运营商)字符定义扩展索引操作。

let (.?()) dict key = Dict.find_opt dict key 

如果你,不知何故,希望少索引的运营商,有一个命题,使索引数组类数据类型原始的操作,而不是一个函数调用。这将允许使用类型定向消除歧义,就像它已经为记录字段所做的那样。这意味着两者都是可能的,因为类型检查器将使用类型信息来解析应该使用哪种基本操作。

但是,此提案仍在进行中(请参阅https://github.com/ocaml/ocaml/pull/616),因此目前需要通过语法区分字符串和通用数组索引。