我的理解是,在FP中,您有许多函数可以处理一些预定义的数据类型。
因此,例如,可以使用名为prepare_data
的10个不同函数,每个函数对不同的数据类型起作用。 (例如,prepare_data
代表客户,公司,资源......)。
因此,当您在代码中看到对prepare_data
函数的调用时,开发人员如何找到该函数的定义?
我来自OOP背景和OOP,当你看到类似myObject.prepare_data
之类的内容时,你可以通过查看MyObject
类的源代码文件找到定义,该文件可以唯一标识(其中{ {1}}是MyObject
的类型。但是在FP中,myObject
的代码可以位于系统中的任何源文件中。那怎么在FP中完成呢?
答案 0 :(得分:4)
嗯,坦率地说,有时你无法找到来源。 BTO在OO语言中没有什么不同 - 它可能根本就没有提供。通常,您所拥有的只是接口/头文件/签名。
在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只会在遇到某个函数时搜索该名称的文件。哪个真的非常糟糕;幸运的是,大多数其他语言做需要显式导入。