数据声明中的推断类型

时间:2018-04-13 03:18:55

标签: haskell type-inference

现在我在尝试将推断类型的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 }

我不想写下新字段的完整类型 - 事实上,我尝试过但都失败了。在大多数其他时候,我可以让程序的其余部分告知表达式的类型,我希望我能在这里做到这一点。

我猜想当我在用户定义的数据结构中包含这种推断类型的数据时,我必须放弃许多编译器类型推理支持。这是准确的,还是我错过了什么?

2 个答案:

答案 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 }

但你是对的,启用这些语言功能会使编译器在某种意义上变弱,因为类型推断不再足够强大,无法计算某种类型的东西,你必须添加一个类型的归属,这样才能类型检查器可以填写。或者至少这是我理解它。