在F#中,我可以将字符串与+运算符组合如下:
let myString = "one" + "two"
Run Code Online (Sandbox Code Playgroud)
但是当我创建一个接受两个参数并应用相同运算符的函数时,我把它放在一个在其使用之前声明的模块中,F#将这些类型推断为整数:
module StringFunctions =
let add str1 str2 =
str1 + str2
Run Code Online (Sandbox Code Playgroud)
调用下面给出了构建错误,"表达式应该有'int'类型,但这里有'string'类型:"
let str3 = StringFunctions.add "three" "four"
为什么F#将其推断为int?我假设它不能是一个通用的方法,因为并非所有类型都会实现+运算符,但为什么它假设为int?
简短的版本是"因为这就是F#的设计方式".
较长的版本是,如果一个函数的类型不能是通用的(并且你是正确的,因为并非所有类型都必须补充+运算符),那么F#必须选择一个真实的类型.+运算符最常见的用例是添加整数,因此F#默认假设它+是整数加法运算符,除非你另有说明.
否则你可以告诉它的一种方法是输入一个类型注释:
let add (str1 : string) str2 = str1 + str2
Run Code Online (Sandbox Code Playgroud)
请注意,您不必注释这两个参数:知道+运算符的一侧是字符串就足以让F#推断另一侧也必须是字符串.
你可以做的另一件事是创建函数inline,这将导致两件事:
+运算符.也就是说,add 3 5将成为3 + 5使用整数加法运算符,add "foo" "bar"并将成为"foo" + "bar"使用字符串加法重载+.
在F#泛型/函数重载语法和在F#中使用`inline`等问题中,其原因更深入,所以我不会在这里讨论它们.
| 归档时间: |
|
| 查看次数: |
126 次 |
| 最近记录: |