gpt4 book ai didi

haskell - 什么干扰了我的作用域类型变量?

转载 作者:行者123 更新时间:2023-12-03 21:11:56 28 4
gpt4 key购买 nike

过去几天我一直害怕问这个问题,因为它的特点是我没有注意到一个小错误,所以如果是这种情况,我真诚地道歉。
我正在尝试编写自己的 scanr作为我正在写作的图书馆的一部分。代码如下所示:

-- Language Extensions for the file --
{-# Language BangPatterns #-}
{-# Language FlexibleInstances #-}
{-# Language FlexibleContexts #-}
{-# Language QuantifiedConstraints #-}
{-# Language UndecidableInstances #-}
{-# Language ScopedTypeVariables #-}

rightScan ::
( Foldable f
)
=> forall a b . (a -> b -> b) -> b -> f a -> NonEmpty [] b
rightScan g start as = start :| reverse (rightFold addOn [] as)
where
addOn :: a -> [b] -> [b]
addOn new (c : cs) = g new c : c : cs
addOn new [] = [g new start]
(我的 NonEmpty 实际上是由容器参数化的(在这种情况下为 [] ),我的 NonEmpty [] 相当于传统的 NonEmpty 。)
现在这有两个错误:
• Couldn't match expected type ‘a’ with actual type ‘a1’
‘a1’ is a rigid type variable bound by
the type signature for:
addOn :: forall a1 b1. a1 -> [b1] -> [b1]
和非常相似的
• Couldn't match expected type ‘b’ with actual type ‘b1’
‘b1’ is a rigid type variable bound by
the type signature for:
addOn :: forall a1 b1. a1 -> [b1] -> [b1]
现在这些错误很容易理解。它认为 arightScran的签名不同于 aaddOn的签名与 b 相同.但是,我已经对类型变量进行了限定,并且这两个变量都是通过 forall 引入的。在 parent 。
现在我可以删除 addOn 的签名来解决这个问题,但我完全困惑为什么作用域类型变量在这里不起作用。
所以问题是:我在这里的作用域类型变量做错了什么?

最佳答案

问题是 forall 的位置.它需要出现在约束之前并列出所有类型变量,包括 f . forall f a b. (Foldable f) => ... .
按照您编写的方式,forall 的作用域并不涵盖整个类型,因此它绑定(bind)的类型变量被认为是该类型的本地变量。这是由 RankNTypes 启用的。 ,包含在 QuantifiedConstraints 中.

关于haskell - 什么干扰了我的作用域类型变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63199466/

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