IO
모나드의 목적은 부작용을 처리하는 것입니다. '내부'데이터를 사용하는 경우 IO
모나드 내의 순수 함수를 호출해야합니다. IO
.
IO
모나드 내에서 순수한 함수를 호출해야합니다.
doSomethingWithHashTable :: HashTable key val -> key -> Maybe val
-- this is the pure function that you sequence within the `IO` monad
main :: IO()
main = do
...
hashtable <- new (==) hashInt
hashtable' <- return $ doSomethingWithHashtable hashtable
...
편집으로는 의견에 모든 hashtable
기능이 불순하다 지적했다. 이 경우
doSomethingWithHashTable :: HashTable key val -> IO Bool
doSomethingwithHashtable ht = do
insert ht 1
r <- lookup ht 1
case r of
Just _ -> return True
NOhting -> return False
main = do
...
hashtable <- new (==) hashInt
result <- doSomethingWithHashTable hashtable
...
'IO'에서 해시 테이블을 가져 오는 것은 쉽습니다. 'new (==) hashInt >> = \ hashtable -> 여기 있습니다 .' 물론 'IO'로 돌아 가지 않으면 실제로 아무것도 할 수 없습니다. 그러나 좋은 이유가 있습니다. 해시 테이블은 불완전한 데이터 구조입니다. '입출력 '을 원하지 않니? 음, 불결한 데이터 구조를 사용하지 마십시오. 'Data.Map'이 있습니다. – delnan
진짜 질문은 : ST 인터페이스가 있습니까? – fuz
delnan 고맙습니다, 귀하의 의견은 나를 더 잘 이해하는 데 도움이되었습니다 :) – Adi