¿Cuáles son las mayores diferencias entre F # y Scala?

59

F # y Scala son lenguajes de programación funcional que no obligan al desarrollador a usar solo tipos de datos inmutables. Ambos tienen soporte para objetos, pueden usar bibliotecas escritas en otros idiomas y ejecutarse en una máquina virtual. Ambos idiomas parecen estar basados ​​en ML.

¿Cuáles son las mayores diferencias entre F # y Scala a pesar de que F # está diseñado para .NET y Scala para la plataforma Java?

Jonas
fuente
2
Si puede votar y cree que esta es una pregunta útil o tiene respuestas útiles a continuación, vote por favor. Los sitios de StackExchange necesitan votos para construir una buena comunidad. Puedes dar 30 votos por día, no los desperdicies. Especialmente usuarios con alta reputación y votos de bajo conteo dados, lean esto: meta.programmers.stackexchange.com/questions/393/…
Maniero
functional programming langugages that don't force the developer to only use immutable datatypes- ¿Hay alguna, excepto tal vez idiomas de juguete?
Ingo
1
@Ingo, si crees que ML y Ocaml no califican como lenguajes de programación funcionales porque permiten la mutabilidad, ¡tal vez deberías ajustar tu definición!
Frank Shearar
3
+ Frank, debes haber entendido mal: quiero decir, incluso Haskell tiene tipos de datos mutables. Por lo tanto, todavía me gustaría saber qué idiomas tiene en mente @Jonas que obligarían a uno a usar solo tipos de datos inmutables.
Ingo

Respuestas:

61

Grandes diferencias:

  • Tanto Scala como F # combinan programación imperativa OO y programación funcional en un solo idioma. Sin embargo, su enfoque hacia la unificación de paradigmas es muy diferente. Scala intenta fusionar los dos paradigmas en uno (lo llamamos paradigma funcional de objeto), mientras que F # proporciona los dos paradigmas uno al lado del otro. Por ejemplo, los tipos de datos algebraicos en F # son construcciones puramente funcionales sin OO en ellas, mientras que los ADT en Scala siguen siendo clases y objetos regulares. (Nota: en el proceso de compilación del código de bytes CLR, incluso los ADT de F # se convierten en clases y objetos, pero no son visibles para el programador de F # en el nivel de origen).

  • F # tiene una inferencia de tipo de estilo Hindley-Milner completa. Scala tiene inferencia de tipo parcial. El soporte para subtipar y pure-OO-ness hace que la inferencia de tipo de estilo Hindley-Milner sea imposible para Scala.

  • Scala es un lenguaje mucho más minimalista que F #. Scala tiene un conjunto ortogonal muy pequeño de construcciones que se reutilizan en todo el lenguaje. F # parece introducir una nueva sintaxis para cada pequeña cosa, convirtiéndose en una sintaxis muy pesada en comparación con Scala. (Scala tiene 40 palabras clave, mientras que F # tiene 97. Eso debería decirle algo. :-)

  • F # siendo un lenguaje de Microsoft tiene un excelente soporte IDE en forma de Visual Studio. Las cosas no son tan buenas en el lado de Scala. El complemento Eclipse todavía no está a la altura. Lo mismo ocurre con el complemento NetBeans. IDEA parece ser su mejor apuesta en este momento, aunque ni siquiera se acerca a lo que obtiene con IDE de Java. (Para los fanáticos de Emacs, existe ENSIME. He escuchado muchas cosas buenas sobre este paquete, pero aún no lo he probado).

  • Scala tiene un sistema de tipos mucho más poderoso (y complejo) que F #.


Otras diferencias:

  • Las funciones F # se curry por defecto. En Scala, el curry está disponible pero no se usa con mucha frecuencia.

  • La sintaxis de Scala es una mezcla de Java, Standard ML, Haskell, Erlang y muchos otros idiomas. La sintaxis de F # está inspirada en las de OCaml, C # y Haskell.

  • Scala admite tipos y clases de tipos superiores. F # no lo hace.

  • Scala es mucho más susceptible a DSL que F #.


PD: Me encantan Scala y F #, y espero que se conviertan en los idiomas predominantes de sus respectivas plataformas en el futuro. :-)

missingfaktor
fuente
66
Esta respuesta perpetúa varios conceptos erróneos. Enumeraré cada uno por turno. Dijiste que "los tipos de datos algebraicos en F # son construcciones puramente funcionales sin OO'ness en ellos", pero los tipos de datos algebraicos en F # son solo de clase y, en particular, admiten el aumento con instancias OO / miembros estáticos y propiedades.
Jon Harrop
77
Usted dice "Scala intenta fusionar los dos paradigmas en uno (lo llamamos paradigma funcional de objeto)", pero Scala carece de la eliminación general de llamadas de cola y, en consecuencia, de cualquier código funcional no trivial (incluyendo casi todos los modismos funcionales convencionales como el paso de continuación estilo y desatar el nudo recursivo) son propensos a desbordamientos de pila en Scala y, por lo tanto, son prácticamente inútiles.
Jon Harrop
44
@ JonHarrop: Scala no trata los ADT especialmente. Son tratados como las clases regulares. Por lo tanto, Some(2)en Scala tiene tipo Some[Int]y no Option[Int]es IMO indeseable. F #, por otro lado, tiene una sintaxis y un tratamiento especiales para los TDA y, por lo tanto, puede inferir correctamente el tipo de Some 2as int option. Entonces, la codificación F # de ADTs es mejor que la de Scala (IMO, por supuesto). No traté de dar a entender que es inferior, y lamento que haya sido así.
missingfaktor
99
@ JonHarrop: La falta de TCO en JVM no ha molestado a muchos desarrolladores de Scala. Confía en mí, no es un problema tan grande como parece pensar. La mayoría de las veces, estamos utilizando funciones de orden superior, en lugar de recurrencia explícita. Y la mayoría de las funciones de orden superior en Scala se implementan en términos de bucles, y no recurrencia. Entonces, la falta de TCO se vuelve casi irrelevante.
missingfaktor
8
Siento que toda esta respuesta está un poco sesgada hacia Scala. Por ejemplo, Scala es un lenguaje mucho más minimalista que F # que parece ir en contra de su argumento / punto posterior de un sistema de tipos más complejo.
Adam Gent
9
  • F # se establece en aspectos funcionales, mientras que scala se basa en aspectos orientados a objetos.
  • F # tiene una mejor compatibilidad con IDE con Visual Studio, mientras que el complemento de eclipse de Scala es para IDE de código abierto y relativamente más lento.
  • F #, siendo más parecido a ML que Scala, tiene más de un cálculo lambda mínimo, como lo hacen OCaml, Standard ML y Scheme. F # parece ser un lenguaje considerablemente más simple.
Ayush Goyal
fuente
44
"F # parece ser un lenguaje considerablemente más simple". << No, no lo es. Es mucho más grande que Scala. Debería escribir un artículo sobre este tema en algún momento.
missingfaktor
44
"Scala se basa en aspectos orientados a objetos". << Incorrecto. Scala intenta fusionar la programación funcional y OOP. Yo personalmente rara vez uso sus funciones orientadas a objetos. La mayor parte de lo que hacemos es puramente funcional.
missingfaktor
@missingfaktor: "Es mucho más grande que Scala". ¿Qué tan grandes son las gramáticas?
Jon Harrop el
1
No sé si las cosas han cambiado. Scala en rocas IntelliJ, con el complemento todavía de código abierto.
Colliot
0

Un punto pequeño pero importante es la licencia: Scala es BSD (más o menos la licencia de software libre más permisiva que existe), F # solía ser "Acuerdo de licencia de fuente compartida de Microsoft Research", pero es un producto comercial hoy en día (según @Lorenzo a continuación, aunque no pude encontrar acuerdos de licencia más específicos en ningún lado).

Joonas Pulakka
fuente
3
En realidad, F # ahora es de código abierto y Scala ahora es un producto comercial de la compañía Scala Solutions de Martin Odersky.
Jon Harrop
44
@ Jon Harrop: Creo que Scala Solutions está vendiendo solo herramientas, servicios, capacitación, etc. relacionados con Scala. El lenguaje en sí parece estar bajo la licencia BSD.
Joonas Pulakka
2
@Joonas: Exactamente, lo mismo es cierto de F #.
Jon Harrop
55
@ JonHarrop: Scala sigue siendo de código abierto. Por favor no difunda información errónea.
missingfaktor
2
@missingfaktor: No dije que Scala fuera de código cerrado.
Jon Harrop