代码之家  ›  专栏  ›  技术社区  ›  Adam

如何为接受两个参数的String.Equals重载构造一个Function?

  •  0
  • Adam  · 技术社区  · 1 年前

    我在F#中摆弄C#函数转换。我知道有更多惯用的方法可以做到这一点(包括使用 static 方法论 System.String ),但这是一个学习练习。在C#中,如果我想基于对象的实例方法创建谓词,这很简单

    var predicate = MakeEquals("hello");
    Console.WriteLine(predicate("HELLO", StringComparison.OrdinalIgnoreCase)); // True
    
    Func<string, StringComparison, bool> MakeEquals(string s) => s.Equals;
    

    在F#中,这不会编译:

    let makeEquals (s: string) : string -> StringComparison -> bool =
        let f = Func<string, StringComparison, bool>(s.Equals)
        FuncConvert.FromFunc(f)
    
    error FS0001: This expression was expected to have type    
        'StringComparison -> bool'    
    but here has type  
        'bool'
    

    这个错误让我很困惑,尤其是因为这是有效的:

    let makeEquals (s: string) : string -> bool =
        let f = Func<string, bool>(s.Equals)
        FuncConvert.FromFunc(f)
    

    我没有任何问题 打电话 超载法

    "hello".Equals("HELLO", StringComparison.OrdinalIgnoreCase) // true
    

    我做错了什么?

    1 回复  |  直到 1 年前
        1
  •  1
  •   Fyodor Soikin    1 年前

    类型 那个 超载 s.Equals 实际上是 string * StringComparison -> bool ,不 string -> StringComparison -> bool 也就是说,从F#的角度来看,重载接受一个元组参数,而不是两个参数。

    因此,这将奏效:

    Func<string * StringComparison, bool>(s.Equals)
    

    或者,您可以使用包装器函数对其进行curry化:

    Func<string, StringComparison, bool>(fun a b -> s.Equals(a, b))