是否可以在F#模块中使用私有函数(让定义)?

时间:2011-09-11 15:38:15

标签: .net f#

我想让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 个答案:

答案 0 :(得分:49)

是。 let private myfunc =会做到这一点。

答案 1 :(得分:12)

您还可以使用signature files指定相应实现文件的公共接口。然后,我们的想法是,在实施固化之前,您不必担心可访问性。老实说,我从来没有使用它们,但它们被广泛用于F#编译器源代码(可能只是因为我对其他许多语言中使用的实现网站风格感到满意,而具有原始ML经验的人会很放心带有签名文件;还有you do get some extra features带有签名文件,但没有什么超级引人注目的。)

因此,如果您的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[])