2016-09-21 2 views
0

나는 툠의 아이손 튜토리얼을 통해 일하고 있어요, 자신이 조각으로 구분 한 : 내가 눈치 챘을이 스 니펫에는 유형 유추가 어떻게 유추 되나요?

parseFoo (Object obj) = do 
    a <- case HM.lookup "a" obj of 
     Just x -> parseJSON x 
     Nothing -> fail "no field 'a'" 

    return a 

을하는 I return True는, 나는 "모호한 참조"오류 얻을 경우 :

No instance for (FromJSON t0) arising from a use of ‘parseJSON’ 
The type variable ‘t0’ is ambiguous 
Note: there are several potential instances: 
... 

을 비 모호한 사건의 유형은

parseFoo :: FromJSON b => Value -> Parser b 

내 질문은 왜 a가을 (어떻게) 필요합니까,이다 유형을 유추하는3210 문장?

답변

2

parseJSON의 유형은 FromJSON a => Value -> Parser a, 그래서 당신이 결과를 사용하지 않을 경우, GHC 가능성이 a이 있어야하는데 무엇을 알아낼 수 없습니다 : 그것은 전혀 FromJSON 인스턴스 무엇이든 될 수있다. 반환 값으로 사용할 경우 parseFoo 함수 호출자는 에 대한 콘크리트 유형을 선택합니다.이 유형은 parseFoo 호출의 인스턴스를 선택하는 데 사용됩니다.

제쳐두고 귀하의 return은이 경우 완전히 중복됩니다. 모나드 법에 따라 a >>= returna이므로 do, a <-return을 생략 할 수 있습니다.