Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Design patterns Haskell:设计模式:类还是传递函数_Design Patterns_Haskell - Fatal编程技术网

Design patterns Haskell:设计模式:类还是传递函数

Design patterns Haskell:设计模式:类还是传递函数,design-patterns,haskell,Design Patterns,Haskell,假设我有一个函数,它接受一些输入结构并返回一些输出结构(可能与输入结构相关但不同) 我不想将这些输入/输出结构强制用于特定类型,我只想确保它们具有我需要的一些行为 我应该吗 a) 定义一个具有适当提取方法的类,并强制输入数据成为该类的实例或 b) 让函数接受另一个参数,即定义如何提取数据的函数 对于输出结构我也有同样的问题(除了这次所需的功能是变异)?这取决于 类型类的优点是不必显式地将函数传递给任何帮助函数。因此,如果您有两个以上的函数,或者如果您希望许多函数使用相同的基本转换函数,那么类型类

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

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

我应该吗

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

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

这取决于


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

“我只想确保它们具有我需要的一些行为。”——这基本上描述了类型类的用途,我同意这一点。虽然不确定输出结构,但我认为函数必须返回特定类型,即使是同一类型类的实例,也不能返回其中一个类型。

每当您必须在显式函数参数和类型类之间进行选择时,您应该问自己一个最重要的问题:函数是特定于类型还是特定于应用程序?前者的示例是
排序
,后者的示例是
映射

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


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

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

fromInteger
似乎返回的类型并不完全依赖于它的输入。@Clinton查看Hugs源代码的前奏,这是因为
fromInteger
Num
typeclass的操作。您必须为每种输出类型创建一个单独的函数来实现此操作。此外,传递函数可以为同一类型的不同值提供不同行为的灵活性。类型类将对同一类型的所有值强制执行单个行为。我看不到只使用类型类(即删除函数参数)来定义
map