Имеет ли F # что-то вроде предложения where в Haskell? - PullRequest
7 голосов
/ 04 сентября 2011

Мне было интересно, есть ли в F # что-то вроде предложения 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 #, я не вижу ничего похожего на то, что я ищу.Если его не существует, есть ли другой способ улучшить выделенный код?Я бы сказал, что все в порядке, но ты никогда не знаешь ..

Ответы [ 3 ]

6 голосов
/ 04 сентября 2011

К сожалению, нет - еще более печальный порядок в F # имеет большое значение. Вы можете использовать взаимную рекурсию let rec ... and ..., но это не то же самое, что где.

1 голос
/ 04 сентября 2011

В F # такого ключевого слова нет.Разница в обоих кодах заключается в том, что в одном из них сначала идет определение, а затем в использовании, а во втором - наоборот.

0 голосов
/ 19 сентября 2012

Разве ключевое слово "in" в последних версиях F # не похоже на предложение "где" в Haskell?

...