F#循环遍历函数列表,依次将每个函数应用于数字

时间:2013-12-29 16:48:16

标签: 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>是什么意思?
  4. 非常感谢你的帮助。

    丹尼尔

2 个答案:

答案 0 :(得分:5)

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

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>在这种情况下似乎表明该值是(部分应用的)函数。

答案 1 :(得分:0)

因为我想简化我可以做的事情,所以可以通过消除功能中的乐趣来减少Joachim的回答:

[3; 9; 27]

给出输出{{1}}

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