Fsharp:为函数传递N个参数

时间:2017-11-16 17:00:25

标签: f#

我试图创建一个接收可变数量参数的函数,但我似乎无法为F#找到任何可行的解决方案。

let expression = (fun a b -> a || b)
let expressionTriple = (fun a b c -> (a || b) && c)

// This doesn't work because expression can either be a function that takes fixed arguments
let truthTable numPredicates expression =
    if numPredicates = 2 then
        expression true true
    else
        expression true true false


truthTable 2 expression
truthTable 3 expressionTriple

如何将可变数量的参数传入表达式函数?

2 个答案:

答案 0 :(得分:3)

在F#中,具有不同签名(包括不同数量的参数)的函数被视为不同类型。每当你想要一个函数时,你需要使用一个可能是两种不同类型(或者甚至十二种不同类型)的参数,你需要使用discriminated unions。以下是如何以编译和执行您要执行的操作的方式编写代码:

type Expression<'a> =
    | Double of ('a -> 'a -> 'a)
    | Triple of ('a -> 'a -> 'a -> 'a)

let expression = fun a b -> a || b
let expressionTriple = fun a b c -> (a || b) && c

// This works because expression is a discriminated union
let truthTable expression =
    match expression with
    | Double f -> f true true
    | Triple f -> f true true false

truthTable (Double expression)
truthTable (Triple expressionTriple)

如果您想添加一个四参数版本,只需向该受歧视的联合添加Quad of ('a -> 'a -> 'a -> 'a -> 'a)个案,依此类推。

如果您对此有任何疑问,例如我使用通用类型'a而非bool编写此内容的原因,请随时提出后续问题。

答案 1 :(得分:2)

let expression = (fun [a; b] -> a || b)
let expressionTriple = (fun [a; b; c] -> (a || b) && c)

let truthTable numPredicates expression =
   if numPredicates = 2 then
      expression [true; true]
   else
      expression [true; true; false]


truthTable 2 expression 
truthTable 3 expressionTriple