gpt4 book ai didi

f# - 为什么 F# 在这个函数中推断 int?

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

在 F# 中,我可以将字符串与 + 组合在一起。运算符如下:

let myString = "one" + "two"

但是,当我创建一个将接受两个参数并应用相同运算符的函数并将其放入在其使用之前声明的模块中时,F# 将类型推断为整数:
module StringFunctions = 

let add str1 str2 =
str1 + str2

调用下面的代码会给我构建错误,“表达式应该有类型'int',但这里有类型'string'”:
let str3 = StringFunctions.add "three" "four"
为什么 F# 将其推断为 int?我认为它不能是通用方法,因为并非所有类型都会实现 +运算符,但为什么它假定为 int?

最佳答案

简短的版本是,“因为这就是 F# 的设计方式”。

更长的版本是,如果一个函数的类型不能是泛型的(你是对的,这个不能,因为并非所有类型都必须实现 + 运算符),那么 F# 必须选择一个真正的类型。 + 的最常见用例运算符正在添加整数,因此 F# 默认假设 +是整数加法运算符,除非您另有说明。

您可以告诉它的一种方法是放入类型注释:

let add (str1 : string) str2 = str1 + str2

请注意,您不必注释两个参数:知道 + 的一侧operator is a string 足以让 F# 推断出另一端也必须是字符串。

您可以做的另一件事是使函数 inline ,这将导致两件事:
  • F# 不会将其编译为函数调用,但实际上会将函数的代码插入调用位置,并且
  • 因此,F# 编译器将能够使用不同的 +如有需要,在不同调用地点的接线员。

  • 也就是说, add 3 5将变为 3 + 5它使用整数加法运算符和 add "foo" "bar"将变为 "foo" + "bar"它使用 + 的字符串加法重载.

    F# generics / function overloading syntax 等问题中更深入地探讨了这项工作的原因。和 Use of `inline` in F# (除其他外),所以我不会在这里讨论它们。

    关于f# - 为什么 F# 在这个函数中推断 int?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43537908/

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