导入Haskell模块的特定部分的好处

Xop*_*ter 6 haskell module

除了可能通过其他方式解决的潜在名称冲突 - 从您需要的模块中仅导入部件是否有任何好处:

import SomeModule (x, y, z)
Run Code Online (Sandbox Code Playgroud)

...只是导入所有这些,这更简洁,更容易维护:

import SomeModule
Run Code Online (Sandbox Code Playgroud)

例如,它会使二进制文件更小吗?

Ear*_*ine 11

名称冲突和二进制大小优化只是您可以获得的两个好处.实际上,始终确定您希望从代码的外部世界获得什么是一种很好的做法.因此,每当人们查看您的代码时,他们就会知道您的代码究竟是什么.

这也为您提供了一个非常好的机会来创建测试的模拟解决方案,因为您可以处理导入列表并为它们编写模拟.

不幸的是,在Haskell中,类型类实例并不那么容易.它们是隐式导入的,因此可能会产生冲突,也可能使模拟变得更难,因为无法仅指定特定的类实例.希望这可以在未来版本的Haskell中修复.

UPDATE

我上面列出的好处(代码维护和测试模拟)不仅限于Haskell.实际上,正如我所知,它也是Java中的常见做法.在Java中,您只需导入一个类,甚至一个静态变量/方法.不幸的是,您仍然无法有选择地导入成员函数.

  • 如果他们可以在GHCi中打开该模块,那么`:i frobnicate`通常会告诉你它所在的文件.也许可以通过ghc-mod获得它. (3认同)

Ben*_*son 6

不,这只是为了防止名字冲突.防止名称冲突的另一种机制 - 即import qualified- 导致更详细(不太可读)的代码.

它不会使二进制文件更小 - 考虑到给定模块中的函数通常都相互引用,因此需要将它们编译在一起.