我的理解是,在 FP 中,您有很多函数处理一些预定义的数据类型。
因此,例如,可能有 10 个不同的函数称为 prepare_data
,每个函数作用于不同的数据类型。 (例如,客户、公司、资源等的prepare_data
)。
因此,当您在代码中看到对 prepare_data
函数的调用时,开发人员如何才能找到该函数的定义?
我来自 OOP 背景,在 OOP 中,当您看到类似 myObject.prepare_data
的内容时,您可以通过查看 MyObject
类的源代码文件找到定义,可以唯一标识(其中 MyObject
是 myObject
的类型)。但是在 FP 中,prepare_data
的代码可以位于系统中的任何源文件中。那么这在 FP 中是如何完成的呢?
最佳答案
坦白说,您有时无法找到来源。顺便说一句,这在 OO 语言中没有什么不同——它可能根本就没有提供。一般来说,您所拥有的只是接口(interface)/头文件/签名。
与 OO 相比,强类型函数语言中的类型签名确实可以告诉您很多有关如何使用函数的信息。通常,您不需要任何文档或源代码,您只需要查看类型签名并了解此函数的用途以及如何使用它,因为只有一种方式类型可以匹配。
要查找类型签名,大多数语言都会为您提供一些工具来查找它。在 Haskell 中,您可以将有问题的文件加载到 GHCi 中, 然后查询
YourModule> :i prepare_data
这将打印出类型签名(实际上还有定义此函数的模块)。
也就是说,实际上有一种更有效的方法来获取签名、文档以及源代码(如有必要):搜索互联网!就 Haskell 而言,有几个很棒的专业搜索引擎。如果你问Hayoo函数的名称,如 prepare_data
,它将在整个 Hackage 数据库(基本上托管所有相关的开源 Haskell 项目)中搜索该名称的函数。如果名称不是特别通用,您应该在第一页上看到正确的名称,链接到带签名的文档,而该文档也有在线源代码链接。
如果函数名称本身太模糊,您可以将搜索限制在有问题的库中(希望您已经知道了!)或直接查找模块。正如我所说,您可以从 GHCi 之类的工具中了解到这一点,但实际上通常从代码中看起来是正确的:无论是一个类还是一组函数,它们总是需要在使用前导入†。所以你在文件的顶部有类似
的东西import MyData
import MyData.Algorithms
import MyData.Util
这已经给了你相当强烈的提示。您甚至可以明确提及每个实体:
import MyData(MyData)
import MyData.Algorithms(foo, bar)
import MyData.Util(baz, prepare_data) -- gotcha!
这取决于语言有多普遍。
†有几种不同的语言,例如,如果 Matlab 遇到函数,它将只搜索同名文件。这真的非常糟糕;幸运的是,大多数其他语言确实需要显式导入。
关于java - 在 Haskell 或 Clojure 等函数式编程语言中,函数是如何组织的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39604613/