2017-03-21 6 views
1

のリスト内のすべての数:OCamlのトリプルだから私はここで、整数</p> <p>のリストになりますトリプルすべての数は、私がこれまで持っているものである機能記述する必要が整数

let number = [1; 2; 3; 4];; 

let rec print_list_int myList = match myList with 
| [] -> print_endline "This is the end of the int list!" 
| head::body -> 
begin 
print_int head * 3; 
print_endline ""; 
print_list_int body *3 
end 
;; 

print_list_int number;; 

それはdoesnのを私が間違って行ったアイデアは何か役に立つと思われる?出力が必要ですが、それもしません。前もって感謝します!関数呼び出し(アプリケーション)が高い優先順位を有するので

(print_int head) * 3 

::)

答えて

4

次の式:

print_int head * 3 

は、このように解釈されます。あなたはこのように括弧する必要があります。

print_int (head * 3) 

以下同様のケースは別の問題である:(print_list_int body) * 3は意味がありませんが、print_list_int (body * 3)も意味がありません。リストを3倍にすることはできません。しかし、この呼び出しでは、乗算する必要はありません。 print_list_int関数は(再帰的に)乗算を行います。

更新

私は上記で示唆した変更を加えた場合、私はOCamlのトップレベルでこれを参照してください。最もエレガントな方法は、あなたがしようとしているものを達成すること

val print_list_int : int list -> unit = <fun> 
# print_list_int number;; 
3 
6 
9 
12 
This is the end of the int list! 
- : unit =() 
# 
+0

ああ、右!私は今どこが間違っているのか分かります!私は入力をhttps://try.ocamlpro.com/に入力しようとしましたが、Enterを押したときと同じように改行を書きました。 (あなたの編集で)最終結果は...: - unit =().... 3倍の数字でリストを印刷していないことは分かっていますか? – Imdad

+0

let()= List.iter(printf "%d")number ...各要素が3倍になった後にリストを印刷しない理由は何ですか? – Imdad

+0

OCamlのトップレベルで私のために印刷します(私が修正したとき)。あなたの関数の結果は本当に()(単位)です。 –

1

は注意doはList.iterを使用することです。 Listの各要素に所定の関数(unitを返す)を適用します。

let print_triples = List.iter (fun x -> 
    print_endline (string_of_int (3*x)) 
);; 

val print_triples : int list -> unit = <fun> 

そして、ここに行く:

# print_triples [1;2;3;4;5];; 

3 
6 
9 
12 
15 
- : unit =()