我正在尝试使用此处的Vector类型实现光线数据类型:http://www.haskell.org/haskellwiki/Numeric_Haskell:_A_Vector_Tutorial#Importing_the_library
Vector只会保存双打,所以我想使用Vector类型的Unboxed版本。
以下是我要编译的代码:
module Main where
import qualified Data.Vector.Unboxed as Vector
data Ray = Ray Data.Vector.Unboxed Data.Vector.Unboxed
我得到的错误是
Not in scope: type constructor or class `Data.Vector.Unboxed'
Failed, modules loaded: none.
答案 0 :(得分:6)
模块Data.Vector.Unboxed
导出一个类型构造函数Vector
,它将您要存储的类型作为参数。由于您还将此模块重命名为Vector
,因此此类型的限定名称为Vector.Vector
。假设您需要两个双精度矢量,那么您应该像这样使用它:
data Ray = Ray (Vector.Vector Double) (Vector.Vector Double)
答案 1 :(得分:6)
通常,当您导入某些内容时,您可以这样执行:
import Data.Foo -- A module that contains "data Bar = Bar ..."
myfunction = Bar 3 2 4 -- Use Bar
如您所见,您可以直接访问Data.Foo
模块中的所有内容,就像您在同一模块中编写代码一样。
您可以改为导入具有限定条件的内容,这意味着每次访问时都必须指定所指的东西的完整模块“路径”:
import qualified Data.Foo -- A module that contains "data Bar = Bar ..."
myfunction = Data.Foo.Bar 3 2 4 -- Use Bar
在这里,您必须指定要访问的数据类型的完整“路径”,因为该模块已导入为合格。
还有另一种方法可以导入具有资格的东西;您可以为模块“path”指定别名,如下所示:
import qualified Data.Foo as Foo -- A module that contains "data Bar = Bar ..."
myfunction = Foo.Bar 3 2 4 -- Use Bar
我们已将Data.Foo
部分重命名为Foo
。这样,我们可以在引用数据构造函数时编写Foo.Bar
。
您使用别名Data.Vector.Unboxed
导入了模块Vector
。这意味着,当您要访问Vector
数据类型时,必须使用Vector.Vector
。我建议您导入这样的矢量:
import Data.Vector.Unboxed (Vector)
import qualified Data.Vector.Unboxed as Vector
这样,您可以直接导入Vector
类型,这样您就可以在没有任何模块限定符的情况下访问它,但是当您想要使用Vector
函数时,需要添加Vector
} prefix(例如Vector.null ...
)。