类型推理规则



我试图制作一个符合两个字符的函数,占用其ASCII值并返回其XOR。当然,这有效:

> let a, b = '#', '%' in (int a) ^^^ (int b);;
val it : int = 6

然而,这是一个符合整数的函数,在这里并非如此。

> let xor a b  = (int a) ^^^ (int b);;                        
val xor : a:int -> b:int -> int

正如预期的,我无法在以前的参数上称此功能:

> 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    

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

这就是:

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页(

最新更新