2012-10-17 3 views
2

나는 파일의 내용을 얻고 형식의리스트로 변환하고 있습니다 : ReadFile을, 선, 단어IO 목록에서 조회 사용 하시겠습니까?

[("abc", 123), ("def", 456)] 

.

지금 당장 결과 목록을 IO [(String, Int)]으로 변환 할 수 있습니다.

check x = lookup x theMap 

내가 해결하는 방법을 너무 잘 모르겠어요이 오류를 얻을 :

Couldn't match expected type `[(a0, b0)]' 
      with actual type `IO [(String, Int)]' 
In the second argument of `lookup', namely `theMap' 

theMap이를 나는이 같은 함수를 만들려고 할 때

내 문제는, 기본적으로이 :

getLines :: String -> IO [String] 
getLines = liftM lines . readFile 

tuplify [x,y] = (x, read y :: Int) 

theMap = do 
    list <- getLines "./test.txt" 
    let l = map tuplify (map words list) 
    return l 

그리고 파일의 내용은 다음과 같습니다

abc 123 
def 456 

누구나 내가 뭘 잘못하고 있는지 설명하고 나에게 더 나은 해결책을 보여줄 수 있습니까? 나는 방금 몇 시간 전에 모나드를 가지고 놀기 시작했고 길을 따라 약간의 충돌을 겪고 있습니다.

감사

답변

4
당신은 IO에서 theMap "을 풀다"할 것이다

. 그래서 당신은 할 수

do 
    list <- getlines 
    [...] 
    return (some computation on list) 

: 당신은 이미 의해 getLines이를하고있는 방법에 주목

check x = do 
    m <- theMap 
    return . lookup x $ m 

하는이, 사실, 안티 패턴 (예시 일이기는하지만) 그리고 당신이 될 것입니다 functor 인스턴스를 사용하는 것이 더 좋습니다. check x = fmap (lookup x) theMap

+0

감사! 나는 이것을 알아야했다 :( – noko

관련 문제