首页 > 解决方案 > 类型推理规则

问题描述

我试图制作一个函数,它需要两个字符,获取它们的 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    

为什么会这样?如何直接指定参数的类型?

标签: typessyntaxf#

解决方案


这是如何:

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


推荐阅读