类型推断规则

ene*_*dil 3 syntax f# types

我试图使一个函数接受两个字符,并接受其ASCII值并返回其XOR。当然,这可行:

> let a, b = '#', '%' in (int a) ^^^ (int b);;
val it : int = 6
Run Code Online (Sandbox Code Playgroud)

但是,这会使函数采用整数,而这里不是这种情况。

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

val xor : a:int -> b:int -> int
Run Code Online (Sandbox Code Playgroud)

不出所料,我无法在以前的参数上调用此函数:

> let a, b = '#', '%' in xor a b;;

  let a, b = '#', '%' in xor a b;;
  ---------------------------^

/home/cos/stdin(121,28): error FS0001: This expression was expected to have type
    int    
but here has type
    char    
Run Code Online (Sandbox Code Playgroud)

为什么会发生?如何直接指定参数类型?

nil*_*irk 7

这是这样的:

let xor (a: char) (b: char)  = (int a) ^^^ (int b)
Run Code Online (Sandbox Code Playgroud)

您也可以内联标记它以获得通用功能

let inline xor a b  = (int a) ^^^ (int b)
Run Code Online (Sandbox Code Playgroud)

这将具有类型

val inline xor :
  a: ^a -> b: ^b -> int
    when  ^a : (static member op_Explicit :  ^a -> int) and
          ^b : (static member op_Explicit :  ^b -> int)
Run Code Online (Sandbox Code Playgroud)

因此为任何可以转换为的工作int

的原因

let xor a b  = (int a) ^^^ (int b)
Run Code Online (Sandbox Code Playgroud)

推断类型int -> int -> int为用于算术运算的类型,F#int默认情况下推断类型(请参见语言规范,第13页)