gpt4 book ai didi

haskell - 为什么这个类型不检查?

转载 作者:行者123 更新时间:2023-12-02 17:45:50 25 4
gpt4 key购买 nike

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com