2016-09-21 30 views
0

私はアルチョームのアイソーンのチュートリアルを働いている、と自分自身にこのスニペットをコード化されています:このスニペットではどのように型推論が行われますか?

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

    return a 

私は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なので、doa <-、およびreturnを省略することができます。

関連する問題