2011-09-04 9 views
7

Me preguntaba si hay algo en F # como la cláusula where de Haskell. Que permitiría transformar el siguiente códigoTiene F # algo como la cláusula Haskell's 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) 

en el (OMI) versión ligeramente más legible

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) 

ya que muestra la parte central de la primera función y los detalles de implementación más tarde (nitpicking, ¡Creo que!).

Supongo que no sería posible por la forma en que F # analiza los archivos de código. ¿Estoy en lo cierto? Al ver las palabras clave de F #, la referencia no parece mostrar nada como lo que estoy buscando. Si no existe, ¿hay alguna otra manera de factorizar mejor el código que se muestra? Yo diría que está bien, pero nunca se sabe ..

Respuesta

6

Lamentablemente, no, incluso más tristemente el orden en F # importa mucho. Puede usar recursivo recíproco let rec ... and ... pero no es lo mismo que donde.

1

No existe tal palabra clave en F #. La diferencia en ambos códigos es que en uno la definición viene primero y luego el uso y en el segundo es al revés.

0

¿No es la palabra clave "in" en las versiones recientes de F # similar a la cláusula "where" de Haskell?