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 Int
、Vector Double
、さらにを使用できます。これは と であるため、この例が示すように、さらに多くのことができます。Vector (Int -> Double)
Functor
Applicative