首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >传递函数的N个参数

传递函数的N个参数
EN

Stack Overflow用户
提问于 2017-11-16 17:00:24
回答 2查看 787关注 0票数 4

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

代码语言:javascript
复制
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

如何将可变数量的参数传递到表达式函数中?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-11-16 18:27:55

在F#中,具有不同签名(包括不同数量的参数)的函数被认为是不同的类型。而且,当您想让一个函数接受一个参数时,它可能是两种不同的类型(甚至是十几种不同的类型),您需要使用受歧视的工会。下面是如何以编译和执行您想要做的事情来编写代码的方法:

代码语言:javascript
复制
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来编写这篇文章,请随时询问后续问题。

票数 4
EN

Stack Overflow用户

发布于 2017-11-17 17:32:59

代码语言:javascript
复制
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 
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47335279

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档