来自GHC文档:
一般原则是:类型细化仅基于用户提供的类型注释来执行.因此,如果没有提供类型签名
eval
,则不会进行类型细化,并且会发生许多模糊的错误消息.
换句话说,当我们在GADT类型上进行模式匹配时(通过多个方程或使用a case
),提供显式类型注释是必要的.
作为一个思想实验考虑
data T a where C :: Char -> T Char f (C c) = c
什么是正确的打字?
f :: T a -> a f :: T a -> Char f :: T Char -> Char
最后一个更具体,前两个更严格一般.然而,前两个中没有一个比另一个更通用 - GHC不能选择"最好的".
GADT在这方面并不特别.大多数高级功能需要类型注释:GADT,更高级别的类型,至少类型系列.
来自GHC文档:
一般原则是:类型细化仅基于用户提供的类型注释来执行.因此,如果没有提供类型签名
eval
,则不会进行类型细化,并且会发生许多模糊的错误消息.
换句话说,当我们在GADT类型上进行模式匹配时(通过多个方程或使用a case
),提供显式类型注释是必要的.
作为一个思想实验考虑
data T a where C :: Char -> T Char f (C c) = c
什么是正确的打字?
f :: T a -> a f :: T a -> Char f :: T Char -> Char
最后一个更具体,前两个更严格一般.然而,前两个中没有一个比另一个更通用 - GHC不能选择"最好的".
GADT在这方面并不特别.大多数高级功能需要类型注释:GADT,更高级别的类型,至少类型系列.