【问题标题】:F# Curried add20 functionF# Curried add20 函数
【发布时间】:2015-04-23 11:20:57
【问题描述】:

如果有人能指出我为什么这样做的方向,将不胜感激。

这是我在课堂上的第一个 f# 实验室。

当我没有设置参数时,add20 是如何工作的(问题 2C2)。

////function that adds 10 to it

////Problem 2C1 ///
let k = 10
let add10 z k = z + k

////End Problem 2C1///    
////Problem 2C2 ///

let z = 20
let add20 = add10 z

////End Problem 2C2//

【问题讨论】:

标签: f#


【解决方案1】:

如果你定义一个看起来像这样的add 函数(注意你的add10 函数实际上是添加它的两个参数,而不是上一行定义的k 常量):

let add a b = a + b

F# 编译器将报告该函数的类型为int -> int -> int。现在,您实际上可以通过两种方式阅读本文:

  1. int -> int -> int 是一个函数,它接受一个 int 另一个 int 并产生 int
  2. int -> (int -> int) 是一个接受 int 并返回 int -> int 的函数。
    也就是说,你用一个号码打电话。它返回一个函数,该函数接受另一个数字并返回总和。

所以,当您编写add 32 10 时,您就是按照方式 (1) 使用它。当你写add 10时,你会得到一个如(2)中描述的函数。

【讨论】:

  • 所以我的add20,实际上是你描述的第二种类型。整数->(整数->整数)。请问如果我没有为add20提供任何参数,它是如何接受一个int的?当我在 F# 交互中运行它时,它显示 val add20 : (int -> int)。谢谢你的帮助。
  • @ezetreezy add20 是部分函数应用的结果。像 Tomas 的 add 函数这样的函数是 int -> int -> int 的原因在于,它可以被认为是一个接受单个 int 参数并返回另一个接受单个 int 参数的函数。你的add20 就是这样一个功能。这就是托马斯在上面的第 2 点中提出的观点。另一种看待它的方式是 add20 的参数是隐式的。然而,这并不是一种特别惯用的思考方式。
猜你喜欢
  • 1970-01-01
  • 2021-11-07
  • 1970-01-01
  • 1970-01-01
  • 2016-08-24
  • 1970-01-01
  • 1970-01-01
  • 2014-02-23
  • 2019-09-21
相关资源
最近更新 更多