2011-03-04 18 views
0

我有一個包含許多素數的文件。使用Haskell中的文件內容編寫主模塊

我想編寫具有以下功能模塊:

module Primes as 
(init, 
    primes, 
    is_prime) 
where ... 

其中的init應該文件和初始化這應該是一個清單,並is_prime素數。 我的問題是,我應該怎麼寫呢?沒有辦法「隱藏」IO monad嗎?

更一般地說,我認爲我想像一個OO程序員。處理這個問題的好方法是什麼?

回答

4

「隱藏」IO monad的方法是將isPrime(和任何其他使用素數列表的函數)寫爲純函數,並且只在需要時才引入IO。事實上,您正在使用預生成素數列表並從文件中讀取它們,這只是一個與處理素數的常規函數​​無關的實現細節。

下面是一個純粹的isPrime的簡單實現,它需要一個整數來測試和一列素數。請注意,它並不關心素數列表來自哪裏,只是它是一個整數列表。

isPrime :: Integer -> [Integer] -> Bool 
isPrime n ps = n `elem` ps 

現在我們來介紹一個函數,它將從磁盤讀取素數。它的返回類型必須在IO monad中,因爲我們正在執行I/O。

readPrimesFromFile :: String -> IO [Integer] 
readPrimesFromFile filename = ... 

現在我們可以結合我們的isPrime函數使用這個函數。一旦我們開始使用readPrimesFromFile,我們將永遠「陷入」IO monad。

main :: IO() 
main = do 
    primeList <- readPrimesFromFile "primes.txt" 
    let result = isPrime 123 primeList 
    print result 
0

爲什麼你從一個素數文件開始?讀取文件的IO時間可能比從頭開始生成素數要慢。

請參閱Data.Numbers.Primes(afaik)生成所有素數列表的最有效方法。

+0

我知道素數可能更快。但是我也對一般難以產生的情況感興趣。我想到許多密碼算法中使用的表格。我正在學習Haskell,真的不知道是否有可能將monad隱藏在模塊中。 – yogsototh 2011-03-06 07:55:10

相關問題