2009-02-02 78 views
2

我在OCaml中遇到了列表问题。我读过冲突的陈述,说明列表是否可以在运行时修改。 cons运算符可以在运行时使用吗?OCaml结构类型和列表

此外,为什么杜宾犬(见下文)允许在吉娃娃列表中?一个人如何将另一个奇瓦瓦州加入名单(如最后一行所示)?

class virtual dog = 
object 
method virtual bark : unit 
end;; 

class chihuahua = 
object 
inherit dog 
method bark = Printf.printf "Yip!" 

end;; 

class doberman = 
object 
inherit dog 
method bark = Printf.printf "Roar!" 

end;; 

let c1 = new chihuahua;; 
let c2 = new chihuahua;; 
let c3 = new chihuahua;; 
let d1 = new doberman;; 

let arrayOfDogs = [c1;c2;d1];; 
arrayOfDogs :: c3;; 

回答

3

您需要在右侧列出您的列表,而不是在左侧。即:

c3 :: arrayOfDogs;; 

这就是最后一行失败的原因。

就列表结构而言,鉴于OCaml是类型推断的,解释者可能会发现,由于您在施工时添加了doberman,您正在构建一个狗列表。因此它不是吉娃娃的名单。

1

OCaml作为arrayOfDogs的类型报告什么?

也许你的意思是:c3 :: arrayOfDogs;;

7

1)您可以在运行时使用的利弊运营商,它只是返回一个新的列表,而不是突变的输入列表。

2)OCaml中的类类型使用“结构”子类型,而不是Java风格的“名义”子类型。 arrayOfDogs的推断类型将是“类型为unit -> unit(不一定是dog)”bark方法的对象“。例如:

# class cat = object 
    method bark = print_endline "meow" 
    end ;; 
class cat : object method bark : unit end 
# let c = new cat ;; 
val c : cat = <obj> 
# c :: arrayOfDogs ;; 
- : cat list = [<obj>; <obj>; <obj>; <obj>] 

3)arrayOfDogs :: c3问题是你有它周围的错误的方式。 ::的类型是'a -> 'a list -> 'a list。要在开始添加c3,使用

c3 :: arrayOfDogs 

要在末尾添加它,使用“添加”操作@

arrayOfDogs @ [c3]