2009-02-02 76 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]