OCaml结构类型和列表

Mat*_*lly 2 oop ocaml interface list

我在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;;
Run Code Online (Sandbox Code Playgroud)

Chr*_*way 7

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

2)OCaml中的类类型使用"结构"子类型,而不是Java风格的"名义"子类型.推断类型arrayOfDogs将是"具有bark类型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>]
Run Code Online (Sandbox Code Playgroud)

3)问题arrayOfDogs :: c3是你有错误的方法.类型::'a -> 'a list -> 'a list.要c3在开头添加,请使用

c3 :: arrayOfDogs
Run Code Online (Sandbox Code Playgroud)

要在最后添加它,请使用"append"运算符 @

arrayOfDogs @ [c3]
Run Code Online (Sandbox Code Playgroud)