2016-08-10 3 views
3

하스켈을 처음 접해 보니 멍청한 질문 일 수도 있습니다.GHCi는 다형성 작업에 사용할 Monad 유형 클래스의 인스턴스를 어떻게 선택합니까?

내가 할 때 return 10 >>= return GHCi는 10을 보여줍니다. 내가 return 10의 유형을 :t으로 확인할 때 그것은 단지 return 10 :: (Monad m, Num a) => m a을 말하고 나는 typeOf return 10을 얻습니다. 오류가 발생합니다.

그러나 내가 이해하는 한, 하스켈은 을 평가하기 위해 >>=의 특정 인스턴스를 사용 했음에 틀림 없다. 그래서 어떤 인스턴스가 사용 되었는가?

+1

"[단일 동질 제한이란 무엇입니까?] (http://stackoverflow.com/questions/32496864/what-is-the-monomorphism-restriction)"의 복제본으로 일시적으로 닫았습니다. 이 질문은'a'에 대해'Num' 인스턴스가 어떻게 선택되는지를 다룹니다. 그러나'Mon' 인스턴스가'm'으로 선택되는 방법을 다루지는 않습니다. 그래서 저는 그것이 중복이 아니라고 신중한 대답을 할 가치가 있다고 생각합니다. –

+1

사실 모나드의 특정 인스턴스가 제네릭 모나드로 선택된 이유는 사실입니다. 나는 그것이리스트의'>> ='를 사용했다고 추측하고 있지만 왜 그런지는 잘 모르겠습니다. – Juan

+1

IO Monad일지도 모릅니다. 일반적으로 ghci는 REPL 결과를'print '하려고 시도하지만, IO 작업을 발견하면 대신 _executes_하여 작업에 의해 반환 된 결과를 인쇄합니다. '(Monad m, Num a) => m a'와 같은 타입은'IO a'와 호환되며 아마도 현재 REPL 표현식을 실행할지 아니면 인쇄 할지를 결정하는 데 사용되는 기준입니다. – ErikR

답변

7

이것은 GHCi가 거대한 do 블록이 마치 IO 인 것과 같습니다. 표현식 인 무언가를 입력 할 때마다 먼저 결과 유형을 IO a 형식으로 특수화 할 수 있는지 확인하려고 시도합니다. 가능한 경우 IO 작업을 실행하고 결과를 인쇄합니다. 그렇지 않은 경우에만 표현식 자체의 결과가 인쇄됩니다.

GHCi가 원하는 특정 모나드로 이동하려면 강제로 유형 주석을 추가하십시오. IO이 다르게 처리되는 방법에 유의하십시오 (표현식이 주석없이 처리 된 것과 같은 방식). 여담으로


ghci> return 10 >>= return :: Maybe Int 
Just 10 
ghci> return 10 >>= return :: [Int] 
[10] 
ghci> return 10 >>= return :: IO Int 
10 

은 선택 Num 어떤 경우에 대한 완전히 다른 문제가 있으며, 하나는 디폴트 규칙과 단사 사상을 제한 할 수있는 모든 것을 갖추고 있습니다.

+0

으로 사용하여 Int를 조합 한 것입니다. 모나드 이외의 typeclass를 사용하는 모호한 표현식을 사용하면 기본값을 선택하는 대신 오류가 발생합니까? – Juan

+0

@Juan 만약 내가 올바르게 이해한다면 예 ... – Alec

+0

@Juan, 예를 들어'ghci'에'return mempty'라고 입력하면 모호한 타입 오류가 발생합니다. – villou24

관련 문제