2011-03-04 3 views
0

많은 소수를 포함하는 파일이 있습니다.하스켈에서 파일 내용을 사용하여 프라임 모듈을 작성하십시오.

나는 다음과 같은 기능을 가진 모듈을 작성하고 싶습니다 : 초기화가 파일을 읽고도 is_prime 목록이어야하며 소수를 초기화해야

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

. 내 문제는 어떻게 작성해야합니까? IO 모나드를 "숨기"위한 방법이 없습니까?

더 일반적으로 저는 OO 프로그래머처럼 생각합니다. 이것을 처리하는 좋은 기능적 방법은 무엇입니까?

답변

4

IO 모나드를 '숨기는'방법은 순수 함수로 isPrime (및 소수의 목록을 사용하는 다른 모든 함수)을 작성하고 필요에 따라 IO를 늦게 도입하는 것입니다. 사전 생성 된 소수의 목록을 사용하고 파일에서이를 읽는 것은 소수 만 다루는 일반 함수와는 관련이없는 구현 세부 사항입니다.

다음은 테스트 할 정수와 소수의 목록을 취하는 순수한 isPrime의 간단한 구현입니다. 소수의리스트가 어디에서 왔는지 상관하지 않는다. 단지 정수리스트이다.

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

이제 디스크에서 소수를 읽는 기능을 소개합시다. 반환 유형은 IO 모나드에 있어야합니다. 왜냐하면, 우리는 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 
0

정확하게 소수의 파일로 시작하는 이유는 무엇입니까? 파일을 읽는 IO 시간은 아마 처음부터 소수를 생성하는 것보다 느립니다.

(afaik) 모든 소수의 목록을 생성하는 가장 효율적인 방법은 Data.Numbers.Primes을 참조하십시오.

+0

나는 프라임 속도가 빠르다는 것을 알고 있습니다. 그러나 나는 또한 생성하기가 더 어려운 일반적인 경우를 위해 interrested했다. 많은 암호화 알고리즘에 사용되는 테이블에 대해 생각합니다. 나는 하스켈을 배우고 있고 모듈 안에 모나드를 숨길 수 있는지 정말로 알지 못했다. – yogsototh

관련 문제