2016-04-13 11 views
0

に文字列を解釈する私はリストコードocamlの

let myList = ["Animals"; "Cat"; "Tiddles"; "Dog"; "Rover"] 

を持っていると私は、このデータを読み込み、そのようなオブジェクトを返す関数を作成しようとしています:

Animals([Cat("Tiddles"); Dog("Rover")]) 

これまでのところ、私はこのようなものを持っている:

になり
let rec readList = function 
    | hd :: tl -> readString hd tl 
and readString hd tl = 
    match hd with 
    | "Animals" -> Animals([readList tl]) 
    | "Cat" -> Cat("...") 
    | "Dog" -> Dog("...");; 

私が知っている必要があり何

Animals([Cat("...")]) 

は私が猫オブジェクトにリスト内の次の項目に合格した後、犬は次の

追加することができるので、それが見えるかもしれませんセミコロンを追加し、readListのTLを呼び出すことができる方法ですxは、リスト内の次の項目(「Tiddles」)で、TLは、リストの残りの部分(「犬」、「ローバー」)を含んでいる。この

| "Cat" -> Cat(x); readList tl 

のようなもの。しかし、セミコロンでは、readList tlだけが返されるので、そのようには動作しません。

基本的に、リスト内のデータを使用してAnimalsリストにオブジェクトを再帰的に追加できるようにします。

答えて

1

私はあなたの機能の種類を慎重に考えて始めたいと思います。この式では、より詳細な観測として

、:Animals(...)内部

Animals([readList tl]) 

リストは、常にそれに正確に一つの要素を持つことになります。 readList tlによって返される値は、リストの1つの要素になります。

それはあなたがこのような何かをコーディングしたい可能性が高いです。

Animals(readlist tl) 

をしかし、これはそれがリストではありませんので、readlistが、結果としてAnimals(...)を返すことができないことを意味します。

これは、おそらく、あなたは物事の種類を考えて始めなければならないと言います。一連の機能を再編成する必要があるかもしれません。

セミコロンはリストに要素を追加するものだと考えていますが、これはOCamlリストを考えるのに特に良い方法ではありません。リストを作成するOCaml演算子は::です。これは、左に単一の要素を、右にリストを取り、最初に新しい要素を含むリストを返します。