Después de consultar con expertos en el tema, programadores de diversas áreas y profesores dimos con la solución a la pregunta y la dejamos plasmada en esta publicación.
Solución:
Es por un pequeño error en tu código. Tu tienes:
where (t, ti) = pmaxim xs (ti + 1)
… pero en realidad debería ser:
where (t, ti) = pmaxim xs (xi + 1)
Esto corrige su código, que ahora produce la solución correcta:
>>> maxim [1, 2, 3, 2, 1]
(3, 2)
Su código se colgó porque su cálculo para ti
da como resultado un ciclo sin fin ya que accidentalmente lo definiste en términos de sí mismo. Tenga en cuenta que ghc
es un compilador lo suficientemente inteligente y se da cuenta de que t
no depende del valor de ti
por lo que su versión aún podría calcular con éxito el valor máximo incluso si no puede calcular el índice.
La forma estándar de depurar cálculos puros es la Debug.Trace
módulo.
Como nota al margen, hay una solución mucho más simple:
import Data.List
import Data.Ord
maxi xs = maximumBy (comparing fst) (zip xs [0..])
Editar: Vaya, no vi que lo estabas implementando deliberadamente desde cero, pero lo dejaré ahí.
Sección de Reseñas y Valoraciones
Al final de todo puedes encontrar las observaciones de otros administradores, tú incluso tienes la habilidad dejar el tuyo si dominas el tema.