现在我在尝试将推断类型的monadic动作包含到现有的显式类型数据声明中时遇到了麻烦:
data Thing = Thing { x :: Int }
t = Thing { x = 42 }
-- action :: m (Maybe (n ())), for some horrendous,
-- deeply parameterized monad transformer stacks m, n
action = return Nothing
data Thing' = Thing' { x :: Int, y :: ? }
t' = Thing' { x = 42, y = action }
我不想写下新字段的完整类型 - 事实上,我尝试过但都失败了。在大多数其他时候,我可以让程序的其余部分告知表达式的类型,我希望我能在这里做到这一点。
我猜想当我在用户定义的数据结构中包含这种推断类型的数据时,我必须放弃许多编译器类型推理支持。这是准确的,还是我错过了什么?
答案 0 :(得分:2)
我猜想当我在用户定义的数据结构中包含这种推断类型的数据时,我必须放弃许多编译器类型推理支持。这是准确的,还是我错过了什么?
正确,类型推断不会从使用位置转到类型定义。
您可以使用Thing'
类型对y
进行参数化:
data Thing' yType = Thing' { x :: Int, y :: yType }
然后编译器会根据其用法推断出t'
的类型。
答案 1 :(得分:0)
这将有效
{-# LANGUAGE RankNTypes, ExistentialQuantification #-}
data Thing' = forall a m. Monad m => Thing' { x:: Int, y :: m a }
但你是对的,启用这些语言功能会使编译器在某种意义上变弱,因为类型推断不再足够强大,无法计算某种类型的东西,你必须添加一个类型的归属,这样才能类型检查器可以填写。或者至少这是我理解它。