F锋利的方法签名

时间:2016-01-13 23:43:17

标签: .net f# functional-programming

返回此值的函数的第一行应该是什么?

  

val memberof:'a *'列表 - > bool'a:equality

我尝试了以下块无济于事。代码本身可以工作,但是当我放入解释器时,我得到了一个额外的标签。

let rec memberof (a, list)=
    match list with
        | [] ->false
        | x::xs -> if x=a then true else memberof(a, xs)

我得到的是

  

val memberof:a:'a * list:'列表 - > bool'a:equality

如何摆脱a:在'a?之前?感谢

1 个答案:

答案 0 :(得分:4)

类型签名中a之前的list:只是您的函数所采用的两个参数的名称。您可以看到,如果重命名它们,签名也会更改:

> let rec memberof (element, inputList)=
    match inputList with
    | [] ->false
    | x::xs -> if x=element then true else memberof(element, xs)
  ;;    
val memberof : element:'a * inputList:'a list -> bool when 'a : equality

我不明白为什么你想要摆脱它们 - 它们只是类型签名的另一个有用部分。也就是说,如果您更改代码以便编译器无法直接将您使用的名称映射到参数,则会省略它。例如:

> let rec memberof arg = 
    let (element, inputList) = arg
    match inputList with
    | [] ->false
    | x::xs -> if x=element then true else memberof(element, xs)
;;
val memberof : 'a * 'a list -> bool when 'a : equality