¿Es mejor enseñar estructuras de datos en lenguajes tipados estáticamente o tipados dinámicamente?

En mi opinión, las estructuras de datos (y los algoritmos, en general) son ortogonales a si un lenguaje de programación está estático / dinámico o fuertemente / débilmente tipado.

Uno puede implementar (y enseñar) intentos o B-trees usando Java o C / C ++ (tanto estática y fuertemente tipado) o Ruby (fuertemente, pero tipado dinámicamente) o Javascript (tipeado de forma dinámica y débil).

Dicho esto, y siendo un viejo pedo, si tuviera que enseñar estructuras de datos fundamentales (árboles, listas, etc.) usaría C. No por el sistema de tipos, sino principalmente por los punteros (y la aritmética de punteros) y la falta de gestión de memoria / recolección de basura.

En la opinión de mi viejo pedo, obligar a los programadores a administrar conscientemente la memoria ellos mismos les dará una visión más clara de las compensaciones de complejidad de tiempo y espacio entre las estructuras de datos y algoritmos de la competencia.

Si estuviera enseñando estructuras de datos, definitivamente usaría un lenguaje basado en un sistema de tipo estático Hindley-Milner como Standard ML, OCaml, Haskell o F #.

Por ejemplo, aquí hay un árbol binario en ML donde un árbol es una hoja vacía o una rama con dos subárboles:

  tipo árbol =
  El |  Hoja
  El |  Rama de árbol * árbol

¡Realmente no hay nada mejor que eso!

Con lenguajes como Java, simplemente perderá a sus alumnos en jerarquías de clase superfluas. Con lenguajes dinámicos no existen tales definiciones de tipo para guiarlos (o el compilador).

Para comenzar, estoy seguro de que un lenguaje como Python o un esquema sin tipo enseña mucho: para comprender realmente cómo funciona en el metal, C ++ sería la opción óptima