Haskellで、リスト(2次元)の内積計算を定義してみます。
ここで取り扱う内積の定義は、対応する要素の積の和として定義します。
例:
[1, 2, 3] と[ 4, 5, 6]の内積は、1 * 4 + 2 * 5 + 3 * 6 = 32ってな具合に。
高階関数であるzipWithを使ってまずは、内積を定義します。
zipWithは、関数を引数にとる関数で、
zipWith :: (a -> b -> c) -> [a] -> [b] -> [c]
と定義されてます。
この定義は、
二つのジェネリックな引数をとり、一つのジェネリックな戻り値を返す関数を、最初の引数にとり、
続いて、二つのリスト(※)を引数に取り、リストを返す関数という定義です。
※ジェネリックな要素を持つ
自然言語でひと呼吸で、ここいら辺を表記するのは難しいですね。 まぁいいや...。
そしたら内積定義へ。
zipWithを使った内積定義
innerprdct::[Int]->[Int]->Int
innerprdct xf xs = sum (zipWith (*) xf xs)
なんという、簡潔さ。
次に、リスト内包表記と、関数zipを使って定義してみます。これはちょっと、簡潔ではないけど、
リスト内包表記の一例として。
リスト内包表記とzipによる内積定義
innerprdct::[Int]->[Int]->Int
innerprdct xf xs = sum [f * s | (f,s) <- zip xf xs]
あえて、
どちらが、Haskellらしいかっていえば、高階関数zipWithを利用した方かな?
学ぶところが、大きく、教育的なのは、リスト内包表記の方なのかなぁ?
<ーだって、zipWithの方が、頭使わないし。