如何删除OCaml中列表的子列表?

时间:2016-05-07 17:00:52

标签: ocaml

我想提供一副牌的前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 :(得分:1)

代码实际编译(在修复愚蠢的拼写错误之后),但你应该看到警告:

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

NOT 低估此警告。 ML是一种函数式语言,所有变量都是不可变的。

player = List.hd deck :: player

不会像命令式编程那样将新值重新分配给变量player。它比较=的左侧和右侧的值并返回一个布尔值,然后;丢弃此布尔值。编译器警告你担心你做错了什么。第4行也是如此。您的函数只返回原始playerdeck

此处的任务可以分为以下子任务:

  • 一个函数split_at : 'a list -> int -> 'a list * 'a list,它在给定数字的位置将列表拆分为两个。您可以使用此功能分离卡组的前7张卡片。
  • 将拆分的7张卡片附加到player。这可以通过@,list 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' ->

此代码获取前两个元素,xs'与其余元素绑定。