F# 将两个变量传递到管道中

F# 将两个变量传递到管道中,f#,F#,我一直在尝试F#*中的EULER,目前在#5上。我的问题是在一个管道操作中使用一个接受多个参数的函数 此函数正确返回第一个参数是否可被作为第二个参数的数组的每个成员整除: let isDivisibleBy seq n = seq |> Seq.forall (fun x -> n % x = 0) isDivisibleBy [|1 .. 10|] 2520 //true 但是,以下声明不起作用: Seq.initInfinite |> Seq.f

我一直在尝试F#*中的EULER,目前在#5上。我的问题是在一个管道操作中使用一个接受多个参数的函数

此函数正确返回第一个参数是否可被作为第二个参数的数组的每个成员整除:

let isDivisibleBy seq n =
    seq
    |> Seq.forall (fun x -> n % x = 0)

isDivisibleBy [|1 .. 10|] 2520 //true
但是,以下声明不起作用:

Seq.initInfinite
    |> Seq.find isDivisibleBy [|1 .. 10|]  
我得到以下错误:

错误FS0001:类型“((int->”c)->序列简短回答: 缺少括号和
Seq.initInfinite
的第一个参数。正确代码:

Seq.initInfininte id
|> Seq.find (isDivisibleBy [|1..10|])

解释 在表达式
Seq.find isDivisibleBy[|1..10 |]
中,您试图调用函数
Seq.find
,它有两个参数,
isDivisibleBy
[|1..10 |]
。然后,您试图使用结果值作为管道
(|>)
运算符的第二个参数。您的代码与此等效(只需将每次呼叫作为单独的步骤):

这显然是错误的

根据代码的其余部分,我推断您可能想做的是将函数
部分应用于参数
[|1..10 |]
,然后将结果值传递给
Seq.find
,如下所示:

let b = isDivisibleBy [|1 .. 10|]
let a = Seq.find b
Seq.initInfinite |> a
但这仍然无法编译,因为
Seq.initInfinite
接受一个参数—一个将索引映射到生成序列元素的函数—但您不提供任何参数:

let b = isDivisibleBy [|1 .. 10|]
let a = Seq.find b
let c = Seq.initInfinite (fun x -> x)
c |> a
从上述代码中删除中间
let
s,并用
id
替换冗余lambda
fun x->x
,我们得到最终答案:

Seq.initInfininte id
|> Seq.find (isDivisibleBy [|1..10|])

谢谢你,Fyodor。还有+1,因为你注意到了我在initInfinite中的错误。要找到最小的正数,你需要将
id
替换为
(+)1)
Seq.initInfininte id
|> Seq.find (isDivisibleBy [|1..10|])