3

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

応用ファンクター、モナドなどのディド。

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仮定し、さらに vector パッケージの Vector について話していると仮定します)。


編集:申し訳ありませんが、パッケージ名について言及していませんでした。hmatrix ベクトルの場合、V.map ではなく mapVector になります。

EDIT_ 2 :他の人が述べたように、 hmatrix の場合、これは機能しません。これは、Matrix と Vector がStoreableコンテンツに必要であるためです。

于 2013-03-07T17:58:20.183 に答える