我试图创建一个接收可变数量参数的函数,但我似乎无法为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
如何将可变数量的参数传入表达式函数?
答案 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