2012-04-11 6 views
2

총 하스 멍청한 놈. 나는 간단한 기능과 메인을 가지고있다. 코드를 컴파일 할 때예상 유형 및 기본

Couldn't match expected type `IO t0' with actual type `Bool' 
In the expression: main 
When checking the type of the function `main' 

:

is_instructor :: String -> Bool 
is_instructor "Jeremy Erickson" = True 
is_instructor x = False 

main :: Bool 
main = is_instructor "foo" 

답변

4

main 프로그램을 실행할 때 호출되는 것입니다. 프로그램이 어떤 식 으로든 외부 세계와 상호 작용할 것으로 예상되므로 (입력 값, 출력물 등을 읽음), mainIO something이어야합니다. Haskell에서 유형 안전성과 단순성을 이유로, main은 Java에서 public static void main(String[] arrgh)이어야합니다.

당신은 아마 당신이 인쇄 할 가치 싶어서

main :: IO() 
main = print $ is_instructor "foo" 

당신이 원하는 것입니다.

+0

위대한 작품입니다. 고맙습니다. 그래서 main 메소드에 시그니처를 넣고 싶다면 "main :: IO Bool"이 될까요? –

+0

아니요, 인쇄 중이므로'Main :: IO()'가됩니다. 인쇄는 흥미로운 것을 만들어 내지 않으므로'print :: Show a => a -> IO()'. –

+0

죄송합니다. 여전히 혼란 스럽습니다. Main :: IO() 시그니처를 사용할 때 "잘못된 형식 시그니처 : Main :: IO()가 발생합니다. 형식이 :: 이어야합니다".또한 print :: Show a => a -> IO()를 사용하면 첨부 된 인쇄 바인딩을 정의해야합니까? –

2

당신은 유형 Boolmain 기능을 가질 수 없습니다를, 그것은 항상에 있어야이 오류가 무엇을 의미하는지 어떤 생각을 가지고 있지 않습니다 IO 모나드. 당신이 원했던 것은 같은 것이고이 부울 값입니다. 그럼 그냥 해!

main :: IO() 
main = print $ is_instructor "foo" 
+0

그래서'main :: IO Bool, main = return (is_instructor "foo")'가 될 것입니다. –

+0

@ NiklasB. 아니! main 함수는 어떤 값도 직접 반환 할 수 없으며 환경과 상호 작용하려면'IO' 모나드를 사용해야합니다. – leftaroundabout

+0

나는 그 코멘트를 게시하는 동안 자고 있었음에 틀림 없다. 물론 I/O Bool을 의미했지만, 함수 자체는 Haskell과 마찬가지로 유효하지 않습니다./물론 출력이 없기 때문에 이해가되지 않지만 OP의 직접적인 번역입니다. 예 : –

2

하스켈은 순전히 기능적인 언어라고 들었을 것입니다. 이것은 (다른 것들 중에서도) 함수가 하스켈에서 할 수있는 유일한 것은 인자에 의존하는 결과를 계산한다는 것입니다; 함수는 I/O를 수행 할 수 없거나 인수 값 이외의 다른 결과에 의존하는 결과를 가져올 수 없습니다.

하지만 하스켈에서는 I/O 및 기타 효과적인 일을하는 프로그램을 작성할 수 있습니다. 이것이 어떻게 가능한지? 글쎄, 하스켈에서 I/O 나 부작용을하는 것은 함수가 아니라는 것을 의미합니다. 그들은 다른 것입니다. 사람들은 종종 액션으로 언급합니다. Haskell의 I/O action은 IO a 형태의 타입을 가진다.

여기서 오류가 발생하는 것은 main, 즉 하스켈 프로그램의 진입 점이 IO() 유형의 작업이어야한다는 것입니다. 그러나 is_instructorString -> Bool 유형의 함수이고 is_instructor "foo"Bool입니다.

하스켈은 순수한 기능과 행동을 혼동스럽게 허용하지 않습니다. 함수를 적용하고 액션을 실행하는 것은 다른 두 가지 일이며 서로 다른 코드가 필요합니다.