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