Types 类型推理规则
我尝试创建一个函数,它包含两个字符,接受它们的ASCII值并返回它们的XOR。当然,这是可行的: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;; ------
>设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
,也不会根据前几个字段名猜测记录类型。