F# 循环访问函数列表,将每个函数依次应用于一个数字



我最近开始学习F#。我正在尝试遍历函数列表,将每个函数应用于一个值。例如,我有:

let identity x = fun x -> x
let square x = fun x -> x * x
let cube x = fun x -> x * x * x
let functions = [identity; square; cube]

我现在想做如下事情:

let resultList = List.map(fun elem -> elem 3) functions

其中结果值将是列表 [3;9;27]。然而,事实并非如此。相反,我得到:

val resultList : (int -> int) list = [<fun:Invoke@3000>; <fun:Invoke@3000>; <fun:Invoke@3000>]

我想我不再完全相信使用地图是正确的前进方式,所以我的问题是:

  1. 为什么我没有得到数字列表?
  2. 如何返回数字列表?
  3. <fun:Invoke>是什么意思?

非常感谢您的帮助。

丹尼尔

您的函数定义不正确,它们正在接受额外的(未使用的)参数,因此只是部分应用,而不是按预期进行计算。除此之外,你的想法是正确的;

let identity2 = fun x -> x
let square2 = fun x -> x * x
let cube2 = fun x -> x * x * x
let functions = [identity2; square2; cube2]
let resultList = List.map(fun elem -> elem 3) functions;;
> val resultList : int list = [3; 9; 27]

虽然我不是 F# 专家,但在这种情况下,<fun:Invoke>似乎表明该值是一个(部分应用的)函数。

因为我喜欢尽可能简化,所以您可以通过删除函数中的乐趣来减少 Joachim 的答案:

let identity x = x
let square x = x * x
let cube x = x * x * x        
let functions = [identity; square; cube]
printfn "%A" (List.map(fun elem -> elem 3) functions)

提供输出[3; 9; 27]

对我来说,这更自然。我不明白为什么函数本身需要包装函数,而不是简单地成为函数。

最新更新