【问题标题】:F sharp method signatureF 尖锐方法签名
【发布时间】:2016-01-14 08:05:18
【问题描述】:

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

val memberof : 'a * 'a list -> bool when 'a : 相等

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

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:'a list -> bool when 'a : 相等

我怎样才能摆脱 'a 之前的 a: ?谢谢

【问题讨论】:

    标签: .net f# functional-programming


    【解决方案1】:

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

    > 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
    

    【讨论】:

    • 谢谢,我想知道这个问题,因为这个函数的预期输出格式是事先给我的。我知道 a 和 list 是参数的名称,但编译器无法映射它们似乎是一个很好的解释。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-28
    • 1970-01-01
    • 2015-07-24
    • 1970-01-01
    • 2011-05-20
    • 2020-01-28
    相关资源
    最近更新 更多