我想知道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#的关键字参考似乎并没有显示出我正在寻找的东西。如果它不存在,有没有其他方法可以更好地分解出所示的代码?我想说这是确定的,因为它是,但你永远不知道..
4条答案
按热度按时间js81xvg61#
不幸的是,没有-更不幸的是,F#中的顺序非常重要。你可以使用相互递归的
let rec ... and ...
,但它和where不一样。p3rjfoxz2#
在F#中没有这样的关键字。这两个代码的区别在于,在一个代码中,定义是第一位的,然后是使用,而在第二个代码中,反之亦然。
fv2wmkja3#
“in”关键字看起来与“where”相似,但又不完全相同。
在Haskell中,你可以这样做:
要知道,这主要是函数f的定义。
在F#中不能使用
然后用let这样定义:
只有一个可能的定义,在这种情况下是标识符a的定义。但是你可以这样做
但这使该功能进入无形的范围,从而使其无效。
ggazkfy84#
在最近的F#版本中,“in”关键字不是类似于Haskell的“where”子句吗?