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

F#循环遍历函数列表,将每个函数依次应用于一个数字,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) functio

我最近开始学法语。我试图循环遍历函数列表,将每个函数应用于一个值。例如,我有:

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>]
val结果列表:(int->int)列表=[;;]
我想我并不完全相信使用map是正确的前进方向,所以我的问题是:

  • 为什么我没有一个数字列表
  • 如何返回数字列表
  • 是什么意思
  • 非常感谢你的帮助


    Daniel

    您的函数定义不太正确,它们使用了一个额外的(未使用的)参数,因此只是部分应用,没有按照预期进行计算。除此之外,你的想法是正确的

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

    因为我喜欢尽可能简化,你可以通过从函数中去掉乐趣来减少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]


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

    谢谢。这很有道理!我想我混淆了定义函数的两种不同方式。让平方x=x*x也起作用。干杯,丹尼尔