2015-08-21 22 views
2

有F#内置运算符/函数,它允许解压参数列表/元组并将其传递给函数调用?F# - 图示/解包参数列表

用法示例:

// simple add function 
let add (a1 : int) (a2 : int) (a3 : int) = a1 + a2 + a3 

// what I want to achieve 
let result = add (missing_operator)[1; 2; 3] 

// or 
let result' = add (missing_operator) (1, 2, 3) 

// flattening list 
let a = [1; 2; 3] 
let b = [(missing_operator) a; 4; 5] 

类同Python的*操作

def add(a1, a2, a3): 
    return a1 + a2 + a3 

add(*[1,2,3]) 

或应用(FUNC_NAME,args_list)功能

apply(add, [1, 2, 3]) 
+0

可能相关:http://stackoverflow.com/q/30622850/126014 –

回答

3

我想的惯用方法可以做到这样一个在F#可能是这样的:

// simple add function 
    let add (a1 : int) (a2 : int) (a3 : int) = a1 + a2 + a3 

    // what I want to achieve 
    let result = match [1; 2; 3] with | [a;b;c] -> add a b c // pattern matching works on lists 

    // or 
    let result' = let (a,b,c) = (1, 2, 3) in add a b c // unpacking tuples 

    // flattening list 
    let a = [1; 2; 3] 
    let b =       // sequence expressions with yield! 
    seq { 
     yield! a 
     yield 4 
     yield 5 
     } |> Seq.toList 

    let c = [4; 5] 
    let b' = 
    seq { 
     yield! a 
     yield! c 
     } |> Seq.toList 
6

对于对与黑社会有预定义的运营商||><|||||><|||类似于|><|单个参数(monuple):

let add a b c = a + b + c 

add <||| (1, 2, 3) 
(1, 2, 3) |||> add 

您可以添加这样的运营商自己:

let (||||>) (a1, a2, a3, a4) func = func a1 a2 a3 a4 

let foo u v x y = (u + v) * (x + y) 
(1, 2, 3, 4) ||||> foo 

所有这些操作符也适用于非统一类型。

如果你不想放弃类型安全,下面的作品(非空参数):

let invokeWith args op = 
    let func = op.GetType().GetMethod("Invoke", args |> Array.map(fun a -> a.GetType())) 
    func.Invoke(op, args) 

add |> invokeWith [|1; 2; 3|] 

这也适用于非均匀参数类型:

let pad (a : string) l = a.PadRight(l) 
pad |> invokeWith [| "a"; 12 |] 

中当然,一旦你放弃静态类型检查,你对你自己:

// does not compile 
// ("a", None) ||> pad 
+0

如果函数采用不同类型的参数会怎样?例如:'let pad(a:string)l = a.PadRight(l)' – lad2025

+0

@ lad2025参见编辑答案 – CaringDev