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