在F#one-liner中附加列表

时间:2015-12-21 11:45:50

标签: list f#

我正在尝试为游戏实现一个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))

2 个答案:

答案 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函数也更常见。