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名前のメソッドを持つオブジェクト(必ずしも a である必要はありません)」になります。例えば:barkunit -> unitdog

# 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 listc3先頭に追加するには、使用します

c3 :: arrayOfDogs

最後に追加するには、「append」演算子を使用します@

arrayOfDogs @ [c3]
于 2009-02-02T05:08:22.360 に答える
3

左側ではなく右側にリストを配置する必要があります。すなわち:

c3 :: arrayOfDogs;;

これが、最後の行が失敗する理由です。

リストの構築に関する限り、OCaml が型推論されることを考えると、インタープリターはおそらく、構築時にドーベルマンを追加したことから、あなたが犬のリストを構築していることを理解したでしょう。したがって、チワワのリストではありません。

于 2009-02-02T00:23:37.413 に答える
1

OCaml は の型として何を報告しarrayOfDogsますか?

おそらくあなたは次のことを意味します:c3 :: arrayOfDogs;;

于 2009-02-02T00:26:39.653 に答える