我一直试图创建一个能够执行以下操作的函数:
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,结果为功能?
如何让它返回函数的结果?
提前致谢,
格特 - 扬
答案 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
只有一个元素p
。 int list
[1; 2; 4; 2; 1]
应为sub(i+1, acc+h, t)
。
其次,第6行中的sub (i+1) (acc+h) t
应该以curry形式调用,而不是以元组形式调用。更正为{{1}}。