2015-12-31 29 views
0

我有一个这样的导入:从其他文件哈斯克尔“进口资质”和“不在范围:数据构造”

import qualified Bioinformatics.DNA as DNA 

看起来像这样:

data DNA = A | C | G | T 
    deriving (Eq, Ord, Show) 

并在此功能在模块RNA其中:

module Bioinformatics.RNA 
    (RNA 
    , fromDna 
) where 

import qualified Bioinformatics.DNA as DNA 

data RNA = A | C | G | U 
    deriving (Eq, Ord, Show) 

fromDna :: DNA.DNA -> RNA 
fromDna DNA.A = A 
fromDna DNA.C = C 
fromDna DNA.G = G 
fromDna DNA.T = U 

我收到错误:

/home/thibaud/code/bioinformatics/src/Bioinformatics/RNA.hs:46:9: 
    Not in scope: data constructor ‘DNA.A’ 

/home/thibaud/code/bioinformatics/src/Bioinformatics/RNA.hs:47:9: 
    Not in scope: data constructor ‘DNA.C’ 

/home/thibaud/code/bioinformatics/src/Bioinformatics/RNA.hs:48:9: 
    Not in scope: data constructor ‘DNA.G’ 

/home/thibaud/code/bioinformatics/src/Bioinformatics/RNA.hs:49:9: 
    Not in scope: data constructor ‘DNA.T’ 

你有一个想法,为什么? 感谢

+0

您可能不需要'数据A; ...;数据T'类型定义。值构造函数就足够了,只要您按照下面的答案中指出的那样导出和导入它们即可。 – chi

回答

1

使用(..)导入的数据类型的所有构造函数。

import qualified Bioinformatics.DNA as DNA (DNA(..), A, C, G, T) 

代码击穿

编辑:让我们打破你的代码一点点,因为它不太习惯。

import qualified Bioinformatics.DNA as DNA (DNA(..), A, C, G, T) 

这已经很奇怪了。通常情况下,人们通过合格的或有选择的方式进口商品,而不是两者。请试试:

import qualified Bioinfomatics.DNA as DNA 

因此,让我们保持量化并放下明确的符号列表。

现在的使用,您有:

fromDna :: DNA.DNA -> RNA 
fromDna DNA.A = A 
fromDna DNA.C = C 
fromDna DNA.G = G 
fromDna DNA.T = U 

,这个功能从DNA转换为RNA的要求。注意你的questino从未展示过RNA类型或构造函数 - 是否在代码中的某些地方?您发布的代码中的其余错误与RNA相关,请考虑以下内容:

import qualified Bioinformatics.RNA as RNA 

fromDna :: DNA.DNA -> RNA.RNA 
fromDna DNA.A = RNA.A 
fromDna DNA.C = RNA.C 
fromDna DNA.G = RNA.G 
fromDna DNA.T = RNA.U 
+0

它不与DNA的工作(..),我得到同样的错误... –

+0

你确定吗?你现在应该得到不同的错误,如'“不在范围内‘A’也许你换货的其中之一:‘DNA.A’......”'。完成之后,您可能会遇到预期类型与实际类型DNA/RNA的类型错误。 –

+0

我更新了我的第一篇文章,修改了导入和RNA类型的定义。 –