使用Haskell中的文件内容编写主模块
我有一个包含许多素数的文件 我想编写一个具有以下功能的模块:使用Haskell中的文件内容编写主模块,haskell,module,primes,Haskell,Module,Primes,我有一个包含许多素数的文件 我想编写一个具有以下功能的模块: module Primes as ( init, primes, is_prime) where ... 其中init应该读取文件并初始化素数,这些素数应该是一个列表,也是_素数。 我的问题是,我应该怎么写?难道没有办法“隐藏”IO单子吗 更一般地说,我认为我像一个OO程序员一样思考。处理这个问题的好方法是什么?隐藏IO单子的方法是将isPrime(以及使用素数列表的任何其他函数)作为纯函数编写,并且只在需要时才引入IO。使
module Primes as
( init,
primes,
is_prime)
where ...
其中init应该读取文件并初始化素数,这些素数应该是一个列表,也是_素数。
我的问题是,我应该怎么写?难道没有办法“隐藏”IO单子吗
更一般地说,我认为我像一个OO程序员一样思考。处理这个问题的好方法是什么?隐藏IO单子的方法是将
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单子中
main :: IO ()
main = do
primeList <- readPrimesFromFile "primes.txt"
let result = isPrime 123 primeList
print result
main::IO()
main=do
primeList隐藏IO单子的方法是将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单子中
main :: IO ()
main = do
primeList <- readPrimesFromFile "primes.txt"
let result = isPrime 123 primeList
print result
main::IO()
main=do
primeList为什么要从一个prime文件开始?读取文件的IO时间可能比从头开始生成素数要慢
有关生成所有素数列表的最有效方法,请参见(afaik)。为什么要从素数文件开始?读取文件的IO时间可能比从头开始生成素数要慢
查看(afaik)生成所有素数列表的最有效方法。我知道使用素数可能会更快。但我也被问到一般情况下,这是很难产生。我想到了许多加密算法中使用的表。我正在学习Haskell,真的不知道是否可以将monad隐藏在模块中。我知道prime可能会更快。但我也被问到一般情况下,这是很难产生。我想到了许多加密算法中使用的表。我正在学习Haskell,真的不知道是否可以将monad隐藏在模块中。