Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F# 模式匹配列表中的类型推断_F# - Fatal编程技术网

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

嗨,谢谢,我补充说,用手,一直用逗号代替冒号。谢谢,我补充说,用手,一直用逗号代替冒号,玩了很多组合,除了那一个。谢谢,一直在玩很多组合,除了那一个。