F# 模式匹配列表中的类型推断
我一直在尝试创建一个可以执行以下操作的函数:F# 模式匹配列表中的类型推断,f#,F#,我一直在尝试创建一个可以执行以下操作的函数: let p = [1, 2, 4, 2, 1] let v = 8 然后我想检查a中的元素,直到我找到I的索引,其中所有元素(包括I都大于或等于v)。所以在这种情况下它应该返回4,因为1+2+48。所以第四个元素,值为2,将总数超过8 (一些背景:我想做monte carlo,我有一个概率列表,加起来等于1。然后我传递一个0到1之间的随机数,让它选择一个可能的未来状态。这里有一个简单的int示例) 到目前为止,我得到的是: let p = [1,
let p = [1, 2, 4, 2, 1]
let v = 8
然后我想检查a
中的元素,直到我找到I
的索引,其中所有元素(包括I
都大于或等于v
)。所以在这种情况下它应该返回4,因为1+2+4<8和1+2+4+2>8。所以第四个元素,值为2,将总数超过8
(一些背景:我想做monte carlo,我有一个概率列表,加起来等于1。然后我传递一个0到1之间的随机数,让它选择一个可能的未来状态。这里有一个简单的int示例)
到目前为止,我得到的是:
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)
上给出了以下错误:
但是我没有传递函数sub
本身,我用参数和方括号等来调用它,那么为什么它不返回函数的结果int呢
如何使其返回函数的结果
提前感谢,
Gert Jan您给出了3元组
(i+1,acc+h,t)
,其中支持的curried函数为:
| h::t -> if acc+h >= v then i else sub (i+1) (acc+h) t
试试这个。你给出了3元组
(i+1,acc+h,t)
,其中curried函数被支持为:
| h::t -> if acc+h >= v then i else sub (i+1) (acc+h) t
试试这个。首先,
p
将被理解为[(1,2,4,2,1);]
这是一个只有一个元素的(int*int*int*int*int)列表p
作为int列表
应该是[1;2;4;2;1]
第二,第6行中的sub(i+1,acc+h,t)
应该以curried形式调用,而不是元组形式调用。首先,将p
理解为[(1,2,4,2,1);]
这是一个只有一个元素的(int*int*int*int*int)列表p
作为int列表
应该是[1;2;4;2;1]
第二,第6行中的sub(i+1,acc+h,t)
应该以curried形式调用,而不是元组形式调用。更正是sub(i+1)(acc+h)t
嗨,谢谢,我补充说,用手,一直用逗号代替冒号。谢谢,我补充说,用手,一直用逗号代替冒号,玩了很多组合,除了那一个。谢谢,一直在玩很多组合,除了那一个。