gpt4 book ai didi

f# - 在部分应用上使用序列

转载 作者:行者123 更新时间:2023-12-01 04:40:49 31 4
gpt4 key购买 nike

我有一个值序列,我想部分应用于函数:

let f a b c d e= a+b+c+d+e

let items = [1,2,3,4,5]

let result = applyPartially f items

Assert.Equal(15, result)

我正在处理 applyPartially 函数。我试过写这样的递归函数:

let rec applyPartially f items =
| [] -> f
| [x] -> f x
| head :: tail -> applyPartially (f head) tail

我遇到的问题是f类型在我的迭代开始时是'a->'b->'c->'d->'e,对于每个循环它都应该消耗一个订单。

'a->'b->'c->'d->'e 
'b->'c->'d->'e
'c->'d->'e
'd->'e

这意味着我能想到的较低的接口(interface)将是'd->'e。如何隐藏函数的复杂性,以便递归函数中只显示 'd->'e?

最佳答案

F# 类型系统没有以您建议的方式处理普通函数的好方法 - 为此,您需要确保列表的长度与函数的参数数量相匹配,这对于普通的列表和函数是不可能的。

但是,您可以使用有区别的联合很好地对此进行建模。你可以定义一个偏函数,它要么已经完成,要么需要一个额外的输入:

type PartialFunction<'T, 'R> = 
| Completed of 'R
| NeedsMore of ('T -> PartialFunction<'T, 'R>)

你的函数f现在可以写成(语法有点丑)PartialFunction<int, int>不断接受 5 个输入,然后返回结果:

let f = 
NeedsMore(fun a -> NeedsMore(fun b ->
NeedsMore(fun c -> NeedsMore(fun d ->
NeedsMore(fun e -> Completed(a+b+c+d+e))))))

现在您可以实现 applyPartially通过解构参数列表并将它们一一应用到偏函数,直到得到结果:

let rec applyPartially f items =
match f, items with
| Completed r, _ -> r
| NeedsMore f, head::tail -> applyPartially (f head) tail
| NeedsMore _, _ -> failwith "Insufficient number of arguments"

以下现在按预期返回 15:

applyPartially f [1;2;3;4;5]

关于f# - 在部分应用上使用序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41489611/

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