gpt4 book ai didi

haskell - 类型类方法中是否不鼓励使用类型类约束?

转载 作者:行者123 更新时间:2023-12-02 09:29:26 24 4
gpt4 key购买 nike

我知道 Haskell 不鼓励数据约束。例如,

data Eq b => Bar b = Bar b
如果没有不推荐使用的扩展,

是不可能的。我也听说过

data Bar b = Eq b => Bar b

并不常见,甚至令人气馁。 (顺便说一句,这是正确的吗?)


对于类型类中的约束也是如此吗?例如,正在做类似的事情

class Foo a where
foo :: Eq b => a -> b

对 Haskell 也感到沮丧?它在实际代码中常见吗?

最佳答案

从使用的角度来看,类型类方法与普通的多态函数没有什么不同,后者只是碰巧将该类作为对其参与者类型变量中的一个 ( or more ) 的约束。但是签名中可能还有其他类型变量,它们需要单类头未提供的其他约束。约束(通常)对于您能够实现该函数是必要的,因此,需要对类方法进行约束当然是合理的 - 与 data 上的约束不同类型,实际上根本没有任何作用( data 的实现只是一些数据布局,它不可能需要任何类中的任何方法)。

但是,您可以通过在类头中包含额外的约束类型变量来避免此问题:

class (Eq b) => Foo b a where
foo :: a -> b

有时,这比您的建议更好,但有时肯定不是更好,例如如果 Foo有一大堆方法,其中只有一个与 b 相关。根本不。当然,在这种情况下,也可以仅拆分foo。进入具有 b 的子类在它的头脑中,并将其他方法留在类中而没有额外的约束。但是,有两门课而不是一门课也可能不太好。
因此,如果您发现自己处于自然而然的情况下,向类方法添加约束是完全合法的。

具有此类约束的方法的现有示例是 foldMap , traverse lift 。这不是一种普遍存在的模式,但也绝对不是完全不常见。


如果您考虑类型/数据系列,这看起来有点不同,但即使如此,您也不需要对 data 进行约束。但只是处理这些数据的函数。

关于haskell - 类型类方法中是否不鼓励使用类型类约束?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34711695/

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