【问题标题】:Calling partially applied functions from C#从 C# 调用部分应用的函数
【发布时间】:2015-05-22 01:09:01
【问题描述】:

我有一个需要很多参数的通用函数

f : a -> b -> c -> d -> e -> f

我想提供专门的函数,只接受最后两个参数,但为前三个提供一些固定值。

g : d -> e -> f
h : d -> e -> f

它们的实现如下所示

g = f someA someB someC
h = f someA' someB' someC'

当然,这一切都很好,但是当从 C# 调用这些函数时,这是一个问题,因为它们的类型没有得到“美化”。相反,我得到了一堆嵌套的FSharpFuncs。 我可以通过定义我的函数来避免这个问题,比如

g d e = f someA someB someC d e
h d e = f someA' someB' someC' d e 

但这似乎是一个非常简单的机械转换,所以我想知道是否有一种自动化的方法可以获得相同的结果。也许我可以附加一些属性?

【问题讨论】:

标签: f# interop currying


【解决方案1】:

从技术上讲,如何编写gh 的第一个和第二个选项并不完全相同。在第一种情况下,f 应用于三个参数,生成的新函数作为对象存储在值 g 中。

而在第二种情况下,函数 f 每次都使用所有 5 个参数调用,并且在调用 g 时传递了 someAsomeBsomeC 的值。

在大多数情况下,这种区别并不真正相关,但当您想要缓存计算的某些部分时,它变得很重要。

长话短说:转换有轻微的语义差异,因此不能真正自动完成。只需将参数添加到新的gh

【讨论】:

  • 我意识到它没有自动完成是有正当理由的,但我不明白为什么我们不能有一个属性可以添加到函数中以明确声明我们想要这个转换完成。
  • 因为F#编译器开发者没有无限能力?
  • 好吧,你也许可以创建一个属性,但有什么意义呢?只需添加参数就足够短和简单了。
  • @DanielFabian 因为添加属性是一种解决方案。添加参数是一种解决方法。
猜你喜欢
  • 1970-01-01
  • 2013-12-29
  • 1970-01-01
  • 2015-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-02
相关资源
最近更新 更多