我正在尝试为游戏实现一个RLE解码器,它可以工作,但我想缩小代码,但我无法弄清楚如何放置List.append
和{ {1}}和repeat
拨打一行
List.append的签名是rleExpand
,所以显然我不能这样做
List.append : 'T list -> 'T list -> 'T list
- 但想知道如何做到这一点。我也可以使用@运算符 - 也许这是最可读的。但是,如果我的列表是由下面列表中的函数应用程序创建的,那么如何使用List.append?
List.append(repeat(pattern,count), rleExpand(tail,rleTag))
答案 0 :(得分:4)
我可能会写:
repeat(pattern,count) @ rleExpand(tail,rleTag)
但你也可以写
List.append (repeat(pattern,count)) (rleExpand(tail,rleTag))
您不能像最初建议的那样使用List.append(repeat(pattern,count), rleExpand(tail,rleTag))
,因为List.append
采用了咖喱(而不是tupled)参数。
答案 1 :(得分:1)
这样的事情有用吗?
let repeat(item, count) = [for i in 1 .. count -> item]
let rec rleExpand(packed, rleTag: int) =
match packed with
| [] -> []
| tag :: count :: pattern :: tail when tag = rleTag ->
List.collect id [repeat(pattern,count); rleExpand(tail,rleTag)]
| head :: tail -> head :: rleExpand(tail,rleTag)
通过不使用元组作为参数来使用make函数也更常见。