使用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隐藏在模块中。