在此代码段中如何推断类型?
How is type inferred in this snippet?
我正在学习 Artyom 的 Aeson 教程,并为自己编写了以下代码片段:
parseFoo (Object obj) = do
a <- case HM.lookup "a" obj of
Just x -> parseJSON x
Nothing -> fail "no field 'a'"
return a
我注意到如果我 return True
,我会收到 "ambiguous reference" 错误:
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
需要 return
语句来推断其类型?
parseJSON
的类型是 FromJSON a => Value -> Parser a
,所以如果您从不使用结果,GHC 不可能弄清楚 a
应该是什么:它可以是任何东西完全有一个 FromJSON
实例。当您将它用作 return 值时,parseFoo
函数的调用者将为 b
选择一个具体类型,该类型将用于为 [=14= 选择实例] 打电话。
顺便说一句,在这种情况下,您的 return
完全多余。您可以省略 do
、a <-
和 return
,因为根据 monad 法则 a >>= return
只是 a
。
我正在学习 Artyom 的 Aeson 教程,并为自己编写了以下代码片段:
parseFoo (Object obj) = do
a <- case HM.lookup "a" obj of
Just x -> parseJSON x
Nothing -> fail "no field 'a'"
return a
我注意到如果我 return True
,我会收到 "ambiguous reference" 错误:
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
需要 return
语句来推断其类型?
parseJSON
的类型是 FromJSON a => Value -> Parser a
,所以如果您从不使用结果,GHC 不可能弄清楚 a
应该是什么:它可以是任何东西完全有一个 FromJSON
实例。当您将它用作 return 值时,parseFoo
函数的调用者将为 b
选择一个具体类型,该类型将用于为 [=14= 选择实例] 打电话。
顺便说一句,在这种情况下,您的 return
完全多余。您可以省略 do
、a <-
和 return
,因为根据 monad 法则 a >>= return
只是 a
。