YAHT에서 또다른 문제 (page35)

Hakell의 Indentation문법 때문에 한동안 헤메었습니다.
indentation에 조금 익숙해져서 다시 예제들을 직접 쳐 나가다 보니 금방 다시 막힙니다.

35페이지의
askForWords = do
putStrLn "Please enter a word: "
word <- getLine
if word == ""
then return []
else return (word : askForWords)
를 ask01.hs로 저장하고 :l ask1.hs로 불러들이니

ask1.hs:6:24:
Couldn't match expected type '[]' against inferred type 'IO'
Expected type: [String]
Inferred type: IO [a]
In the second argument of '(:)', namely 'askForWords'
In the expression: word : askForWords
Failed, modules loaded: none.
이라는 에러가 납니다.

ask1.hs 머리에 module Main where; import IO를 기록해도 같은 에러가 납니다.(삽질하고 있습니다...)
뭔가 타입이 맞지 않는다고 하는 것 같은데 데이터 타입을 따로 지정해 주어야 하나요?

댓글 보기 옵션

원하시는 댓글 전시 방법을 선택한 다음 "설정 저장"을 누르셔서 적용하십시오.

:의 자료형은 a -> [a]

:의 자료형은 a -> [a] -> [a] 이죠. 그래서 word가 String이니까 a의 자리에는 String이 다 들어가야 합니다. 따라서 두 번째 매개변수는 [a] 즉 [String]이어야 합니다. 그런데 askForWords의 반환형이 IO [String]이라서 자료형이 맞지 않습니다. 에러 메시지는 그런 뜻입니다. 예제 위에 설명에 나와 있듯이 이것은 '잘못된' 사용법이니다. 올바른 사용법은 그 아래에 나와 있는 예제처럼 rest <- askForWords; return (word:rest) 라고 해줘야 합니다.

그렇군요. 감사합니다~ m(_ _)m

감사합니다.