我在使用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;;
答案 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;;