Tengo curiosidad por las diferencias entre la inferencia tipo de Scala y C++ 11. ¿En qué situaciones tengo que especificar los tipos en un idioma pero no en el otro? Una diferencia parece ser el tipo de retorno de funciones que siempre debe especificarse en C++ 11, aunque decltype
y la nueva sintaxis de función con un tipo de retorno posterior permiten especificar un tipo inferido.¿Cuáles son las diferencias entre la inferencia tipo de Scala y C++ 11?
Respuesta
C++ no puede deducir dichas funciones anónimas:
// this wont work*
void somefunc(std::vector<int>& v)
{
std::for_each(v.begin(), v.end(), [](auto &x) { x++; });
}
// /\
// ------ I want this to be infered
mientras que Scala puede:
def somefunc(v: Vector[Int]) = v.map(x => x +1)
* no estoy seguro de que he tratado correctamente con sintaxis de C++ Code, no insultar idioma , pero es realmente críptico. Si cometí un error, corrígeme, por favor
En esencia, la inferencia en C++ es simplista en comparación con los adultos.
Lenguajes funcionales generalmente algo cerca de Hindley/Milner que está muy cerca de resolver un sistema de ecuaciones y permite tener incógnitas en ambos lados de la guía.
Por el contrario, C++ esperan a ser capaz de saber el tipo de cualquier interior expresión y de que deducir el tipo de la expresión externa. Es un estrictamente una forma de inferencia, lo que significa que:
auto x = foo(1, 2);
funciona como se espera, siempre y cuando hay un foo
aceptar enteros y devolviendo no nula. Sin embargo, como se demuestra por om-nom-nom:
foo(1, [](auto x) { ++x; });
no va a funcionar, porque no se puede ir hacia atrás y utilice el tipo de foo
pretendida para deducir el tipo de la lambda.
La razón detrás de esto es que C++ usa sobrecargas de funciones, lo que significa que podrían existir varias definiciones de foo
, y usted realmente necesita saber los tipos de argumentos para elegir la correcta. Dado que, en general, la expresión anterior sería indecidible, está prohibido incluso en casos limitados, se podría haber evitado el futuro mantenimiento infierno y la gente nunca sabe cuándo o no se puede utilizar.
Con el fin de contrastar C++ 11 y Scala: Scala también sobrecarga el método (y tampoco usa Hindley-Milner). – Debilski
@Debilski: Ah, interesante. Pensé que Scala estaba más cerca de Haskell. Supongo que eso es lo que obtengo de la lectura superficial. Gracias por llamarlo. –
@MatthieuM. Scala tiene subtipado, lo que hace que su sistema de tipos sea más poderoso, pero en consecuencia hace que sus habilidades de inferencia sean más débiles. (Haskell no tiene subtipado, a menos que cuente las restricciones de superclase en las clases de tipos) –
- 1. ¿Cuáles son las diferencias entre -std = C++ 11 y -std = gnu ++ 11?
- 2. ¿Cuáles son las diferencias clave entre Scala y Groovy?
- 3. ¿Cuáles son las diferencias entre $ {} y # {}?
- 4. ¿Cuáles son las diferencias entre las definiciones de parámetros como (tipo y nombre) y (tipo * nombre)?
- 5. ¿Cuáles son las diferencias entre Int e Integer en Scala?
- 6. ¿Cuáles son las diferencias entre C# .net y Visual Basic.net?
- 7. ¿Cuáles son las diferencias entre la lechuga y la pictografía?
- 8. ¿Cuáles son las diferencias de uso entre size_t y off_t?
- 9. Go-Scala-Go! ¿Cuáles son las principales diferencias?
- 10. ¿Cuáles son las diferencias entre JSON y JSONP?
- 11. ¿Cuáles son las diferencias entre un compilador y un enlazador?
- 12. ¿Cuáles son las diferencias entre osql, isql y sqlcmd?
- 13. ¿Cuáles son las diferencias entre struct_time y datetime?
- 14. ¿Cuáles son las diferencias entre JSP, PHP, HTML5 y javascript?
- 15. ¿Cuáles son las principales diferencias entre fwrite y write?
- 16. ¿Cuáles son las diferencias entre g ++ versión 4.0.0.8 y 4.3.2?
- 17. ¿Cuáles son las diferencias y similitudes de los sistemas de tipo Scala y Haskell?
- 18. ¿Cuáles son las principales diferencias entre Cocoa y CocoaTouch?
- 19. ¿Cuáles son las diferencias y similitudes entre MVC y MVVM?
- 20. ¿Cuáles son las diferencias entre Vanilla Perl y Strawberry Perl?
- 21. ¿Cuáles son las diferencias reales entre Zend Framework y Django?
- 22. ¿Cuáles son las diferencias entre PEG y CFG?
- 23. ¿Cuáles son las diferencias entre AssemblyVersion, AssemblyFileVersion y AssemblyInformationalVersion?
- 24. ¿Cuáles son las diferencias entre Doctrine1 y Doctrine2?
- 25. ¿Cuáles son las diferencias entre LinFu.DynamicProxy y Castle.DynamicProxy?
- 26. ¿Cuáles son las diferencias entre Flash Professional y Flash Builder?
- 27. ¿Cuáles son las diferencias entre XmlSerializer y BinaryFormatter?
- 28. ¿Cuáles son las diferencias entre PHP y Java?
- 29. ¿Cuáles son las diferencias entre JSP y Facelets?
- 30. ¿Cuáles son las diferencias entre un UIView y un CALayer?
Estás comparando una llamada a un método en un vector con una función. Un método Scala equivalente debería verse como 'map (v, x => x + 1)' (con un método apropiado de 'mapa'). En este caso, la inferencia de Scala falla también. Sin embargo, esto funcionará: 'map (v) (x => x + 1)'. – Debilski
@Debilski también, si hablamos de comparación exacta: la versión de Scala crea una nueva colección (y acepta el vector por valor), mientras que la versión de C++ actualiza el vector en su lugar. –
Pero el punto aquí son las diferencias en la inferencia de tipo, no cómo funcionan las colecciones. Creo que es perfectamente posible contrastar la inferencia de tipo, es solo su ejemplo el que da una impresión equivocada. – Debilski