2012-06-30 19 views
6

Aşağıdaki kod bir sözcük kitaplığı programıdır. Bir önek, sonek ve bazı harflerle eşleşen sözcüklerin bir listesini aramanızı sağlar. Sorum şu: altta listeyi kullanmak yerine, kelimeleri içeren harici bir metin dosyası kullanmak ve listeye yüklemek istiyorum. Bunu yapmayı nasıl yaparım?Haskell harici txt dosyasını listeye yükle

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

Kodunuzla ilgili iki kısa ipucu: 1. Haskell işlev uygulamasında infix operatörlerinden daha güçlü bir öncelik vardır. Yani, 'length strippedWord == count strippedWord square' gibi bir ifade '(length strippedWord) == (strippedWord square)' e eşdeğerdir. 2. 'check' fonksiyonunda fonksiyonun sonucu eşitlik kontrolünün değeridir. Bu nedenle, korumayı (dikey çubukları olan kısmı) eşitlik kontrolüyle değiştirebilirsiniz. –

+0

Bu satırı sadece bu satır ile değiştirebilirim "length strippedWord == count strippedWord square = True"? – tutu

+1

Kusura bakmadığı için özür dilerim: 'önek sonekini onayla 'kare = uzunluk strippedWord == count strippedWord square' komutunu kullanabilirsiniz. Yani, 'check' uygulamasının sonucu '==' uygulamasının sonucudur. –

cevap

5

Çok basit, (kelimeleri satır sonları daha boşluk, başka formu ayrılmış veya words) lines fonksiyonu yardımıyla: Ayrıca

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

, muhtemelen gerekecek Daha önce yapmadıysanız, IO'da Haskell'de ('gode' io haskell tutorial ') tavsiye ederim. Ayrıca programınıza etkileşimi tanıtmak için ona ihtiyacınız olacak.

+0

'words' herhangi bir boşluk için kullanışlıdır, 'lines' temelde daha dar split parametresi olan bir sözcük biçimidir. Örneğin: "merhaba \ n \ n \ n \ n \ n \ n \ n \ n \ n \ n \" merhaba "," nasıl "," vardır "," sen "]'. –

+0

Siz haklısınız. Cevabı biraz daha spesifik hale getireceğim. – AardvarkSoup

+0

@AardvarkSoup Bunu işe alamıyorum. '' Yolunu 'textfile' 'dictionary.txt' 'adıyla değiştirdim mi? Ayrıca bu kod parçasını nereye koyayım, 'where' ve' checkw = [x | x <- test '? – tutu

İlgili konular