我想提供一副牌的前7张牌。卡片是一个字符串,播放器和卡片组是字符串列表。
我需要做一个功能:
将字符串列表(卡片组)的前七个字符串附加到另一个字符串(播放器)列表中。
删除字符串列表(卡片组)的前七个字符串。
使用新卡和没有这些卡的卡片返回播放器。
我是OCaml的新手,我不能用循环或递归来做。
代码:
let sevencardsto player deck =
for i = 1 to 7 do
player = List. hd deck :: player ;
deck = List.tl deck ;
done ;
(player,deck) ;;
答案 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行也是如此。您的函数只返回原始player
和deck
。
此处的任务可以分为以下子任务:
split_at : 'a list -> int -> 'a list * 'a list
,它在给定数字的位置将列表拆分为两个。您可以使用此功能分离卡组的前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'
与其余元素绑定。