2016-10-17 17 views
0

私はOCamlの初心者です。私はハノイの塔についてこのコードを書いた。タイプintを 'タイプ'に変更するにはどうすればよいですか? OCaml(タワーズオブハノイ)

let rec hanoi (a,b,c) n = 
    if n <> 0 then begin 
     hanoi (a,c,b) (pred n); 
     Printf.printf "%i %i\n" a b; 
     hanoi (c,b,a) (pred n) 
    end;; 

私はa = origin towerとb = destination towerを印刷します。

私はこれを行うにしたいと思います:

hanoi : 'a * 'a * 'a ­> int ­> ('a * 'a) list 

私はタイプ」にint型を変更するにはどうすればよいですか?タイプを書く方法はありますか? List.appendを使用して( 'リスト)を追加する必要がありますか?

ありがとうございました。

答えて

1

はあなたが本当に

let rec hanoi_list n (d,a,i) = match n with |0 -> [] |1 -> [ (d, a) ] |_ -> hanoi_list (n-1) (d,i,a) @ hanoi_list 1 (d,a,i) @ hanoi_list (n-1) (i,a,d);;

は、あなたがそれを理解することを願っています:)たい機能ですヴァルhanoi_listます。int - > '*' *「 - > ( 'a *' a)list =
+0

:ここ –

+0

「d」、「a」、「i」の意味は何ですか?第三の塔に移動し、第二の塔に移動したくない場合はどうしたらよいですか? –

+0

d =出発、a =到着、c =中間。 1,2,3を使用してタワーを表している場合、最初のタワーからすべてを3番に移動すると、hanoi_list 3(1,3,2)が得られます。関数を呼び出すときにパラメーターを変更するだけです。 –

2

intがタイプnになっている理由は、式n <> 0pred nのためです。どちらもnintである必要があります。 nをすべての型にするには、これらの2つの式の多型置換が必要です。 1つの可能性は、完了をテストする関数と、何らかの方法で値を減少させる関数を渡すことです。

あなたがabのタイプについてintを取得している理由、およびcはint型であることを必要とします表現Printf.printf "%i %i\n" a b、です。ここでも、値を出力する関数を渡すことができます。

これで、さまざまなタイプのこれらの関数を書くのに問題があります。

また、移動のリストを印刷するのではなく、返すとします。これは別の問題です。短い答えは、関数の別のパラメータとして累積リストを渡し、最後に返すことができるということです。

1

私が正しくあなたを理解している場合、あなたの問題はあなたの関数の推論された型が

あなたはそれがペグの種類があるように制約され

('a * 'a * 'a) -> int -> ('a * 'a) list 

になりたい

(int * int * int) -> int -> unit 

であるということですintは印刷されているためはaintの場合にのみ定義されます。戻り値の型はunitです。これは、関数がタワーを生成せず、出力するだけなのでです。 P型指定された

関連する問題