【问题标题】:Multiple parameters to methods in F#F#中方法的多个参数
【发布时间】:2009-02-25 19:51:48
【问题描述】:

我有一个用 C# 编写的 F# 类,它定义了一个方法 Render:

member this.Render template (context: IContext) =
    let tokens = Lexer.tokenize template
    let parser = new DefaultParser([for filter in _filters -> filter])

    let resp = new StringBuilder()
    for node in parser.Parse tokens None do
        ignore <| resp.Append(node.render context)

    resp.ToString()

这个方法的签名是template:string -&gt; (IContext -&gt; string),当然读作“成员Render接受string参数,然后返回一个接受IContext并产生字符串的函数。

如果我将声明从“成员”更改为 let 绑定,将其定义为类定义的本地函数:

let Render template (context: IContext) = ...

然后签名变成您期望的样子 - string -&gt; IContext -&gt; string,其内容为“Render 接受一个字符串,然后是 IContext 并产生一个字符串”。

有没有办法让成员表现得像 let 绑定?这会导致从 C# 中使用此成员时出现问题,因为签名变为 Render(string, FastFunc&lt;IContext, string&gt;),这不是过度使用。

【问题讨论】:

    标签: f#


    【解决方案1】:

    如果你想暴露给 C#,你应该把它写成 tupled 样式:

    > type Foo =
    -   member this.Bar (param1, param2) =  param1 + param2;;
    
    type Foo =
      class
        member Bar : param1:int * param2:int -> int
      end
    

    这将公开一个普通的 .NET 样式方法。

    【讨论】:

    • 确保为元组中的对象提供名称。
    • 对不起 - 这是一个稍微不同的问题。您的建议适用于具体成员,但不适用于在 f# 中定义然后在 c# 中实现的接口。那些作为 Tuple
    猜你喜欢
    • 1970-01-01
    • 2013-01-28
    • 2018-10-10
    • 1970-01-01
    • 2021-11-14
    • 1970-01-01
    • 1970-01-01
    • 2014-08-11
    • 1970-01-01
    相关资源
    最近更新 更多