fugafuga.write

日々のログ

すごいH本 part41

三次元ベクトルの型とベクトルの演算を作る

data Vector a = Vector a a a deriving (Show)

vplus :: (Num a) => Vector a -> Vector a -> Vector a
(Vector i j k) `vplus` (Vector l m n) = Vector (i+l) (j+m) (k+n)

dotProd :: (Num a) => Vector a -> Vector a -> a
(Vector i j k) `dotProd` (Vector l m n) = i*l + j*m + k*n

vmult :: (Num a) => Vector a -> a -> Vector a
(Vector i j k) `vmult` m = Vector (i*m) (j*m) (k*m)

これらの関数は、

  • ベクトルの加算
  • ベクトルの内積
  • ベクトルをスカラー倍する

実行結果

*Main> Vector 3 5 8 `vplus` Vector 9 2 8
Vector 12 7 16
*Main> Vector 3 5 8 `vplus` Vector 9 2 8 `vplus` Vector 0 2 3
Vector 12 9 19
*Main> Vector 3 9 7 `vmult` 10
Vector 30 90 70
*Main> Vector 4 9 5 `dotProd` Vector 9.0 2.0 4.0
74.0
*Main> Vector 2 9 3 `vmult` (Vector 4 9 5 `dotProd` Vector 9 2 4)
Vector 148 666 222

ポイント

  • Vector a という型なので Vector Int も Vector Float が使える
  • 型クラス制約の Num a が関数に指定されているので Vector Char などは使えない
  • Vector Int と Vector Double を加算したりはできない

所感

ベクトルの内積を調べていたが、高校時代に数学がよくわからなかった理由が「何故そうなるのか?それをなんのために使うのか?」がわからなかったため。教師もそこまで説明していると消化するべきカリキュラムが終わらなかったのだと思う。しかし、以下の記事を読むとしっくり来る回答があった。

ベクトルの内積とは - 大人になってからの再学習

たまたまそうなる、という捉え方ができていればもう少し数学を楽しめたかもしれない。化学や物理と同じように現象としてそうなっているということをもっと不思議に感じておけば興味を持って取り組めたのではないかと今更ながら思った。

すごいHaskellたのしく学ぼう!

すごいHaskellたのしく学ぼう!

  • 作者: MiranLipovaca
  • 出版社/メーカー: オーム社
  • 発売日: 2017/07/14
  • メディア: Kindle版
  • 購入: 4人 クリック: 9回
  • この商品を含むブログを見る