我有一個包含許多素數的文件。使用Haskell中的文件內容編寫主模塊
我想編寫具有以下功能模塊:
module Primes as
(init,
primes,
is_prime)
where ...
其中的init應該讀文件和初始化這應該是一個清單,並is_prime素數。 我的問題是,我應該怎麼寫呢?沒有辦法「隱藏」IO monad嗎?
更一般地說,我認爲我想像一個OO程序員。處理這個問題的好方法是什麼?
我有一個包含許多素數的文件。使用Haskell中的文件內容編寫主模塊
我想編寫具有以下功能模塊:
module Primes as
(init,
primes,
is_prime)
where ...
其中的init應該讀文件和初始化這應該是一個清單,並is_prime素數。 我的問題是,我應該怎麼寫呢?沒有辦法「隱藏」IO monad嗎?
更一般地說,我認爲我想像一個OO程序員。處理這個問題的好方法是什麼?
「隱藏」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
爲什麼你從一個素數文件開始?讀取文件的IO時間可能比從頭開始生成素數要慢。
請參閱Data.Numbers.Primes(afaik)生成所有素數列表的最有效方法。
我知道素數可能更快。但是我也對一般難以產生的情況感興趣。我想到許多密碼算法中使用的表格。我正在學習Haskell,真的不知道是否有可能將monad隱藏在模塊中。 – yogsototh 2011-03-06 07:55:10