繁体   English   中英

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

[英]Need Help Converting some F# code to C#

我正在使用F#书进行机器学习。 我将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现在是指一个具有一个参数的函数,然后使用两个参数调用tokenScoregroup和刚刚传递的值。 换句话说, scoreToken的定义可以写成:

let scoreToken token = tokenScore group token

那将是同一回事。

现在下一行。 首先, log自然对数函数 ,通常以数学符号ln表示。 它采用一个浮点数,并返回一个浮点数。 运算符优先级的F#中的规则是该函数调用比运营商优先级更高 ,因此log 3.0 + 5.0将被解释为(log 3.0) + 5.0 ,这不会是相同的值作为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 与LINQ Sum方法的两参数版本等效,但是F#中的参数顺序与C#中的参数顺序相反。 F# Seq.sumBy函数采用两个参数; 首先,应应用于每个元素以产生值的函数,其次是元素序列。 即,如果您在不使用|>运算符的情况下调用它,则它将看起来像这样:

Seq.sumBy scoreToken document

这将遍历document序列(其类型为TokenizedDoc并且鉴于其使用方式,显然可以视为令牌序列)。 对于文档中的每个令牌,将调用scoreToken函数(如果您还记得,调用scoreToken t ,其中t是某些令牌,与调用tokenScore group t相同)。 该调用将产生一个浮点值。 最后,所有浮点值将被加在一起以产生最终分数。

但是,在F#中,传统上在对序列求和或执行类似操作时使用“ pipe”运算符|>document |> Seq.sumBy scoreTokenSeq.sumBy scoreToken document完全等效。 |>运算符在另一个SO问题的答案中作了很好的解释,因此在此我将不重复该答案。

因此,此功能正在执行的操作是获取group.Proportion值的自然对数,并将其添加到文档中每个标记的分数中。 加法的结果是函数中的最后一个表达式,所以这就是函数的结果:在F#中,与C#不同,您不需要在函数末尾键入return return关键字在F#中具有不同的含义,由于这是一个完全不同的主题,因此我现在不再赘述)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM