2009-11-18 11 views
8

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í?

+0

No se obtiene una "Advertencia: Coincidencia de patrón (es) están solapados"? – ephemient

+0

Sí, lo hice. Simplemente no estaba completamente seguro de lo que significaba. En retrospectiva, es obvio. – rtperson

Respuesta

13

Creo que es necesario capitalizar "Verdadero" y "Falso". No tengo un intérprete de Haskell conveniente, pero es probable que esté simplemente declarar una nueva variable "verdadero" para que sea igual a "PAL"

+0

Eso funcionó. ¡Gracias! (Sabía que era algo así como eso, pero guau, siento que mi cerebro simplemente encogió dos tamaños ...) – rtperson

+0

Solo lo sabía porque yo también lo había hecho. ;) –

6

Podría ser que en findPal, debe escribir True y False en lugar de true y false ?

EDIT: Ok, bien golpeado por la reserva anticipada aquí ...

Cuestiones relacionadas