在模式匹配列表中键入推断

时间:2011-10-07 11:51:58

标签: f#

我一直试图创建一个能够执行以下操作的函数:

let p = [1, 2, 4, 2, 1]
let v = 8

然后我想查看a中的元素,直到找到所有元素(包括i)大于或等于{{1}的索引i }}。所以在这种情况下它应该返回4,因为1 + 2 + 4< 8和1 + 2 + 4 + 2> 8.所以有第4个元素,值2使总数超过8。

(某些背景:我想做monte carlo,我有一个概率列表,加起来为1.然后我传递一个0到1之间的随机数,让它选择一个可能的未来状态。简单的例子这里有整数)

到目前为止我所拥有的是:

v

但它在位let p = [1, 2, 4, 2, 1] let pick (v:int) (l:int list) = let rec sub (i:int) (acc:int) (l2:int list) = match l2 with | h::t -> if acc+h >= v then i else sub(i+1, acc+h, t) | _ -> failwith "total list didn't amount to " + v sub 0 0 l pick 8 p 上给出了以下错误:

sub(i+1, acc+h, t)

但是我没有传递函数error FS0001: This expression was expected to have type int but here has type int -> int list -> int 本身,我是调用它完成了参数和括号以及所有,所以为什么不返回int,结果为功能?

如何让它返回函数的结果?

提前致谢,

格特 - 扬

2 个答案:

答案 0 :(得分:2)

你给3-tuple (i+1,acc+h,t) curry函数应该是:

| h::t -> if acc+h >= v then i else sub (i+1) (acc+h) t

试试这个。

答案 1 :(得分:2)

首先,p将被理解为[(1, 2, 4, 2, 1);](int*int*int*int*int) list只有一个元素pint list [1; 2; 4; 2; 1]应为sub(i+1, acc+h, t)

其次,第6行中的sub (i+1) (acc+h) t应该以curry形式调用,而不是以元组形式调用。更正为{{1}}。