quimica que polimorfos polimorfo polimorfismo policromismo minerales geologia genetico farmacos farmaceuticos entre ejemplos diferencia alotropia polymorphism ocaml addition

polymorphism - que - polimorfos farmaceuticos



¿Por qué OCaml''s(+) no es polimórfico? (3)

Me gustaría que el operador ''+'' sea polimórfico para admitir enteros, flotadores, etc. ¿Por qué necesitamos ''+.''?

Excelente pregunta. Hay muchas compensaciones sutiles involucradas aquí.

Las ventajas de no sobrecargar a los operadores (como en OCaml) son:

  • La inferencia de tipos es más simple y más predecible.
  • El código es más componible: mover el código de un lugar a otro no puede afectar su significado.
  • Rendimiento predecible: siempre se sabe exactamente qué función se está invocando.

Las desventajas son:

  • El número de operadores diferentes se sale rápidamente de control: + para int , +. para float , +/ para racionales de precisión arbitraria, +| para vectores, +|| para matrices y los números complejos, vectores de baja dimensión y matrices, coordenadas homogéneas, etc.

Algunas alternativas son:

Soy un novato OCaml. Me gusta la velocidad de OCaml pero no entiendo completamente su diseño. Por ejemplo, me gustaría que el operador + sea ​​polimórfico para admitir enteros, flotadores, etc.

¿Por qué necesitamos +. ?


Básicamente, los sistemas de tipo de SML y OCaml (ignorando el sistema de objetos y los módulos) no admiten el polimorfismo ad hoc. Esta es una decisión de diseño. OCaml también, a diferencia de SML, decidió no incluir el azúcar sintáctica para la aritmética.

Algunos idiomas en la familia ML tienen formas extremadamente limitadas de polimorfismo ad hoc en operadores numéricos. Por ejemplo, (+) en Standard ML tiene un tipo predeterminado de (int, int) -> int , pero tiene el tipo (float, float) -> float si se sabe que su argumento o tipo de retorno es float . Estos operadores son especiales en SML, y no podrían definirse si aún no estuvieran incorporados. Tampoco es posible otorgar otros valores con esta propiedad. val add = (+) tendría tipo (int, int) -> int . La especialidad aquí se limita a la sintaxis del lenguaje, no hay soporte para el polimorfismo ad hoc en el sistema de tipos.

OCaml tiene un puñado de operadores con semántica especial (pero los operadores numéricos no están entre ellos), por ejemplo || y && son cortocircuitos (pero se convierten en circuitos largos si los asigna a un valor intermedio)

let long_circuit_or = (||);; let print_true x = print_string x; true;; (* just prints "4" *) print_true "4" || print "5";; (* prints "45" *) long_circuit_or (print_true "4") (print_true "5");;


Ocaml no admite operadores polimórficos (numéricos o de otro tipo) que no sean operadores de comparación. El + contra +. cosa elimina muchos errores sutiles que pueden surgir al convertir diferentes tamaños de enteros, flotadores y otros tipos numéricos de un lado a otro. También significa que el compilador siempre sabe exactamente qué tipo numérico está en uso, lo que facilita el reconocimiento cuando el programador ha hecho suposiciones incorrectas sobre un número que siempre tiene un valor entero. Requerir la conversión explícita entre tipos numéricos puede parecer incómodo, pero a largo plazo, probablemente le ahorrará más tiempo para rastrear errores extraños de los que debe gastar para escribir ese período adicional para que sea explícito.

Aparte de la . En las versiones de los operadores numéricos, no creo que la sintaxis de Ocaml sea particularmente extraña. Está muy en línea con los lenguajes ML anteriores con extensiones de sintaxis apropiadas y razonables para sus características añadidas. Si inicialmente te parece extraño, eso probablemente indica que, hasta el momento, solo has estado programando en lenguajes con sintaxis estrechamente relacionada. A medida que aprendas nuevos idiomas, verás que hay muchas maneras diferentes de tener una sintaxis de lenguaje con diferentes beneficios y desventajas, pero muchas de ellas son simplemente convenciones arbitrarias que alguien decidió.