gpt4 book ai didi

haskell - 具有多参数类型类的类型统一

转载 作者:行者123 更新时间:2023-12-03 14:26:02 25 4
gpt4 key购买 nike

{-# LANGUAGE MultiParamTypeClasses #-}
class Coerce a b where coerce :: a -> b
instance Coerce a a where coerce a = a

现在,这不起作用: coerce 0 :: Int但是如果用这个替换实例,则表达式有效:
instance a ~ b => Coerce a b where coerce x = x

为什么?

最佳答案

我可以告诉你为什么第一个不起作用。
Coerce可以为任何可能的类型对定义。 coerce 0 :: Int被解析为 (coerce 0) :: Int .所以你已经修复了 bcoerce :: a -> b带有类型注释,但不是 a .

数字文字是多态的,所以 0有类型 Num a => a .那是行不通的;没有匹配的实例 Coerce a Int .可能有 Coerce Double Int , Coerce Complex Int等,所以知道 bInt不足以推断 0Int .我们需要说 coerce (0 :: Int) :: Int修复两个类型参数。

我相信第二个有效,因为实例声明的约束不用于帮助解析类型类。 instance a ~ b => Coerce a b完全匹配,就像你写的 instance Coerce a b . IE。这是最通用的实例(为了类型类解析的目的),它可以很好地匹配对 coerce 的任何可能调用。 (因此您不能编写任何其他非重叠实例)。 a ~ b约束仅在选择实例后应用。

由于您有一个与任何内容匹配的实例,因此为 coerce 0 :: Int 选择一个实例没有问题。 ,即使我们仍然有同样的问题,不知道 0 是什么类型的是。但是在选择实例之后,我们现在有了额外的约束 a ~ Int ,这允许将明确的类型分配给所有内容。

关于haskell - 具有多参数类型类的类型统一,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24550088/

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