gpt4 book ai didi

f# - fsharp : Passing N Parameters for a function

转载 作者:行者123 更新时间:2023-12-05 01:14:02 25 4
gpt4 key购买 nike

我正在尝试创建一个接受可变数量参数的函数,但我似乎无法为 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

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

最佳答案

在 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 ,请随时提出后续问题。

关于f# - fsharp : Passing N Parameters for a function,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47335279/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com