2012-06-30 23 views
6

Hola el siguiente código es un programa de intercambio de palabras. Le permite buscar a través de una lista de palabras que coincidan con un prefijo, sufijo y algunas letras. Mi pregunta es, en lugar de usar la lista en la parte inferior, quiero usar un archivo de texto externo que contenga las palabras y cargarlo en la lista. ¿Cómo voy a hacer esto?Haskell carga el archivo de texto externo en la lista

count :: String -> String -> Int 
count _[] = 0 
count [] _ = 0 
count (x:xs) square 
    |x `elem` square = 1 + count xs (delete x square) 
    |otherwise = count xs square 

check :: String -> String -> String -> String -> Bool 
check prefix suffix word square 
    | (length strippedWord) == (count strippedWord square) = True 
    | otherwise = False 
    where 
     strippedWord = drop (length prefix) (take ((length word) - (length suffix)) word) 


wordfeud :: String -> String -> String -> [String] 
wordfeud a b c = test1 
    where 
    test =["horse","chair","chairman","bag","house","mouse","dirt","sport"] 

    test1 = [x| x <- test, a `isPrefixOf` x, b `isSuffixOf` x, check a b x c] 
+0

Dos consejos cortos con respecto a su código: 1. En la aplicación de función Haskell tiene una precedencia más fuerte que los operadores de infijo. Es decir, una expresión como 'longitud strippedWord == count strippedWord square' es equivalente a' (length strippedWord) == (count strippedWord square) '. 2. En la función 'check' el resultado de la función es el valor de la verificación de igualdad. Por lo tanto, puede reemplazar el protector (la parte con las barras verticales) por el control de igualdad. –

+0

¿Quiere decir que puedo reemplazar el protector con solo esta línea "length strippedWord == count strippedWord square = True"? – tutu

+1

Disculpe por no ser exacto. Quise decir que puede usar 'verifique prefijo sufijo palabra cuadrado = longitud strippedWord == count strippedWord square'. Es decir, el resultado de una aplicación de 'check' es el resultado de la aplicación de' == '. –

Respuesta

5

muy sencilla, con ayuda de la función lines (o words, cuando las palabras están separadas por algún otro tipo de espacios en blanco de los saltos de línea):

-- Loads words from a text file into a list. 
getWords :: FilePath -> IO [String] 
getWords path = do contents <- readFile path 
        return (lines contents) 

Por otra parte, es probable que tenga a lee en IO en Haskell (recomiendo googlear 'io haskell tutorial'), si aún no lo has hecho. También lo necesitará para introducir interactividad en su programa.

+0

'words' es útil para cualquier espacio en blanco,' lines' es básicamente una forma de palabras con un parámetro de división más estrecho. Por ejemplo: 'words 'hi \ n cómo \ n are \ n you" -> ["hi", "cómo", "son", "usted"] '. –

+0

Tiene razón. Haré que la respuesta sea un poco más específica. – AardvarkSoup

+0

@AardvarkSoup No puedo hacer que esto funcione. ¿Acabo de reemplazar la 'ruta' con el nombre de mi archivo de texto' "dictionary.txt" '? También dónde coloco este fragmento de código, entre 'where' y' checkw = [x | x <- prueba'? – tutu

Cuestiones relacionadas