2014-07-19 3 views
0

이전에 비슷한 질문, 나는 다음과 같은 코드에 도달의 내가 새로 하스켈을 배우고 도움으로 오전을 사용하여,하지만 난 오류가 무엇입니까 -문자열을 승인하고 제거 중복 문자를 하스켈

Couldn't match type ' [ ] ' with ' IO '. 
Expected type - IO Char 
Actual type - [Char] 

을 여기
import Data.Set 

removeDups :: Ord a => [a] -> Set a -> [a] 
removeDups [] sofar = [] 
removeDups (x:rest) sofar 
    | member x sofar = (removeDups rest sofar) 
    | otherwise  = x:(removeDups rest (insert x sofar)) 
main = do 
    name <- getLine 
    removeDups name empty 

답변

5

문제는 removeDups이 유형 [a]을 반환하지만, 당신이 do 블록 내에서 호출하는 기능이있는 경우는 그 do 블록의 모나드 유형과 일치해야합니다. 이 경우 main 안에 호출해야하는데, 컴파일러는 removeDupsIO a과 같은 반환 유형을 가질 것으로 예상하지만 실제로는 반환 유형 Ord a => [a]을 기대합니다. 대신 반환 형식 IO()을 가지고

main = do 
    name <- getLine 
    let unique = removeDups name empty 
    print unique 

print 때문에 같은 일을 할 수 있습니다.