1

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

2 回答 2

6

该模块Data.Vector.Unboxed导出一个类型构造函数Vector,该构造函数将要存储的类型作为参数。由于您也将此模块重命名Vector为,因此此类型的限定名称为Vector.Vector. 假设您想要两个双精度向量,因此您应该像这样使用它:

data Ray = Ray (Vector.Vector Double) (Vector.Vector Double)
于 2012-06-10T18:34:56.927 回答
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

在这里,您必须指定要访问的数据类型的完整“路径”,因为该模块已作为合格导入。

还有另一种方法可以导入有资格的东西;您可以为模块“路径”指定别名,如下所示:

import qualified Data.Foo as Foo -- A module that contains "data Bar = Bar ..."

myfunction = Foo.Bar 3 2 4 -- Use Bar

我们已将该Data.Foo部分重命名为 simple 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前缀(例如Vector.null ...)。

于 2012-06-10T18:38:01.803 回答