gpt4 book ai didi

haskell - 为什么 Haskell 的 import-as 中的这些极端情况会起作用以及它们的作用是什么?

转载 作者:行者123 更新时间:2023-12-02 15:47:00 25 4
gpt4 key购买 nike

我遇到过一些包含特别奇怪的导入的模块。

首先,我看到一个模块A将另一个模块导入为自己。例如:

-- module A.hs
module A where
import B as A -- ???

f = id

这是做什么的?为什么上述行为是被允许的?

但是最让我困扰的是代码实际上是这样的:

module A where
import B as A -- Okay, assume this works...
import C as A -- ??? A is already defined!

f = id

为什么可以导入多个同名模块?这能达到什么目的?我认为这种导入是不允许的,而且 A Gentle Introduction to Haskell指出:

it is illegal to import two different entities having the same name into the same scope.

但是这些导入工作正常。另一件让我烦恼的奇怪的事情是导出模块本身:

module A (module A) where

总而言之,考虑到以下 MWE:

-- A.hs
module A (module A) where
import B as A
import C as A

f = id

-- B.hs
module B where

g = id

-- C.hs
module C where

h = id
  1. 导入是否符合标准,还是 GHC 的某些错误?它看起来不像是一个错误,但我找不到任何引用来解释所有这些极端情况。
  2. 具体取得的结果是什么?我的意思是:哪些名称是从 A 导入和/或导出的?

最佳答案

名称限定符与模块名称不同。名称限定符只是一个集体范围,您可以使其引用任意数量的模块。通常,您不会添加多个模块,但在一种情况下,您几乎总是添加大量模块:在不合格范围中。 import Data.List 可能会被解读为 importqualified Data.List as "" :它安排,比如说,sortBy 将被找到当用“空限定符”(即没有)引用它时。但我们可以“重命名”该范围:

module Main where

import qualified Prelude as P
import qualified Data.List as P
import qualified Data.Ord as P

main :: P.IO ()
main = do -- `do` is syntax, not a name!
P.print P.. P.map P.snd P.$ P.sortBy (P.comparing P.fst)
[(4,'o'),(6,' '),(0,'H'),(1,'e'),(3,'l'),(9,'r'),(7,'W'),(10,'l'),(8,'o'),(2,'l'),(5,','),(11,'d'),(12,'!')]

唯一固定的限定符是文件本身中特定于模块的限定符:它始终位于非限定范围内,并且位于以模块自动命名的范围内。对于定义,您必须使用非限定形式。

对于模块A(模块A),这看起来几乎是假的。我认为模块导出并没有经过深思熟虑。它们仅在您引用实际模块而不仅仅是名称限定符时才能正常工作,即

module PowerPrelude (module A)
import qualified Prelude as A
import qualified Data.List as A
import qualified Data.Ord as A

不会工作。这让你想知道为什么允许申报这样的导出。这里可能确实是一个错误。

关于haskell - 为什么 Haskell 的 import-as 中的这些极端情况会起作用以及它们的作用是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23424293/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com