f# - 函数签名

标签 f#

我想创建一个函数 map3,给定一个函数 f 和一个元组 (a, b, c) 应用 f 到元组的每个成员。该函数的预期签名应为:

('a -> 'b) -> 'a * 'a * 'a -> 'b * 'b * 'b

我尝试了几种方法:

> let map3 = fun x -> let f = fun (a, b, c) -> (a, b, c) in f x;;
val map3 : 'a * 'b * 'c -> 'a * 'b * 'c

> let map3 = fun x y -> x (let f = fun (a, b, c) -> (a, b, c) in f y);;
val map3 : x:('a * 'b * 'c -> 'd) -> 'a * 'b * 'c -> 'd

> let map3 = fun (x, y, z) -> let f = fun (a, b, c) -> (a, b, c) in f (x, y, z);; 
val map3 : x:'a * y:'b * z:'c -> 'a * 'b * 'c

我强烈怀疑我没有了解函数签名的实际工作原理。根据what I get , map3 应该有一个输入和一个输出,而 f 应该将一个三元组作为输入并返回一个三元组。但它显然在某些方面是错误的。在我尝试实现它的过程中,我错过了什么?

最佳答案

let map3 f (x, y, z) = (f x, f y, f z)

你也可以这样写

let map3 f = fun (x, y, z) -> (f x, f y, f z)

let map3 = fun f (x, y, z) -> (f x, f y, f z)

但我更愿意将参数放在左侧。如您所见,第一个版本编写起来更短且更易于阅读。

关于f# - 函数签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46603268/

相关文章:

f# - 字符串不兼容

.net - F# 编译器是单程编译器吗?

c# - 如何让 ToDictionary 在 F# 中工作?

F#重构工具

f# - 如何使用 Websharper 创建 slider ?

visual-studio-2012 - 未定义命名空间 "TypeProviders"(打开 Microsoft.FSharp.Data.TypeProviders)

events - F# 中的 Control.Observable 和 Control.Event 模块之间有什么相似之处/不同之处?

f# - 功能等同于带变量比较的 if 表达式

.NET 优化埃拉托色尼 F# 筛法

f# - 是否有将一系列管道转换为功能组合的分步过程?