2011-10-30 2 views
1

IO (HashTable key val) 값을 반환하는 new (==) hashInt을 사용하고 있습니다. 따라서 IO 모나드 내부에서만 조회/삽입을 할 수 있습니까?Haskell, 해시 테이블에서 값 가져 오기

순수 함수에서 사용하기 위해 HashTable에서 순수 데이터를 가져 오는 방법은 무엇입니까? 예를 들어. 나는 HashTable과 키를 매개 변수로 취하고 그 키에 의해 인덱싱 된 값을 반환해야하는 함수를 가지고있다 ...

나는 Hashtable에서 값을 가져올 수 없기 때문에 실제로 Hashtables로 작업하는 것을 둘러 본다. IO 모나드. 이것은 가능한가?

+0

'IO'에서 해시 테이블을 가져 오는 것은 쉽습니다. 'new (==) hashInt >> = \ hashtable -> 여기 있습니다 .' 물론 'IO'로 돌아 가지 않으면 실제로 아무것도 할 수 없습니다. 그러나 좋은 이유가 있습니다. 해시 테이블은 불완전한 데이터 구조입니다. '입출력 '을 원하지 않니? 음, 불결한 데이터 구조를 사용하지 마십시오. 'Data.Map'이 있습니다. – delnan

+0

진짜 질문은 : ST 인터페이스가 있습니까? – fuz

+0

delnan 고맙습니다, 귀하의 의견은 나를 더 잘 이해하는 데 도움이되었습니다 :) – Adi

답변

3

입니다 내가 할 수있는 단지 IO 모나드의 내부 조회/삽입합니까?

예 내가 이 IO 모나드에서 값을 얻을 수 없기 때문에 정말 해시 테이블 작업 주위에 비틀 거리고있어

. 이것은 가능한가?

순수 값은 불변이다. 이 Hashtable은 대부분의 해시 테이블과 마찬가지로 가변형 컨테이너입니다. 이것은 프로그램이 모든 명령의 실행 순서에주의를 기울여야 만 Hashtable을 사용할 수 있음을 의미합니다. 실행 순서를 제어 할 때 Haskell 언어는 코드 작성을위한 IO (또는 ST) 모나드 및 구문 설탕 ("do"표기법)을 제공합니다.

Hashtable에 대한 읽기 및 쓰기는 모두 실행 명령이며 순수 값 "let"바인딩 구문을 사용하지 않습니다. 따라서 HashTable에서 읽는 것은 일반적으로 vivian의 예에서와 같이 "do"표기법에서 "< -"을 사용하는 것으로 나타납니다.

참고 : Data.Map.Map을 사용하면 삽입 및 조회도 가능하지만 순수합니다.

+0

정말 좋은 설명 주셔서 감사합니다 :) – Adi

2

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 
    ... 
+1

let 대신에 <- return construction을 사용하는 이유는 무엇입니까? – hugomg

+0

또한'doSomethingWithHashTable'의 예를들 수 있습니까? 문서에서 'Hashtable'의 모든 연산은 'IO'결과를 얻은 것 같습니다.당신의 대답에 대한 일반적인 생각은 (모나드에서 물건을 가져 와서 순수한 작업을 수행 한 다음 다시 모나드에 넣습니다.)하지만이 질문은 특히 Hashtable에 관한 것입니다 ... – delnan

+0

인터페이스를 보면, 맞아. 특히 'HashTable'을 사용하면 모든 작업이 불완전합니다. – vivian

관련 문제