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