如何从hmatrix库中创建Matrix和Vector的仿函数实例?

时间:2013-03-07 17:50:28

标签: haskell

MatrixVector构造函数都有*->*种类,因此它们看起来像值构造函数。但是当我尝试像

这样的东西时
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 for applicative functor,monad等。

2 个答案:

答案 0 :(得分:6)

正如Conrad Parker所述,我们需要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

答案 1 :(得分:2)

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

这会暴露Vector类型,但不会暴露任何构造函数。

您的实例声明已更正:

instance Functor Vector where
    fmap  = V.map

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


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

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