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

C# 需要帮助将一些F#代码转换为C吗#,c#,machine-learning,f#,C#,Machine Learning,F#,我正在使用F#book进行机器学习。我正在将F代码转换为C代码,并做教程,因为我对F不太了解。我真的陷入了代码的一部分,不知道是否有人能告诉我如何用c#编写代码。即使只是解释一下代码在F#中的作用也会有所帮助。。我被卡住的代码是 let tokenScore (group:DocsGroup) (token:Token) = if group.TokenFrequencies.ContainsKey token then log group.TokenFrequencies.[token

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

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)
我真的被这件事缠住了

let scoreToken = tokenScore group
   log group.Proportion +
   (document |> Seq.sumBy scoreToken)
这是针对.Net开发人员的机器学习项目-第2章中的教程。如果你能帮助我,那就太好了。提前感谢

F#功能是可用的。这意味着,如果一个函数是用两个参数声明的,而您仅用一个参数调用它,那么结果就是另一个函数,一个参数。下面是一个例子:

let add x y = x + y
let n = add 2 3  // Now n has the value 5
let addFive = add 5  // This is a *function* that takes one parameter
let altAddFive y = add 5 y  // Another way to define the same thing
let result = addFive 3  // Now result has the value 8
let altResult = altAddFive 3  // This one also has the value 8
因此,在
score
函数中,名称
scoreToken
现在指的是一个函数,它接受一个参数,然后使用两个参数调用
tokenScore
group
,以及刚刚传递的值。换句话说,
scoreToken
的定义可以写成:

let scoreToken token = tokenScore group token
那也是同样的事情

现在看下一行。首先,
log
是一个函数,通常用数学符号写成
ln
。它接受一个浮点数,并返回一个浮点数。F#中运算符优先级的规则是函数调用的优先级高于运算符,因此
log3.0+5.0
将被解释为
(log3.0)+5.0
,这与
log8.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
相当于,但F#中的参数顺序与C#中的相反。F#
Seq.sumBy
函数采用两个参数;首先是应用于每个元素以产生值的函数,其次是元素序列。也就是说,如果您在没有
|>
操作符的情况下调用它,它将如下所示:

Seq.sumBy scoreToken document
这将贯穿
文档
序列(类型为
TokenizedDoc
,考虑到其使用方式,显然可以将其视为一个令牌序列)。对于文档中的每个令牌,将调用
scoreToken
函数(如果您还记得,调用
scoreToken t
,其中
t
是一些令牌,与调用
tokenScore组t
相同)。该调用将生成一个浮点值。最后,将所有浮点值相加以生成最终分数

然而,在F#中,对序列求和或执行类似操作时,传统上使用“pipe”操作符
|>
document>Seq.sumBy scoreToken
完全等同于
Seq.sumBy scoreToken document
|>
操作符是无效的,因此我不会在这里重复该答案

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

F#函数是。这意味着,如果一个函数是用两个参数声明的,而您仅用一个参数调用它,那么结果就是另一个函数,一个参数。下面是一个例子:

let add x y = x + y
let n = add 2 3  // Now n has the value 5
let addFive = add 5  // This is a *function* that takes one parameter
let altAddFive y = add 5 y  // Another way to define the same thing
let result = addFive 3  // Now result has the value 8
let altResult = altAddFive 3  // This one also has the value 8
因此,在
score
函数中,名称
scoreToken
现在指的是一个函数,它接受一个参数,然后使用两个参数调用
tokenScore
group
,以及刚刚传递的值。换句话说,
scoreToken
的定义可以写成:

let scoreToken token = tokenScore group token
那也是同样的事情

现在看下一行。首先,
log
是一个函数,通常用数学符号写成
ln
。它接受一个浮点数,并返回一个浮点数。F#中运算符优先级的规则是函数调用的优先级高于运算符,因此
log3.0+5.0
将被解释为
(log3.0)+5.0
,这与
log8.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
相当于,但F#中的参数顺序与C#中的相反。F#
Seq.sumBy
函数采用两个参数;首先是应用于每个元素以产生值的函数,其次是元素序列。也就是说,如果您在没有
|>
操作符的情况下调用它,它将如下所示:

Seq.sumBy scoreToken document
这将贯穿
文档
序列(类型为
TokenizedDoc
,考虑到其使用方式,显然可以将其视为一个令牌序列)。对于文档中的每个令牌,将调用
scoreToken
函数(如果您还记得,调用
scoreToken t
,其中
t
是一些令牌,与调用
tokenScore组t
相同)。该调用将生成一个浮点值。最后,将所有浮点值相加以生成最终分数

然而,在F#中,对序列求和或执行类似操作时,传统上使用“pipe”操作符
|>
document>Seq.sumBy scoreToken
完全等同于
Seq.sumBy scoreToken document
|>
运算符是