Написать простой модуль, используя содержимое файла в Haskell - PullRequest
0 голосов
/ 04 марта 2011

У меня есть файл, содержащий много простых чисел.

Я хотел бы написать модуль со следующими функциями:

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

, где init должен read файл и инициализировать простые числа, которые должны быть списком, а также is_prime.Моя проблема в том, как мне это написать?Разве нет способа «спрятать» монаду ввода-вывода?

В более общем смысле я считаю себя программистом ОО.Каков хороший функциональный способ справиться с этим?

Ответы [ 2 ]

4 голосов
/ 04 марта 2011

Чтобы «спрятать» монаду ввода-вывода, нужно написать isPrime (и любые другие функции, использующие список простых чисел) как чистую функцию и вводить ввод-вывод только настолько поздно, насколько это возможно.Тот факт, что вы используете список предварительно сгенерированных простых чисел и считывает их из файла, - это просто деталь реализации, которая не имеет отношения к общим функциям, работающим с простыми числами.

Вот простая реализация чистого isPrimeдля проверки требуется целое число и список простых чисел.Обратите внимание, что не имеет значения, откуда появился список простых чисел, просто это список целых чисел.

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

Теперь давайте представим функцию, которая будет считывать простые числа с диска.Тип возвращаемого значения должен быть в монаде ввода / вывода, потому что мы выполняем ввод / вывод.

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

Теперь мы можем использовать эту функцию в сочетании с нашей функцией isPrime.Как только мы начинаем использовать readPrimesFromFile, мы навсегда «попадаем» в монаду ввода-вывода.

main :: IO ()
main = do
    primeList <- readPrimesFromFile "primes.txt"
    let result = isPrime 123 primeList
    print result
0 голосов
/ 05 марта 2011

Почему именно вы начинаете с файла простых чисел?Время ввода-вывода для чтения файла, вероятно, медленнее, чем просто генерация простых чисел с нуля.

См. Data.Numbers.Primes для (afaik) наиболее эффективного способа создания списка всехпростые числа.

...