Matrix
和Vector
构造函数都有*->*
种类,因此它们看起来像值构造函数。但是当我尝试像
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等。
答案 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
作为其内容。