Подтвердить что ты не робот

Возможно ли иметь частные функции (пусть определения) в модулях F #?

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

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
4b9b3361

Ответ 1

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

Ответ 2

Вы также можете использовать файлы сигнатур для указания общего интерфейса соответствующего файла реализации. Тогда идея состоит в том, что вы не беспокоитесь о доступности, пока реализация не закрепится. Я честно их никогда не использовал, но они широко используются в исходном коде компилятора 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[])