int -> int"这在 F# 中是什么意思?-6ren"> int -> int"这在 F# 中是什么意思?-我想知道这在 F# 中意味着什么。 “一个接受一个整数的函数,它返回一个接受一个整数并返回一个整数的函数。” 但我不太明白这一点。 谁能解释得这么清楚? [更新]: > let f1 x y = x+-6ren">
gpt4 book ai didi

f# - "int -> int -> int"这在 F# 中是什么意思?

转载 作者:行者123 更新时间:2023-12-03 21:00:15 25 4
gpt4 key购买 nike

我想知道这在 F# 中意味着什么。
“一个接受一个整数的函数,它返回一个接受一个整数并返回一个整数的函数。”
但我不太明白这一点。
谁能解释得这么清楚?

[更新]:

> let f1 x y = x+y ;;

val f1 : int -> int -> int

这是什么意思 ?

最佳答案

F# 类型

让我们从头开始。

F# 使用冒号 ( : ) 表示法来指示事物的类型。假设您定义了一个 int 类型的值:

let myNumber = 5

F# Interactive 会明白 myNumber是一个整数,将通过以下方式告诉您:
myNumber : int

读作

myNumber is of type int



F# 函数类型

到现在为止还挺好。再介绍点别的, 功能类型 .函数类型只是函数的类型。 F# 使用 ->表示功能类型。这个箭头象征着写在它左边的东西变成了写在它右边的东西。

让我们考虑一个简单的函数,它接受一个参数并将其转换为一个输出。这种函数的一个例子是:
isEven : int -> bool

这引入了函数的名称(在 : 的左侧)及其类型。这行可以用英语阅读为:

isEven is of type function that transforms an int into a bool.



请注意,要正确解释所说的内容,您应该在“符合类型”部分之后稍作停顿,然后立即阅读句子的其余部分,不要停顿。

在 F# 中,函数是值

在 F# 中,函数(几乎)并不比普通类型更特殊。它们是您可以传递给函数、从函数返回的东西,就像 bool 值、整数或字符串一样。

所以如果你有:
myNumber : int
isEven : int -> bool

你应该考虑 intint -> bool作为相同类型的两个实体:类型。在这里, myNumber是类型 int 的值, 和 isEven是类型 int -> bool 的值(这就是我在谈论上面的短暂停顿时试图象征的东西)。

功能应用

包含 -> 的类型的值碰巧也被称为函数,并且具有特殊的权力:您可以将函数应用于值。所以,例如,
isEven myNumber

表示您正在应用名为 isEven 的函数到值 myNumber .正如您可以通过检查 isEven 的类型所期望的那样,它将返回一个 bool 值。如果您已正确实现 isEven ,它显然会返回 false .

返回函数类型值的函数

让我们定义一个通用函数来确定一个整数是其他整数的倍数。我们可以想象我们函数的类型是(括号是为了帮助你理解,它们可能存在也可能不存在,它们有特殊的含义):
isMultipleOf : int -> (int -> bool)

你可以猜到,这被解读为:

isMultipleOf is of type (PAUSE) function that transforms an int into (PAUSE) function that transforms an int into a bool.



(这里的(PAUSE)表示大声朗读时的停顿)。

我们稍后会定义这个函数。在此之前,让我们看看如何使用它:
let isEven = isMultipleOf 2

F#互动会回答:
isEven : int -> bool

读作

isEven is of type int -> bool



在这里, isEven有类型 int -> bool ,因为我们刚刚将值 2 ( int ) 赋予 isMultipleOf ,正如我们已经看到的,它转换了 intint -> bool .

我们可以查看这个函数 isMultipleOf作为一种功能创建者。
isMultipleOf的定义

所以现在让我们定义这个神秘的函数创建函数。
let isMultipleOf n x =
(x % n) = 0

容易吧?

如果你在 F# Interactive 中输入这个,它会回答:
isMultipleOf : int -> int -> bool

括号在哪里?

请注意,没有括号。这对你来说现在不是特别重要。请记住,箭头是右结合的。也就是说,如果你有
a -> b -> c

你应该把它解释为
a -> (b -> c)

右结合中的 right 意味着您应该将其解释为最右边的运算符周围有括号。所以:
a -> b -> c -> d

应该解释为
a -> (b -> (c -> d))
isMultipleOf的用法

所以,如你所见,我们可以使用 isMultipleOf创建新函数:
let isEven = isMultipleOf 2
let isOdd = not << isEven
let isMultipleOfThree = isMultipleOf 3
let endsWithZero = isMultipleOf 10

F# Interactive 会回应:
isEven : int -> bool
isOdd : int -> bool
isMultipleOfThree : int -> bool
endsWithZero : int -> bool

但是您可以以不同的方式使用它。如果您不想(或不需要)创建新函数,可以按如下方式使用它:
isMultipleOf 10 150

这将返回 true , 因为 150 是 10 的倍数。这与创建函数 endsWithZero 完全相同然后将其应用于值 150。

其实, 函数应用程序是左关联的 ,这意味着上面的行应该被解释为:
(isMultipleOf 10) 150

也就是说,您将括号放在最左边的函数应用程序周围。

现在,如果您能理解所有这些,那么您的示例(这是规范的 CreateAdder )应该是微不足道的!

前段时间有人问 this question它处理完全相同的概念,但在 Javascript 中。在我的回答中,我给出了两个在 Javascript 中的规范示例(CreateAdder、CreateMultiplier),它们在返回函数方面更加明确。

我希望这有帮助。

关于f# - "int -> int -> int"这在 F# 中是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2175940/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com