Types 类型推理规则

Types 类型推理规则,types,syntax,f#,Types,Syntax,F#,我尝试创建一个函数,它包含两个字符,接受它们的ASCII值并返回它们的XOR。当然,这是可行的: >设a,b='#','%'在(inta)^^^(intb);; val it:int=6 但是,这会生成一个接受整数的函数,这里的情况并非如此 >让xor AB=(intA)^^^(intB);; val xor:a:int->b:int->int 正如所料,我无法对前面的参数调用此函数: >设a,b='#','%'在xor a b;; 设a,b='#','%'在xor a b;; ------

我尝试创建一个函数,它包含两个字符,接受它们的ASCII值并返回它们的XOR。当然,这是可行的:

>设a,b='#','%'在(inta)^^^(intb);;
val it:int=6
但是,这会生成一个接受整数的函数,这里的情况并非如此

>让xor AB=(intA)^^^(intB);;
val xor:a:int->b:int->int
正如所料,我无法对前面的参数调用此函数:

>设a,b='#','%'在xor a b;;
设a,b='#','%'在xor a b;;
---------------------------^
/home/cos/stdin(121,28):错误FS0001:此表达式应具有类型
int
但这里有一种类型
烧焦
为什么会这样?如何直接指定参数类型?

以下是如何:

let xor (a: char) (b: char)  = (int a) ^^^ (int b)
您还可以将其标记为内联以获得泛型函数

let inline xor a b  = (int a) ^^^ (int b)
这将具有以下类型

val inline xor :
  a: ^a -> b: ^b -> int
    when  ^a : (static member op_Explicit :  ^a -> int) and
          ^b : (static member op_Explicit :  ^b -> int)
因此,它适用于任何可以转换为
int
的对象

原因是

let xor a b  = (int a) ^^^ (int b)

推断出类型为
int->int->int
对于算术运算,F#默认推断出类型为
int
(参见,第13页)

,为什么假设我需要整数?关于主题?F#的任何文档都必须维护语言规范的这一部分,否则代码将崩溃。这是语言中不幸的一部分。最好有一个不进行猜测的“正确类型推断”开关;它不会猜测
let square x=x*x
具有类型
int->int
,也不会根据前几个字段名猜测记录类型。