하스켈을 처음 접해 보니 멍청한 질문 일 수도 있습니다.GHCi는 다형성 작업에 사용할 Monad 유형 클래스의 인스턴스를 어떻게 선택합니까?
내가 할 때 return 10 >>= return
GHCi는 10
을 보여줍니다. 내가 return 10
의 유형을 :t
으로 확인할 때 그것은 단지 return 10 :: (Monad m, Num a) => m a
을 말하고 나는 typeOf return 10
을 얻습니다. 오류가 발생합니다.
그러나 내가 이해하는 한, 하스켈은 을 평가하기 위해 >>=
의 특정 인스턴스를 사용 했음에 틀림 없다. 그래서 어떤 인스턴스가 사용 되었는가?
"[단일 동질 제한이란 무엇입니까?] (http://stackoverflow.com/questions/32496864/what-is-the-monomorphism-restriction)"의 복제본으로 일시적으로 닫았습니다. 이 질문은'a'에 대해'Num' 인스턴스가 어떻게 선택되는지를 다룹니다. 그러나'Mon' 인스턴스가'm'으로 선택되는 방법을 다루지는 않습니다. 그래서 저는 그것이 중복이 아니라고 신중한 대답을 할 가치가 있다고 생각합니다. –
사실 모나드의 특정 인스턴스가 제네릭 모나드로 선택된 이유는 사실입니다. 나는 그것이리스트의'>> ='를 사용했다고 추측하고 있지만 왜 그런지는 잘 모르겠습니다. – Juan
IO Monad일지도 모릅니다. 일반적으로 ghci는 REPL 결과를'print '하려고 시도하지만, IO 작업을 발견하면 대신 _executes_하여 작업에 의해 반환 된 결과를 인쇄합니다. '(Monad m, Num a) => m a'와 같은 타입은'IO a'와 호환되며 아마도 현재 REPL 표현식을 실행할지 아니면 인쇄 할지를 결정하는 데 사용되는 기준입니다. – ErikR