.net F#有类似Haskell的where子句吗?

knsnq2tg  于 2023-06-25  发布在  .NET
关注(0)|答案(4)|浏览(114)

我想知道F#中是否有类似Haskell的where子句的东西。它将允许转换以下代码

let roulleteWheel numberGenerator (scoredPopulation:ScoredPopulation) =
  let targetScore =
    let totalScore = totalPopulationFitness scoredPopulation
    Seq.head (numberGenerator 0.0 totalScore)

  let isMatch (score, accumulatedScore) =
    if (accumulatedScore >= targetScore) then
      Some(score)
    else
      None

  let accumulatedScores =
    let scores = Seq.map (fun (_, score) -> score) scoredPopulation
    Seq.skip 1 (Seq.scan (+) 0.0 scores)

  Seq.pick isMatch (Seq.zip scoredPopulation accumulatedScores)

(imo)稍微易读的版本

let roulleteWheel numberGenerator (scoredPopulation:ScoredPopulation) =
  Seq.pick isMatch (Seq.zip scoredPopulation accumulatedScores)
  where
    let targetScore =
      let totalScore = totalPopulationFitness scoredPopulation
      Seq.head (numberGenerator 0.0 totalScore)

    let isMatch (score, accumulatedScore) =
      if (accumulatedScore >= targetScore) then
        Some(score)
      else
        None

    let accumulatedScores =
      let scores = Seq.map (fun (_, score) -> score) scoredPopulation
      Seq.skip 1 (Seq.scan (+) 0.0 scores)

因为它首先显示函数的核心部分,然后显示实现细节(我认为是吹毛求疵!).
我猜F#解析代码文件是不可能的。我说的对吗查看F#的关键字参考似乎并没有显示出我正在寻找的东西。如果它不存在,有没有其他方法可以更好地分解出所示的代码?我想说这是确定的,因为它是,但你永远不知道..

js81xvg6

js81xvg61#

不幸的是,没有-更不幸的是,F#中的顺序非常重要。你可以使用相互递归的let rec ... and ...,但它和where不一样。

p3rjfoxz

p3rjfoxz2#

在F#中没有这样的关键字。这两个代码的区别在于,在一个代码中,定义是第一位的,然后是使用,而在第二个代码中,反之亦然。

fv2wmkja

fv2wmkja3#

“in”关键字看起来与“where”相似,但又不完全相同。
在Haskell中,你可以这样做:

f b = a + b
where a = 2 + 3

要知道,这主要是函数f的定义。
在F#中不能使用

let ... in

然后用let这样定义:

let a = 2 + 3 in (let f b = a + b)// <- invalid

只有一个可能的定义,在这种情况下是标识符a的定义。但是你可以这样做

let a = 2 + 3 in (fun b -> a + b)

但这使该功能进入无形的范围,从而使其无效。

ggazkfy8

ggazkfy84#

在最近的F#版本中,“in”关键字不是类似于Haskell的“where”子句吗?

相关问题