2

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

3 回答 3

7

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

2) OCaml 中的类类型使用“结构”子类型,而不是 Java 风格的“名义”子类型。的推断类型arrayOfDogs将是“具有名为barktype的方法的对象unit -> unit(不一定是 a 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]
于 2009-02-02T05:08:22.360 回答
3

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

c3 :: arrayOfDogs;;

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

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

于 2009-02-02T00:23:37.413 回答
1

OCaml 报告的类型是arrayOfDogs什么?

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

于 2009-02-02T00:26:39.653 回答