gpt4 book ai didi

haskell - `coerce` 和类型变量的实例化

转载 作者:行者123 更新时间:2023-12-04 08:40:43 25 4
gpt4 key购买 nike

考虑以下 GHCi session :

>:set -XTypeApplications
>import Data.Map.Strict
>import GHC.Exts
>newtype MySet a = MySet (Map a ())
>let member' :: Ord a => a -> MySet a -> Bool; member' = coerce member

<interactive>:21:57: error:
* Couldn't match representation of type `a0' with that of `()'
arising from a use of `coerce'
* In the expression: coerce member
In an equation for member': member' = coerce member
>let member' :: Ord a => a -> MySet a -> Bool; member' = coerce (member @_ @())

我有一种预感:类型检查器需要满足 Coercible (Ord a => a -> Map a b -> Bool) (Ord a => a -> MySet a -> Bool)并且无法实例化 b在此约束中为 () .

有没有比使用 -XTypeApplications 更优雅的方法? ?

编辑:我特别在寻找处理 MySet a 的许多事件的解决方案在类型中,例如 union :: Ord a => MySet a -> MySet a -> MySet a .

最佳答案

member :: Ord a => a -> Map a b -> Bool
member' :: Ord a => a -> MySet a -> Bool

GHC需要接受
Coercible (Map a b) (MySet a)

它看到
Coercible (MySet a) (Map a ())

这让它需要
Coercible (Map a ()) (Map a b)

这导致
Coercible () b

但是 b 是什么? ?这是模棱两可的。在这种情况下, b 无关紧要。是,因为通过参数化, member不可能在乎。所以选择 b ~ () 是完全合理的。并轻松解决强制。但是 GHC 在类型推断中一般不会进行这样的参数化分析。我怀疑改变它可能很棘手。最特别的是,任何时候类型推断“猜测”,都有可能猜错并在其他地方阻止推断。这是一大 jar bug 。

至于你的问题,我没有好的解决办法。当你有几个具有相似模式的函数时,你可以将它们抽象出来,但你仍然会面临很大的烦恼。

关于haskell - `coerce` 和类型变量的实例化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46032348/

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