使用`Path(..)`导入时为什么“'Path'的数据构造函数并不都在范围内”

当前包间接导入构造函数Path(..),该构造函数在更靠近源的导入链的模块中可用于派生,Read但是当我稍后尝试在独立的派生子句中使用它时,我得到

  • Can't make a derived instance of ‘Read (Path Abs Dir)’:
            The data constructors of ‘Path’ are not all in scope
              so you cannot derive an instance for it
        • In the stand-alone deriving instance for ‘Read (Path Abs Dir)’

模块代码没有给出错误和导入Path(..)。导入中缺少什么?

{-# LANGUAGE FlexibleContexts      #-}
{-# LANGUAGE FlexibleInstances     #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE OverloadedStrings     #-}
{-# LANGUAGE TypeSynonymInstances  #-}
{-# LANGUAGE StandaloneDeriving  #-}

module Uniform.Convenience.StartApp(
    module Uniform.Convenience.StartApp
        )   where


import UniformBase
import UniformBase (Path(..), Read(..))

data Aby = Aby44 Int  (Path Abs Dir)  deriving (Eq, Ord, Show )
deriving instance Read (Path Abs Dir) 

回答

这个的最小版本看起来像:

module A (Foo(Exported)) where
data Foo = Exported | Not

module B where
import A(Foo(..))

由于Not不是从 导出A,因此无法导入,即使是通过语法import A(Foo(..)). 只会Exported在范围内B

类似的事情发生在你身上:在导入链的某个地方,一个模块选择不导出至少一个 的构造函数Path,出于某种原因(可能部分是为了防止Read实例;-)。

你说:

在讨论的情况下,导入和导出始终都是模块导出的内容(如您在所示模块中看到的导出内容module xx)。

您可能会发现有关出口的报告部分的摘录很有趣:

形式“模块 M”命名范围内所有实体的集合,同时具有非限定名称“e”和限定名称“Me”。

特别地,考虑

module A (module A) where data Foo = Exported | Not
module B (module A) where import A(Foo(Exported))
module C where import B(Foo(..))

同样,在模块中CNot构造函数将不在范围内。这一次,是因为它不是由 导入的B,因此不是由它导出的。


以上是使用`Path(..)`导入时为什么“'Path'的数据构造函数并不都在范围内”的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>