gpt4 book ai didi

haskell - Rigid/skolem 类型变量 : fine as parameter but escaping scope with local where/let statement

转载 作者:行者123 更新时间:2023-12-03 23:45:24 25 4
gpt4 key购买 nike

根据 What are skolems? ,这有效:

{-# LANGUAGE ExistentialQuantification #-}

data AnyEq = forall a. Eq a => AE a

reflexive :: AnyEq -> Bool
reflexive (AE x) = x == x
但是为什么不这样:
reflexive2 :: AnyEq -> Bool
reflexive2 ae = x == x
where
AE x = ae
(或与 let 类似的版本)。它产生的错误包括:
Couldn't match expected type ‘p’ with actual type ‘a’
because type variable ‘a’ would escape its scope
This (rigid, skolem) type variable is bound by
a pattern with constructor: AE :: forall a. Eq a => a -> AnyEq,
in a pattern binding
at Skolem.hs:74:4-7
是否可以通过添加一些类型声明来使其工作(有点像 s :: forall a. I a -> String 解决方案 withContext 该问题中的示例)。我觉得我想添加一个 Eq x某处。
我(可能是幼稚的)对 reflexive 的理解作品如下:
  • 它采用 AnyEq 类型的值.只要它是 Eq 的一个实例,它就会在其中嵌入任何类型的值。 .这种内部类型在 reflexive 的类型签名中并不明显。并且不知道何时 reflexive被编译。
  • 绑定(bind)(AE x) = ae使x一个未知类型的值,但已知是 Eq 的一个实例. (就像 myEq :: Eq a => a -> a -> Bool; myEq x y = x == y 中的变量 x 和 y 一样)
  • ==运营商很高兴基于隐含的类约束。

  • 我想不出为什么 reflexive2不做同样的事情,除了像“单态限制”或“单局部绑定(bind)”这样的事情,这有时会让事情变得奇怪。我尝试使用 NoMonomorphismRestriction 的所有组合进行编译和 NoMonoLocalBinds ,但无济于事。
    谢谢。

    最佳答案

    所以我想我找到了答案in the documentation (所有地方!)。这说明:

  • 您不能在 let 或 where 绑定(bind)组中对存在量化的构造函数进行模式匹配
  • 这个限制的原因实际上是一个实现
  • 我们会看到它有多烦人

  • 还有一个 request to lift the restriction (虽然看起来有点挑战性)。
    就个人而言,现在我想我明白了,它并不那么烦人。但我确实认为生成的错误消息具有误导性(因为我认为问题不是范围泄漏),所以会要求对其进行更改。 (如果生成的错误消息有对文档的引用,那也很好,所以也会通过询问来插入我的运气。)
    感谢大家的评论,如果您认为我有一些错误,请告诉我。大卫。

    关于haskell - Rigid/skolem 类型变量 : fine as parameter but escaping scope with local where/let statement,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63119425/

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