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

How can I remove a sublist of a list in OCaml?

我要送出一副牌的前七张牌。卡片是字符串,玩家和牌组是字符串列表。

我需要执行以下功能:

我是 OCaml 的新手,我不会用循环或递归。

代码:

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

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

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

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

player = List.hd deck :: player

不会像命令式编程那样为变量player重新赋值。它比较 = 和 returns 左右两边的值一个布尔值,然后这个布尔值被 ; 丢弃。编译器警告说你做错了什么。第 4 行也是如此。您的函数只是 returns 原始 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' 绑定到其余元素。