【发布时间】:2020-04-16 05:22:26
【问题描述】:
在我看来,您总是可以传递函数参数而不是使用类型类。例如,而不是定义相等类型类:
class Eq a where
(==) :: a -> a -> Bool
并且在其他函数中使用它来表示类型参数必须是Eq的实例:
elem :: (Eq a) => a -> [a] -> Bool
我们不能只定义 elem 函数而不使用类型类,而是传递一个函数参数来完成这项工作吗?
【问题讨论】:
-
这就是所谓的字典传递。您可以将类型类约束视为隐式参数。
-
您可以这样做,但显然不必传递函数并根据类型使用“标准”函数会更方便。
-
你可以这样说,是的。但我认为至少还有一个其他重要优势:编写多态函数的能力,这些函数适用于实现特定“接口”或一组特性的任何类型。我认为类型类约束以传递额外函数参数所没有的方式非常清楚地表达了这一点。特别是因为许多类型类必须满足的(可悲的是隐含的)“法则”。
Monad m约束对我来说比传递a -> m a和m a -> (a -> m b) -> m b类型的附加函数参数更重要。 -
TypeApplications扩展让您可以将隐式参数显式化。(==) @Int 3 5比较3和5专门作为Int值。您可以将@Int视为特定类型相等函数字典中的键,而不是Int特定比较函数本身。
标签: haskell functional-programming higher-order-functions