Haskell库导入语法

Haskell库导入语法,haskell,Haskell,很抱歉问了一个非常基本的问题:在GHCi中,import Library.Name和:m+Library.Name之间有区别吗?它们看起来是等价的,但我认为使用替代语法是有原因的。您可以在源代码中包含import,这更一般,而:m是一个特定于ghci的命令(为了方便) 您可以使用ghci>:m+模块1。。。ModuleN加载多个模块。使用-而不是+卸载模块。因为ghci是交互式的,所以我会坚持使用:m,除非您的工作流程是:编辑.hs文件,保存它,然后重新加载它。然后,导入将更合适(并具有更多功能

很抱歉问了一个非常基本的问题:在GHCi中,
import Library.Name
:m+Library.Name
之间有区别吗?它们看起来是等价的,但我认为使用替代语法是有原因的。

您可以在源代码中包含
import
,这更一般,而
:m
是一个特定于ghci的命令(为了方便)

您可以使用
ghci>:m+模块1。。。ModuleN
加载多个模块。使用
-
而不是
+
卸载模块。因为
ghci
是交互式的,所以我会坚持使用
:m
,除非您的工作流程是:编辑
.hs
文件,保存它,然后重新加载它。然后,
导入
将更合适(并具有更多功能,例如)


如果以后决定使用例如
ghc
来编译程序,那么
import
指令也会起作用。您可以有选择地只导入特定函数:
导入数据。列表(排序)
只导入排序,因此对名称空间的污染更少。

您是对的,
导入模块
:模块+模块
是相同的,但是
:模块
(以下简称
:m
)语法

  • 它老了。GHCi实际上曾经只是
    IO
    do
    块的内部;现在它支持语言的每一部分,所以我们可以做
    import
    s。(看起来是这样,但是;我们直到2008年才获得对顶级声明的完全支持。)

  • 它允许您一次导入多个模块<代码>:m+M1 M2 M3与在新行上分别写入
    import M1
    import M2
    import M3
    相同

  • 它允许您取消导入模块:
    :m-m
    将在提示下从当前范围中删除
    m
    的内容

  • 它允许您导入已解释的模块,以便查看整个范围。这就是当您加载File.hs时发生的情况;您会发现您在模块
    *文件
    中,可以查看导入的所有内容,甚至可以查看未导出的所有内容。如果加载了解释模块
    MI
    ,则可以使用
    :m+M1*MI M3
    以普通方式将
    M1
    M2
    引入范围,以特殊方式将
    MI
    引入范围

  • 不过,为了完整起见,
    import
    语法确实为我们提供了
    :m
    没有的三件事:

  • 合格进口品。能够
    导入符合条件的数据。映射为M
    并使用
    M.lookup
    比必须执行
    数据.Map.lookup
    或遭受歧义错误要好得多。(请注意,安装的每个软件包在GHCi中都是完全合格的,因此,
    import qualified Module
    本身并不能为您带来任何好处。)

  • 导入列表。即使我有
    Data.Map
    中使用
    M
    限定的函数,我仍然可以执行
    import Data.Map(Map)
    将类型引入限定范围

  • 导入
    隐藏
    。与上述相反;也许我正在编写自己的排序例程,这样我就可以
    导入数据。列表隐藏(排序)


  • 您也可以签出。

    那么:m只是为了简洁吗?我突然想到:m还允许在库被导入后删除库。谢谢您的详细回答;如果我没有将线程标记为“已解决”,我会选择它。