Estoy probando mi mano en Euler Problem 4 en Haskell. Pide el palíndromo más grande formado al multiplicar dos números de tres dígitos. El problema era bastante simple, y pensé que mi Haskell-fu estaba a la altura de la tarea, pero estoy obteniendo un resultado que parece inconsistente por decir lo menos.Problema de Euler en Haskell - ¿Alguien puede detectar mi error
Aquí es mi detector de palíndromo (que era la simplicidad misma de código):
isPalindrome :: String -> Bool
isPalindrome [] = True
isPalindrome str = let str2 = reverse str
in (str2 == str)
partir de aquí es una simple cuestión de escribir una función para detectar cuando un producto se forma un palíndromo (y posiblemente para restar uno de una de los multiplicandos y recurse sobre una búsqueda de fuerza bruta si no lo hace). Aquí está mi versión muy simplificada de este, simplificada y devolver una acción IO para la depuración:
findPal :: Integer -> Integer -> IO()
findPal 1 y = putStrLn "reached 1"
findPal x y = let pal = isPalindrome $ show mult
mult = x * y
in case pal of
true -> putStrLn $ "mult is " ++ (show mult)
false -> putStrLn "pal is false"
Aquí hay dos salidas separadas en GHCi:
*Main> isPalindrome $ show (999*999)
False
*Main> findPal 999 999
mult is 998001
En otras palabras, la llamada a isPalindrome es siempre evaluando a verdadero en la declaración de caso de findPal, incluso cuando debería ser falso.
¿Qué es lo que no estoy viendo aquí?
No se obtiene una "Advertencia: Coincidencia de patrón (es) están solapados"? – ephemient
Sí, lo hice. Simplemente no estaba completamente seguro de lo que significaba. En retrospectiva, es obvio. – rtperson