versiones tipos existentes descargar datos caracteristicas c++ scala c++11 type-inference language-comparisons

tipos - ¿Cuáles son las diferencias entre el tipo de inferencia de Scala y C++ 11?



tipos de datos en c++ (2)

Tengo curiosidad por saber cuáles son las diferencias entre la inferencia de 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 las funciones, que siempre deben especificarse en C ++ 11, aunque la sintaxis de decltype y la nueva función con un tipo de retorno final permiten especificar un tipo inferido.


C ++ no puede inferir tales 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 haber manejado correctamente la sintaxis del código C ++, no insulto el lenguaje, pero es realmente críptico. Si me he equivocado, corrígeme, por favor.


En esencia, la inferencia de C ++ es simplista en comparación con los adultos.

Los lenguajes funcionales generalmente son algo parecido a Hindley / Milner, que está bastante cerca de resolver un sistema de ecuaciones y permite tener incógnitas en ambos lados de la cerca.

Por el contrario, C ++ espera poder saber el tipo de cualquier expresión interna y de ahí deducir el tipo de la expresión externa . Es una inferencia estrictamente de una manera, lo que significa que:

auto x = foo(1, 2);

funciona de la manera esperada siempre que exista un foo acepte enteros y devuelva non-void. Sin embargo, como lo demuestra om-nom-nom:

foo(1, [](auto x) { ++x; });

No funcionará, porque no puedes retroceder y usar el tipo de foo pretende para deducir el tipo de la lambda.

La razón detrás es que C ++ usa sobrecargas de funciones, lo que significa que podrían existir varias definiciones de foo , y que realmente necesita conocer los tipos de argumentos para elegir el correcto. Dado que, en general, la expresión anterior sería indecidible, está prohibida, incluso en casos limitados, se podría haber permitido evitar el infierno de mantenimiento futuro y las personas que nunca saben cuándo o no se puede usar.