2

私は Haskell を使用しており、 aVectorを as として宣言しています

data Vector = Vector [Double]

dotここで、 2 つのベクトルの積を次のように宣言します。

dot :: Vector -> Vector -> Double
dot a b = sum $ a * b -- I already wrote Vector as an instance of Num for *.

しかし、問題は、エラーが表示されることです

Couldn't match expected type [a0] with actual type Vector

sumこれは、での操作方法がわからないことを意味すると思いVectorます。この問題にアプローチする最善の方法は何ですか?

4

5 に答える 5

6

標準ベクトルを使用していないことに気付きました。それらに切り替えることをお勧めしますが、本当にしたくない場合は、

 toList :: Vector -> [Double]
 toList (Vector a) = a

そして使う

dot a b = sum . toList $ a * b

標準ベクターに切り替える場合、3 つの選択肢があります

  1. あなたVectorをリストにして、

    import Data.Vector as V
    dot a b = sum . V.toList $ a * b
    

    シンプルですが、不必要に遅いです。

  2. より一般的なsum

    import Data.Foldable as F
    dot a b = F.sum $ a * b
    

    柔軟性があり、別の型クラスに依存しているため、奇妙な型エラーが発生する可能性があります。

  3. 別の具体的な表現を使用する (派手な言葉は​​単形性です)sum

     import Data.Vector as V
     dot a b = V.sum $ a * b
    

    最も単純ですが、もちろん、ベクトルの使用をやめると、これは壊れます。

オプション 3 をお勧めします。まだ過度に一般的である必要はありません。

于 2013-10-30T19:42:06.553 に答える
2

Prelude の sum を次のタイプで使用しています。

sum :: Num a => [a] -> a

ベクトルの合計は Data.Vector で定義されます (通常は修飾されてインポ​​ートされます)

編集: Data.Vector のものではなく、独自のデータ型を使用しているという事実を見逃しました

于 2013-10-30T19:41:55.217 に答える
2

Data.Vectorベクトルを使用していないため、実際にsumはデータ型を直接操作することはできません。型は

sum :: Num a => [a] -> a

Vector [Double]の代わりにそれを与えていますNum a => [a]。最初にベクトル内のリストを抽出する必要があります。

toList :: Vector -> [Double]
toList (Vector vals) = vals

dot :: Vector -> Vector -> Double
dot a b = sum . toList $ a * b

そうは言っても、おそらく によって提供されるベクトルを使用するData.Vectorか、少なくともVectorタイプを次のように定義する必要があります

{-# LANGUAGE DeriveFunctor #-}

import Control.Applicative

data Vector a = Vector [a] deriving (Eq, Ord, Show, Functor)

instance Applicative Vector where
    pure a = Vector [a]
    (Vector fs) <*> (Vector xs) = Vector $ zipWith ($) fs xs

instance Num a => Num (Vector a) where
    a + b = (+) <$> a <*> b
    a * b = (*) <$> a <*> b
    -- etc.

次に、Vector IntVector Double、さらにを使用できます。これは と であるため、この例が示すように、さらに多くのことができます。Vector (Int -> Double)FunctorApplicative

于 2013-10-30T20:18:42.450 に答える