如何在Haskell或Clojure等函数式编程语言中组织函数?

时间:2016-09-20 22:20:32

标签: java oop haskell clojure functional-programming

我的理解是,在FP中,您有许多函数可以处理一些预定义的数据类型。

因此,例如,可以使用名为prepare_data的10个不同函数,每个函数对不同的数据类型起作用。 (例如,prepare_data代表客户,公司,资源......)。 因此,当您在代码中看到对prepare_data函数的调用时,开发人员如何找到该函数的定义?

我来自OOP背景和OOP,当你看到类似myObject.prepare_data之类的内容时,你可以通过查看MyObject类的源代码文件找到定义,该文件可以唯一标识(其中{ {1}}是MyObject的类型。但是在FP中,myObject的代码可以位于系统中的任何源文件中。那怎么在FP中完成呢?

1 个答案:

答案 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只会在遇到某个函数时搜索该名称的文件。哪个真的非常糟糕;幸运的是,大多数其他语言需要显式导入。