2016-05-07 4 views
-2

カードデッキの最初の7枚のカードをお届けします。カードはストリングであり、プレーヤーとデッキはストリングのリストです。OCamlでリストのサブリストを削除するにはどうしたらいいですか?

は私が機能を実行する必要があり、その:

  • は、文字列(プレイヤー)の別のリストに文字列のリスト(カードのデッキ)の最初の7つの文字列を追加します。

  • 文字列のリスト(カードのデッキ)の最初の7文字列を削除します。

  • 新しいカードとそれらのカードのないカードのデッキを持ってプレーヤーを返す。

私はOCamlで新しく、ループや再帰ではできません。

コード:

let sevencardsto player deck = 
    for i = 1 to 7 do 
    player = List. hd deck :: player ; 
    deck = List.tl deck ; 
    done ; 
    (player,deck) ;; 
+1

他の人にあなたの宿題をさせる前に、試行したコードを表示してください。 –

+0

はい@忘れてしまいました – Igna94

答えて

1

コード実際に(愚かなタイプミスの修正後)コンパイルされていますが、警告メッセージが表示されるはずです。

File "pepe.ml", line 3, characters 2-33: 
Warning 10: this expression should have type unit. 

ではないは、この警告を過小評価を行います。 MLは関数型言語であり、すべての変数は不変です。

player = List.hd deck :: player 

は、命令型プログラミングのような変数playerに新しい価値を再割り当てしません。 =の左辺と右辺の値を比較してブール値を返します。このブール値は;によって破棄されます。コンパイラは、あなたが何か間違っていることを心配して警告します。同じことが4行目で起こります。あなたの関数は元のplayerdeckをそのまま返します。

あなたの仕事はここに次のサブタスクを分離することができます。

  • 与えられた数の位置で二つにリストを分割機能split_at : 'a list -> int -> 'a list * 'a list、。この機能でデッキの最初の7枚と残りのカードを分けることができます。
  • 分割された7枚のカードをplayerに追加します。これは単に、@によってリストはappendを行われます

let ncardsto player deck n = let n_cards, rest = split_at deck n in (n_cards @ player, rest)

split_at機能を実装することは、再帰+リストの基本的な運動です。

ああ、あなたは再帰NORループを使用できませんか?私はちょうどあなたにヒントを与える...あなたの運動にはポイントを見ていない:

match xs with | x1::x2::xs' ->

このコードは、最初の2つの要素を取得し、xs'は残りの部分にバインドされています。

関連する問題