Anteriormente solicité algunos comentarios sobre mi primer proyecto F #. Antes de cerrar la pregunta porque el alcance era demasiado grande, alguien tuvo la amabilidad de revisarlo y dejar un comentario.F #: ¿Ventajas de convertir funciones de nivel superior a métodos de miembro?
Una de las cosas que mencionaron fue señalar que tenía una serie de funciones regulares que podrían convertirse en métodos en mis tipos de datos. Diligentemente Fui a través de cambiar cosas como
let getDecisions hand =
let (/=/) card1 card2 = matchValue card1 = matchValue card2
let canSplit() =
let isPair() =
match hand.Cards with
| card1 :: card2 :: [] when card1 /=/ card2 -> true
| _ -> false
not (hasState Splitting hand) && isPair()
let decisions = [Hit; Stand]
let split = if canSplit() then [Split] else []
let doubleDown = if hasState Initial hand then [DoubleDown] else []
decisions @ split @ doubleDown
a esto:
type Hand
// ...stuff...
member hand.GetDecisions =
let (/=/) (c1 : Card) (c2 : Card) = c1.MatchValue = c2.MatchValue
let canSplit() =
let isPair() =
match hand.Cards with
| card1 :: card2 :: [] when card1 /=/ card2 -> true
| _ -> false
not (hand.HasState Splitting) && isPair()
let decisions = [Hit; Stand]
let split = if canSplit() then [Split] else []
let doubleDown = if hand.HasState Initial then [DoubleDown] else []
decisions @ split @ doubleDown
Ahora, no me cabe duda que soy un idiota, pero aparte de (supongo) haciendo más fácil interoperabilidad C# ¿Qué me ganó eso? Específicamente, encontré un par de ventajas dis, sin contar el trabajo extra de conversión (que no contaré, ya que podría haberlo hecho de esta manera, en primer lugar, supongo, aunque eso hubiera sido posible usando F # Interactive más de un dolor). Por un lado, ahora ya no puedo trabajar con la función "pipelining" fácilmente. Tenía que ir y cambiar some |> chained |> calls
a (some |> chained).Calls
etc. Además, parecía hacer que mi sistema de tipos fuera más tonto, mientras que con mi versión original, mi programa no necesitaba anotaciones de tipo, después de convertirlo en gran parte en métodos de miembros, tuve un montón de errores sobre las búsquedas son indeterminadas en ese punto, y tuve que ir y agregar anotaciones tipo (un ejemplo de esto está en el (/=/)
anterior).
Espero no haber salido demasiado dudoso, ya que agradezco el consejo que recibí, y escribir código idiomático es importante para mí. Solo tengo curiosidad por qué la expresión es la forma en que es :)
Gracias!
molesto, no puede poner cada llamada de método en una nueva línea usando la notación de punto. –