繁体   English   中英

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

[英]Why does F# infer int in this function?

在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

请注意,您不必注释这两个参数:知道+运算符的一侧是一个字符串就足以让F#推断另一侧也必须是一个字符串。

你可以做的另一件事是使函数inline ,这将导致两件事:

  1. F#将不会编译到这个函数调用,但实际上将插入函数的代码到调用位置,并
  2. 因此,如果需要,F#编译器将能够在不同的调用位置使用不同的 +运算符。

也就是说, add 3 5将成为3 + 5 ,它使用整数加法运算,并add "foo" "bar"将成为"foo" + "bar" ,它使用的串加成过载+

F#泛型/函数重载语法在F#中使用`inline`等问题中,其原因更深入,所以我不会在这里介绍它们。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM