我一直在F#*中尝试欧拉,目前我已经在#5了.我的问题是使用一个在管道操作中需要多个参数的函数.
此函数正确返回第一个参数是否可被第二个参数的数组的每个成员整除:
let isDivisibleBy seq n =
seq
|> Seq.forall (fun x -> n % x = 0)
isDivisibleBy [|1 .. 10|] 2520 //true
Run Code Online (Sandbox Code Playgroud)
但是,以下声明不起作用:
Seq.initInfinite
|> Seq.find isDivisibleBy [|1 .. 10|]
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
错误FS0001:类型'((int - >'c) - > seq <'c>) - >'d'与'seq <'a>'类型不兼容
*"2520是可以除以1到10之间的每个数字的最小数字,没有任何余数.可以被1到20的所有数字整除的最小正数是多少?"
你错过了括号和第一个参数Seq.initInfinite.正确的代码:
Seq.initInfininte id
|> Seq.find (isDivisibleBy [|1..10|])
Run Code Online (Sandbox Code Playgroud)
在表达式中,Seq.find isDivisibleBy [|1 .. 10|]您尝试Seq.find使用两个参数调用函数,isDivisibleBy并且[|1 .. 10|].然后,您尝试将结果值用作管道(|>)运算符的第二个参数.您的代码等同于此(只需将每个调用分开):
let a = Seq.find isDivisibleBy [|1 .. 10|]
Seq.initInfinite |> a
Run Code Online (Sandbox Code Playgroud)
这显然是不正确的.
从你的其余代码中,我推断你可能想要做的是将函数部分应用于isDivisibleBy参数[|1 .. 10|],然后将结果值传递给Seq.find,如下所示:
let b = isDivisibleBy [|1 .. 10|]
let a = Seq.find b
Seq.initInfinite |> a
Run Code Online (Sandbox Code Playgroud)
但这仍然无法编译,因为Seq.initInfinite需要一个参数 - 一个函数映射索引到生成序列的元素, - 但是你没有提供参数:
let b = isDivisibleBy [|1 .. 10|]
let a = Seq.find b
let c = Seq.initInfinite (fun x -> x)
c |> a
Run Code Online (Sandbox Code Playgroud)
取出中间let从上面的代码S和更换冗余拉姆达fun x -> x用id,我们得到最后的答案:
Seq.initInfininte id
|> Seq.find (isDivisibleBy [|1..10|])
Run Code Online (Sandbox Code Playgroud)