我如何使用未装箱的矢量?

时间:2012-06-10 18:26:51

标签: haskell

我正在尝试使用此处的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.

2 个答案:

答案 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 ...)。