如何删除 OCaml 列表的子列表?
How can I remove a sublist of a list in OCaml?
我要送出一副牌的前七张牌。卡片是字符串,玩家和牌组是字符串列表。
我需要执行以下功能:
将字符串列表(纸牌)的前七个字符串附加到另一个字符串列表(玩家)。
删除字符串列表(纸牌)的前七个字符串。
Return 有新牌的玩家和没有这些牌的牌组。
我是 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 原始 player
和 deck
不变。
您在这里的任务可以分为以下子任务:
- 一个函数
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'
绑定到其余元素。
我要送出一副牌的前七张牌。卡片是字符串,玩家和牌组是字符串列表。
我需要执行以下功能:
将字符串列表(纸牌)的前七个字符串附加到另一个字符串列表(玩家)。
删除字符串列表(纸牌)的前七个字符串。
Return 有新牌的玩家和没有这些牌的牌组。
我是 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 原始 player
和 deck
不变。
您在这里的任务可以分为以下子任务:
- 一个函数
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'
绑定到其余元素。