我试图使一个函数接受两个字符,并接受其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)
为什么会发生?如何直接指定参数类型?
这是这样的:
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页)
| 归档时间: |
|
| 查看次数: |
59 次 |
| 最近记录: |