Можно ли иметь частные функции (пусть определения) в модулях F #? - PullRequest
20 голосов
/ 11 сентября 2011

Я бы хотел сделать applyAndTruncate скрытым от внешнего мира (то есть от всего, что находится за пределами модуля Scoring), поскольку я действительно использую его только в качестве основы для bestKPercent и worstKPercent.Можно ли это скрыть?Если нет, то какой F # способ добиться того, что я хочу сделать?

module Scoring
    let applyAndTruncate f percentage (scoredPopulation:ScoredPopulation) : ScoredPopulation =
      if (percentage < 0.0 || percentage > 1.0) then
        failwith "percentage must be a number between 0.0 and 1.0"

      let k = (int)(percentage * (double)(Array.length scoredPopulation))

      scoredPopulation
      |> f
      |> Seq.truncate k
      |> Seq.toArray

    let bestKPercent = applyAndTruncate sortByScoreDesc
    let worstKPercent = applyAndTruncate sortByScoreAsc

Ответы [ 2 ]

49 голосов
/ 11 сентября 2011

Да. let private myfunc = сделает это.

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

Вы также можете использовать файлы сигнатур , чтобы указать открытый интерфейс соответствующего файла реализации. Тогда идея заключается в том, что вы не будете беспокоиться о доступности, пока реализация не укрепится. Я, честно говоря, никогда не использовал их, но они широко используются в исходном коде компилятора F # (вероятно, только потому, что я доволен стилем сайта реализации, используемым во многих других языках, тогда как люди с оригинальным опытом ML будут чувствовать себя непринужденно). с файлами сигнатур; также, вы получаете некоторые дополнительные функции с файлами сигнатур, хотя ничего сверхъестественного).

Таким образом, если бы ваш Scoring модуль был реализован в файле с именем Scoring.fs, у вас был бы соответствующий файл подписи с именем Scoring.fsi, который бы выглядел примерно так:

namespace NS //replace with you actual namespace; I think you must use explicit namespaces
module Scoring =
    //replace int[] with the actual ScoredPopulation type; I don't think you can use aliases
    val bestKPercent : (float -> int[] -> int[])
    val worstKPercent : (float -> int[] -> int[])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...