2011-09-11 11 views
17

me gustaría hacer applyAndTruncate oculta del mundo exterior (es decir, de nada fuera del módulo Scoring), ya que en realidad sólo lo uso como columna vertebral de bestKPercent y worstKPercent. ¿Es posible ocultarlo? Si no, ¿cuál es la forma más fácil de lograr lo que quiero hacer?¿Es posible tener funciones privadas (definiciones de let) en módulos 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 
+0

casi no sé nada de F #, pero quizás [la F # spec] (http://research.microsoft.com/en-us/um/cambridge/projects/fsharp/manual/spec.html#_Toc270597594) es útil. Parece que puedes agregar anotaciones de accesibilidad para dejar las fijaciones. –

Respuesta

40

Sí. let private myfunc = lo hará.

+0

Y para funciones recursivas, debe poner el 'rec' antes' private' – knocte

10

También puede usar signature files para especificar la interfaz pública de un archivo de implementación correspondiente. Entonces, la idea es que no se preocupe por la accesibilidad hasta que la implementación se haya solidificado. Honestamente, nunca los he usado, pero se usan mucho en el código fuente del compilador F # (probablemente solo porque me siento cómodo con el estilo del sitio de implementación utilizado en muchos otros idiomas, mientras que las personas con experiencia ML original estarán a gusto) con archivos de firma, también, you do get some extra features con archivos de firma, aunque nada súper convincente).

Así que si sus Scoring módulo se llevaron a cabo en un archivo llamado Scoring.fs, tendría un archivo de firma correspondiente llamado Scoring.fsi que sería algo como:

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[]) 
+6

Podría usar archivos de firma si pudiera hacer clic con el botón derecho en un archivo * .fs en Visual Studio y en "Generar archivo de firma". Tal como están las cosas, si quiero una, tengo que buscar la sintaxis para escribirla a mano, o tengo que buscar los parámetros de la línea de comando para que el compilador F # genere uno para mí y luego agregar el archivo al proyecto. Hasta ahora, no he sentido la necesidad de molestarme lo suficiente. –

Cuestiones relacionadas