使用`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(..))
同样,在模块中C,Not构造函数将不在范围内。这一次,是因为它不是由 导入的B,因此不是由它导出的。
THE END
二维码