我试图制作一个符合两个字符的函数,占用其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页(