【问题标题】:Function signatures函数签名
【发布时间】:2017-10-06 10:06:13
【问题描述】:

我想创建一个函数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 getmap3 应该有一个输入和一个输出,f 应该将一个三元组作为输入并返回一个三元组。但这显然是错误的。在我尝试实施它的过程中,我错过了什么?

【问题讨论】:

  • 这里有一个提示——从let map3 f = 开始。此外,人们不再倾向于使用in 语法
  • 我正在努力!我没有想到这样的方法。您对in 的使用也是正确的。我们课程中提出的书已经过时了。我正在学习这两种风格,只是为了让学习更容易。
  • F#的书很多,比如fsharpforfunandprofit.com/posts/fsharp-in-60-seconds就可以了。
  • 我同意。我通常与Functional programming with F# 集成。我喜欢整本书的方法。它只是缺少一些带有解决方案的练习。

标签: f#


【解决方案1】:
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)

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

【讨论】:

  • 您不需要等号右上方的括号。当然,使用它们并没有错。另一方面,在所有三种情况下,参数元组都必须在括号内。只是我的 0.02 美元。
  • 是的,当然。我留下它们是为了让读者清楚它是一个元组,但在某些情况下它们是可选的。
  • 感谢您的直截了当的回答。它实际上对我的帮助甚至超出了我的要求!
猜你喜欢
  • 2021-05-02
  • 2018-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多