Haskell:设计模式:类或传递函数

时间:2012-07-11 00:03:30

标签: design-patterns haskell

假设我有一个函数,它接受一些输入结构并返回一些输出结构(可能与输入结构有关但不同)。

我不想将这些输入/输出结构强制执行到特定类型,我只是想确保它们有一些我需要的行为。

我应该吗?

a)定义一个具有适当提取方法的类,并强制输入数据为该类的实例?
b)让函数接受另一个参数,该参数是定义数据提取方式的函数。

我对输出结构也有同样的问题(除了这次所需的功能是变异)?

4 个答案:

答案 0 :(得分:10)

每当你必须在显式函数参数和类型类之间做出选择时,你应该问自己这个最重要的问题:函数是特定于类型还是应用程序?前者的一个例子是sort,后者的一个例子是map

传递函数总是更灵活,但对于您的情况可能会过度,并导致不必要的代码膨胀。另一方面,类型类会产生更小的代码,但它们的灵活性也会降低。

如果没有进一步的信息,就不可能在这里给出更准确的答案。

答案 1 :(得分:3)

取决于。

类型类的优点是您不必将函数显式传递给任何辅助函数。所以,如果你有两个以上的函数,或者你期望很多函数可以使用相同的基本转换函数,那么类型类可能更好。

答案 2 :(得分:0)

“我只是想确保他们有一些我需要的行为。” - 这几乎描述了类型类的用途,我会选择它。虽然不确定输出结构,但我认为函数必须返回一个特定的类型,即使它们是同一类型类的实例,也不能返回几种类型中的一种。

答案 3 :(得分:0)

类型类提供类型到函数的唯一映射。因此,您应该询问是否始终需要对类型执行相同的功能。 例如,如果将向量传递给函数并且函数需要向量的范数,那么使用类型类通常不是一个好主意,因为有许多有用的规范。在这种情况下,最好使用函数参数。