f# - 如何以紧凑的方式避免意外的部分应用?

标签 f# currying partial-application

我有一个副作用函数,f : int -> string -> unit,我使用 f 1 "hi" 调用它。

如果函数更改为需要更多参数,为确保在调用站点中出现错误,我使用 () = f 1 "hi"|> ignore 调用该函数。如果函数被部分应用并且不会执行任何副作用,这将确保类型错误。

是否有更优雅的方法来避免意外的部分应用?

最佳答案

在最后添加一个“guard”参数:

let f a b c () = ...

并在调用点传递它:

f 42 "foo" 3.14 ()

如果你添加另一个参数,它的类型将不匹配 unit(除非你添加一个 unit 参数,但你为什么要这样做?),和编译器会在调用点提示。

额外的 unit 参数是表示仅具有副作用的函数的常用方法。

另一方面,对于纯函数,不需要这个技巧,因为您会对它们的返回值感兴趣,而意外的部分应用会改变它的类型,导致编译器报错。

关于f# - 如何以紧凑的方式避免意外的部分应用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59958523/

相关文章:

javascript - 为什么在Crockford的 `this`方法中使 `curry`无效?

Json 提供的类型生成不适用于 "with"

f# - 用Mono运行F#代码

parsing - 是否可以使用 fparsec 解析 "off-side"(基于缩进的)语言?

lambda - 方案中的 n 元函数

f# - 高阶函数和柯里化(Currying)函数之间的区别

haskell - 需要帮助理解类型(基于 curry)

f# - "a -> b -> (a -> b -> c) -> c"应用两个参数是标准函数概念吗?

arrays - 在 bool[,] 中获取 true 的计数 F#