3

Matrix和构造函数都有Vectorkind *->*,所以它们看起来像值构造函数。但是当我尝试类似的东西时

instance Functor Vector a where
    fmap g ( Vector a ) = Vector ( g a )

我收到此错误:

 Not in scope: data constructor `Vector'

这是有道理的,因为let v = Vector [1..3]无论如何我都无法通过使用来制作矢量。但是检查源代码我发现 Matrix 和 Vector 构造函数都是从它们各自的模块中导出的:

Vector.hs
module Data.Packed.Vector (
    Vector,
    fromList, (|>), toList, buildVecto.. 
) where

Matrix.hs

module Data.Packed.Matrix (
    Element,
    Matrix,rows,cols...
) where

Dido 用于应用函子、monad 等。

4

2 回答 2

6

正如康拉德帕克所说,我们需要Storable实例。

使用最近的 ghc 扩展,我们可以定义一个更通用的 Functor':

{-# LANGUAGE ConstraintKinds, TypeFamilies #-}

import Numeric.LinearAlgebra
import Foreign.Storable(Storable)
import GHC.Exts (Constraint)

class Functor' c where
  type Ok c u v :: Constraint
  type Ok c u v = ()

  fmap' :: Ok c u v => (u -> v) -> c u -> c v

instance Functor' Vector where
  type Ok Vector u v = (Storable u, Storable v)
  fmap' = mapVector
于 2013-03-08T08:28:26.173 回答
2
module Data.Packed.Vector (
    Vector,
    fromList, (|>), toList, buildVecto.. 
) where

这公开了 Vector 类型,但没有公开它的任何构造函数。

您的实例声明已更正:

instance Functor Vector where
    fmap  = V.map

(假设您import Vector as V,并进一步假设您正在谈论矢量包中的矢量)。


编辑:对不起,没有看到你提到包名。对于 hmatrix Vectors,它将是 mapVector 而不是 V.map。

EDIT_ 2:正如其他人所提到的,对于 hmatrix 这将不起作用,因为 Matrix 和 Vector 需要Storeable它们的内容。

于 2013-03-07T17:58:20.183 回答