class Foo t where
foo :: t
bar :: Binary t => t -> ()
bar = undefined
repro :: (Binary t, Foo t) => Proxy t -> ()
repro _proxy =
bar (foo :: t)
编译器提示:
无法推断出因使用“bar”而产生的(二进制 t0) 从上下文:(二进制 t,Foo t) 由类型签名绑定(bind): 复制::forall t。 (二进制 t, Foo t) => 代理 t -> ()
无法推断出因使用“foo”而产生的(Foo t2) 从上下文:(二进制 t,Foo t) 由类型签名绑定(bind): 复制::forall t。 (二进制 t, Foo t) => 代理 t -> ()
具体来说,我很惊讶它没有看到我将 t
传递给 bar
,并创建了 t0
类型变量。 t2
更加神秘,因为 foo
显式注释为 t
类型。
最佳答案
默认情况下,类型变量的作用域不是这样的。函数签名中的 t
和函数体中的 t
不相同。您的代码相当于:
repro :: (Binary t, Foo t) => Proxy t -> ()
repro _proxy =
bar (foo :: a)
您需要启用 ScopedTypeVariables 扩展,并添加显式 forall t
。
{-# LANGUAGE ScopedTypeVariables #-}
repro :: forall t. (Binary t, Foo t) => Proxy t -> ()
repro _proxy =
bar (foo :: t)
关于haskell - 为什么这个类型不检查?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51446524/