需要帮助将一些F#代码转换为C#

时间:2017-08-17 05:46:38

标签: c# machine-learning f#

我正在使用F#book进行机器学习。我正在将F#代码转换为C#并进行教程,因为我不太了解F#。我真的陷入了代码的一部分,并想知道是否有人可以告诉我如何在c#中编写代码。即使只是解释代码在F#中的作用也会有所帮助。我遇到的代码是

try (Connection conn = DBConnection.createConnection(); PreparedStatement pstmt = conn.prepareStatement("{call prueba1(?,?)}")) {
        pstmt.setString(1,mun);
        pstmt.setString(2,edo);
        ResultSet rs = pstmt.executeQuery();
    } catch (SQLException e) {
        System.out.println(e.getMessage());
    }

我真的坚持

let tokenScore (group:DocsGroup) (token:Token) =
  if group.TokenFrequencies.ContainsKey token
  then log group.TokenFrequencies.[token]
  else 0.0

let score (document:TokenizedDoc) (group:DocsGroup) =
   let scoreToken = tokenScore group
   log group.Proportion +
   (document |> Seq.sumBy scoreToken)

这是.Net开发人员的机器学习项目教程 - 第2章。如果你可以帮助我那将是很棒的。提前致谢

1 个答案:

答案 0 :(得分:10)

F#函数是curried。这意味着如果使用两个参数声明一个函数,并且只使用一个参数调用它,则结果是一个参数的另一个函数。这是一个例子:

scoreToken

因此,在tokenScore函数中,名称group现在引用一个带有一个参数的函数,然后使用两个参数调用scoreTokenlet scoreToken token = tokenScore group token 和价值刚刚过去了。换句话说,log的定义可以写成:

ln

那就是同样的事情。

现在是下一行。首先,log 3.0 + 5.0natural logarithm function,通常用数学符号写成(log 3.0) + 5.0。它需要一个浮点数,并返回一个浮点数。 F#中运算符优先级的规则是函数调用优先于优先级,因此log 8.0将被解释为log group.Proportion + (document |> Seq.sumBy scoreToken) ,这将let score1 = log group.Proportion let score2 = document |> Seq.sumBy scoreToken score1 + score2 的值相同。因此,以下几行:

document |> Seq.sumBy scoreToken

等同于:

Seq.sumBy

最后,Seq.sumBy行也可能让您感到困惑。它有两个部分。首先,|>相当于the two-parameter version of the LINQ Sum method,但F#中的参数顺序与C#中的参数顺序相反。 F#Seq.sumBy scoreToken document 函数有两个参数;首先,应该应用于每个元素以生成值的函数,其次,元素的序列。即,如果你在没有document运算符的情况下调用它,它将如下所示:

TokenizedDoc

这将通过scoreToken序列(scoreToken t类型,并且按照它的使用方式,显然可以将其视为一系列标记)。对于文档中的每个标记,将调用t函数(如果您记得,调用tokenScore group t,其中|>是某个标记,与调用{document |> Seq.sumBy scoreToken相同1}})。该调用将产生浮点值。最后,所有浮点值将被加在一起以产生最终得分。

然而,在F#中,传统上使用" pipe"在对序列进行求和或执行类似操作时,Seq.sumBy scoreToken document运算符|>完全等同于group.Proportionreturn运算符为rather well explained in the answer to another SO question,因此我不会在此处复制该答案。

所以这个函数正在做的是获取return值的自然日志,并将其添加到文档中每个标记的分数。这个添加的结果是函数中的最后一个表达式,因此该函数的结果是:在F#中,与C#不同,您不需要在函数末尾键入{{1}} 。 ({{1}}关键字在F#中有不同的含义,我现在不会进入,因为这是一个完全不同的主题。)