[英]Is a typeclass constraint discouraged in a typeclass method?
我知道在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? 它是在真实代码中常见的吗?
从用法的角度来看,类型类方法与普通的多态函数没有什么不同,普通的多态函数只是碰巧将该类作为对其参与者类型变量中一个( 或多个 )的约束。 但是签名中可能还有其他类型变量,这些变量需要一个类头未提供的其他约束。 约束(通常) 是实现该功能所必需的 ,因此,需要对类方法进行约束当然是合理的–与对data
类型的约束不同,后者实际上根本没有任何作用( data
的实现只是一些目的)数据布局,它可能不需要任何类†的任何方法。
但是,可以通过在类头中包含额外的受约束类型变量来避免此问题:
class (Eq b) => Foo b a where
foo :: a -> b
有时,这比您的建议要好,但有时却不一定好,例如,如果Foo
有很多方法,而其中只有一个方法与b
有关。 当然,在这种情况下,也可以仅将foo
拆分为头部为b
的子类,而将其他方法保留在类中而没有额外的约束。 但是,用两个类代替一个类可能也不太好。
因此,如果您发现自己处在很自然的情况下,我认为将约束添加到类方法是完全合法的。
存在此类约束的方法的现有示例为foldMap
, traverse
和lift
。 这不是普遍存在的模式,但绝对也不是完全不常见的。
† 如果考虑类型/数据族,这看起来有些不同,但是即使那样,您也不需要约束data
而只需要处理该数据的函数即可。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.