【发布时间】:2011-01-11 08:05:47
【问题描述】:
首先,这个问题并非 100% 特定于 Haskell,请随意评论类型类、接口和类型的一般设计。
我正在阅读LYAH - creating types and typeclasses以下是我正在寻找更多信息的段落:
Data (Ord k) => Map k v = ...
但是,这是一个非常强大的约定 在 Haskell 中永远不要添加类型类 数据声明中的约束。为什么? 好吧,因为我们没有得到很多好处, 但我们最终写了更多的课 约束,即使我们不需要 他们。如果我们放置或不放置 Ord k 数据声明中的约束 地图 k v,我们将不得不把 约束成函数 假设地图中的键可以是 订购。但是如果我们不把 数据声明中的约束,我们 不必将 (Ord k) => 放入 函数的类型声明 不在乎钥匙是否可以 订购与否。这样的一个例子 函数是toList,它只需要一个 映射并将其转换为 关联列表。它的类型签名 是 toList :: Map k a -> [(k, a)]。如果 Map k v 在它的 数据声明,toList 的类型 必须是 toList :: (Ord k) => 映射 k a -> [(k, a)],即使 函数不做任何比较 按键顺序。
乍一看,这似乎是合乎逻辑的——但是将类型类附加到类型上没有好处吗?如果类型类是类型的行为,那么为什么要通过使用类型(通过函数)而不是类型本身来定义行为?我假设有一些元编程可以利用它,它肯定是很好的描述性代码文档。相反,这在其他语言中会是一个好主意吗?在方法上指定对象应符合的接口是否理想,这样如果调用者不使用该方法,则对象不必符合接口?此外,为什么 Haskell 不能推断出使用类型 Foo 的函数必须引入类型 Foo 声明中标识的类型类约束?是否有编译指示可以启用此功能?
当我第一次阅读它时,它让人联想到“这是一个 hack(或解决方法)响应”。仔细阅读后,听起来很聪明。在第三次阅读时,将其与 OO 世界进行比较,这听起来又像是一个 hack。
所以我来了。
【问题讨论】:
标签: haskell interface types typeclass type-constraints