是进口haskell模块作为合格的良好做法?

swa*_*ang 4 haskell

我知道导入限定名称有利于避免名称冲突.我纯粹是从可读性的角度来看问题.

不熟悉haskell标准库,我在阅读haskell代码(主要来自在线书籍和教程)时发现的一件事是,当我遇到一个函数时,我不知道它是属于导入的模块还是将由用户以后.

来自C++背景,通常认为使用命名空间调用标准库函数是一种很好的做法,例如std :: find.haskell是一样的吗?如果没有,那么你如何克服我上面提到的问题?

Sib*_*ibi 8

来自Haskell风格指南:

始终对标准库和第三方库使用显式导入列表或限定导入.这使得代码对这些库中的更改更加健壮.例外:序曲.

所以,答案是肯定的.除Prelude之外,使用合格导入被认为是标准和第三方库的良好实践.但是对于带符号的中缀函数(类似的东西<|*|>),您可能希望显式导入它,因为合格的导入看起来不太好.


lef*_*out 6

我不太喜欢合格的名字,IMO他们比较混乱代码.应该始终导入限定的唯一模块是那些使用名称与前奏函数冲突的模块 - 这些模块通常在文档中明确建议这样做.

对于广泛使用的模块,例如Control.Applicative,没有太多理由不进口不合格; 大多数程序员都应该知道那里的所有内容.对于那些做一些非常具体的不太知名的软件包的模块,或者为了避免单个名称的冲突,你可以使用一个显式的导入列表,例如import Data.List (sortBy),import System.Random.Shuffle (shuffleM)这样你就不必使用限定符来丢弃你的代码了,在导入部分中查找标识符会立即告诉您它来自哪里(这类似于using std::cout;).但老实说,我发现将模块加载到ghci并使用它会更方便

*ClunkyModule>:我奇怪的功能

看看它的定义.

对于我倾向于忽视的合格进口或明确的进口清单,有一个很好的观点:它们使您的包装更具有前瞻性.如果某个模块的新版本停止导出您需要的项目,或者另一个模块引入了冲突名称,那么显式导入将立即指出您的问题.