OCaml结构类型和列表

时间:2009-02-02 00:01:40

标签: oop list interface ocaml

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

另外,为什么杜宾犬(见下文)被允许列入吉娃娃名单?如何将另一个奇瓦瓦狗添加到列表中(如最后一行所尝试的那样)?

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 个答案:

答案 0 :(得分:7)

1)您可以在运行时使用cons运算符,它只返回一个新列表而不是改变输入列表。

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

# 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]

答案 1 :(得分:3)

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

c3 :: arrayOfDogs;;

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

就列表构造而言,鉴于OCaml是类型推断的,解释器可能会发现你正在构建一个狗列表,因为你在构造时添加了杜宾犬。因此,它不是吉娃娃的名单。

答案 2 :(得分:1)

OCaml报告的arrayOfDogs类型是什么?

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