将两个变量传递到管道中

时间:2016-03-28 20:31:00

标签: f#

我一直在F#*中尝试欧拉,目前我正在#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<"> c>) - > ' d'与' seq<' a>'

类型不兼容

*" 2520是可以除以1到10中的每个数字而没有任何余数的最小数字。什么是可以被1到20的所有数字整除的最小正数?"

1 个答案:

答案 0 :(得分:5)

简答:

您错过了Seq.initInfinite的括号和第一个参数。正确的代码:

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

解释

在表达式Seq.find isDivisibleBy [|1 .. 10|]中,您尝试使用两个参数Seq.findisDivisibleBy调用函数[|1 .. 10|]。然后,您尝试将结果值用作管道(|>)运算符的第二个参数。您的代码等同于此(只需将每个调用分开一步):

let a = Seq.find isDivisibleBy [|1 .. 10|]
Seq.initInfinite |> a

这显然是不正确的。

在其余代码中,我推断您可能想要做的是将函数isDivisibleBy部分应用于参数[|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并将冗余lambda fun x -> x替换为id,我们得到最终答案:

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