繁体   English   中英

在typeclass方法中是否不鼓励使用typeclass约束?

[英]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的子类,而将其他方法保留在类中而没有额外的约束。 但是,用两个类代替一个类可能也不太好。
因此,如果您发现自己处在很自然的情况下,我认为将约束添加到类方法是完全合法的。

存在此类约束的方法的现有示例为foldMaptraverselift 这不是普遍存在的模式,但绝对也不是完全不常见的。


如果考虑类型/数据族,这看起来有些不同,但是即使那样,您也不需要约束data而只需要处理该数据的函数即可。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM