繁体   English   中英

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

[英]How functions are organised in functional programming languages like Haskell or Clojure?

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

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

我来自OOP背景和OOP,当你看到像myObject.prepare_data东西时,你可以通过查看MyObject类的源代码文件找到定义,可以唯一地识别它( MyObjectmyObject的类型)。 但是在FP中, prepare_data的代码可以位于系统中的任何源文件中。 那怎么在FP中完成呢?

坦白地说,你有时无法找到来源。 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只会在遇到函数时搜索该名称文件 哪个真的非常糟糕; 幸运的是,大多数其他语言需要显式导入。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM