하스켈이 타입 클래스에서 올바른 함수로 디스패치하는 방법에 대해 약간 혼란스러워합니다. 이것은 암묵적으로 행해지는 것입니까, 아니면 이것은 하스켈이 무언가의 유형을 추측하는 것과 관련이 있습니까? 예를 들어, 다음 사항을 고려하스켈 : 정확한 타입 지정을위한 디스패치 해결
instance Monad Parser where
return a = Parser (\ cs -> [(a, cs)])
내가 좋아하는 뭔가를 할 경우
return something >>= \x -> -- Returning a parser!
바인드의 오른쪽을 사용하여 통화로 돌아가 하스켈 생각합니까? Parser를 다른 어떤 것과 반대로 호출하는 것을 어떻게 알 수 있습니까?
편집 :
좋아,이 사실은 나를 위해 더 많은 질문을 제기한다. 하스켈은 타입 선언을 해결함으로써 "반환"이 무엇인지 추측 할 수 있습니다. 그러나 완전히 모호한 진술의 경우는 어떨까요?
예를 들어 통역사를 열고 return 1
을 입력하면 어떻게됩니까? 그러면 어떤 수익이 그 다음에 전화되는지 어떻게 알 수 있습니까?
GHCi 문이 우선 몇 가지 * A *의 형태'IO의 A'의 것으로 간주됩니다 문자 "K"를 출력하고 실행되면 (그것을 실패하면'print it'을 시도합니다. * it *은 여러분이 입력 한 표현식입니다.)'return 1'은'(Num a) => IO a' 타입에 적합하기 때문에 실행됩니다; 'Num' 인스턴스는 하스켈의 기본 메커니즘 (Integer)으로 선택됩니다. – ehird
'let x :: (Monad m, Num n) => m n; x = return 1' 확인해 보라.'x'는 * 다형성 값이다! 상황에 따라 유형이 'mn'모양을 가지며 제약 조건을 준수하는 값을 필요로하는 한 * 모든 상황에서 사용할 수 있습니다. 'm'은 '모나드'이고 'n'은 'Num'입니다. . 'x'는'[1.0] :: [Double]','Just 1 :: Maybe Int' ... 모든 종류의 것들이 될 수 있습니다! –