Pregunta

Me gustaría saber cómo convertir este código línea por línea de C # a F #. No estoy buscando a utilizar cualquier tipo de expresiones idiomáticas F # 's o algo por el estilo. Estoy tratando de entender cómo mapa directamente construcciones C # 's a F #.

Este es el código C #:

//requires l.Length > 0
int GetMinimumValue(List<int> l) {
    int minVal = l[0];

    for (int i = 0; i < l.Length; ++i) {
        if (l[i] > minValue) {
            minVal = l[i];
        }
    }

    return minVal;
}

Y aquí está mi F # intento:

let getMinValue (l : int list) =
    let minVal = l.Head

    for i = 0 to (l.Length-1) do
        if (l.Item(i) > minVal) then
            minVal = col.Item(i)

    minVal

Ahora bien, esto no está funcionando. El problema parece estar relacionado con la línea minVal = col.Item(i):

This expression was expected to have type     unit     but here has type     bool

¿Cuál es el problema, en realidad?

¿Fue útil?

Solución

Si desea convertir línea por línea a continuación, intente lo siguiente

let getMinValue (l:System.Collections.Generic.List<int>) =
  let mutable min = l.Item(0)
  for i = 0 to (l.Count-1) do
    if l.Item(i) < min then min <- l.Item(i)
  min

Ahora en cuanto a por qué recibe ese error en particular. Echar un vistazo a la siguiente línea

minVal = col.Item(i)

En F # esto no es una misión pero una comparación. Así que esta es una expresión que produce un valor bool, pero dentro del bucle for todas las expresiones deben ser void / unit regresar. Por lo tanto recibe un error.

Asignación de F # tiene al menos 2 formas que yo sepa.

// Assigning to a mutable value
let mutable v1 = 42
v1 <- 13

// Assigning to a ref cell
let v1 = ref 0
v1 := 42

Y, por supuesto, debe leer el artículo de Brian absolutamente sobre este tema. Es muy detallado y alto muchos de los puntos más finos en la traducción entre los dos idiomas

Otros consejos

Existen algunos problemas con su traducción literal. En primer lugar, está el problema inmediato que provoca el error del compilador: como han dicho otros, dejar que las consolidaciones son inmutables por defecto. Sin embargo, hay al menos otro gran problema: System.Collections.Generic.List<T> es muy diferente de 't list F # 's. El tipo BCL es una lista mutable respaldado por una matriz, que proporciona la constante de tiempo de acceso aleatorio a los elementos; la F # tipo es una lista enlazada inmutable, por lo que el acceso a la n-ésimo elemento toma tiempo O (n). Si usted insiste en hacer la traducción expresión por la expresión, puede encontrar este entrada en el blog de Brian valiosa.

lo recomiendo encarecidamente que siga el consejo de otros y tratar de aclimatarse a pensar en idiomática F # en lugar de traducir literalmente, C #. Aquí hay algunas maneras de escribir algunas funciones relacionadas en F #:

// Given an F# list, find the minimum element:
let rec getMinList l =
| [] -> failwith "Can't take the minimum of an empty list"
| [x] -> x
| x::xs ->
    let minRest = getMin xs
    min x minRest

Tenga en cuenta que esto funciona en las listas de cualquier tipo de elemento (con la salvedad de que las necesidades de tipo elemento a ser comparable desde la perspectiva F # 's o la aplicación de la función causará un error en tiempo de compilación). Si quieres una versión que funcionará en cualquier tipo de secuencia en lugar de sólo en las listas, se puede basar en la función Seq.reduce, que se aplica la función suministrada como primer argumento a cada par de elementos en una secuencia hasta que un solo restos de valor .

let getMin s = Seq.reduce min s

O lo mejor de todo, se puede utilizar la función integrada de Seq.min, que es equivalente.

Respuesta corta:. = no es de asignación (mutable) en Fa #

Pregunta: ¿Usted realmente col media

Intenta usar para escribir esto sin asignaciones. Hay recursividad y funciones incorporadas a su disposición: -)

Debe leer

Lo que este código C # verá como en F #? (Primera parte: expresiones y declaraciones)

Estoy decepcionado de que ninguna de las otras respuestas ya vinculado, porque la gente se pregunta el 'cómo convertir C # a F #' pregunta mucho, y he publicado este enlace respuesta mucho, y ahora algunos de los otros que responden debe saber esto:)

Este es el más traducción literal posible:

let getMinimumValue (l: List<int>) =
  let mutable minVal = l.[0]

  for i=0 to l.Length-1 do
    if l.[i] > minVal then
      minVal <- l.[i]

  minVal
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top