ハスケルの関数product
は、空のリストが与えられた場合、なぜ1
を返しますか?なぜ商品[]は1を返しますか?
product :: [Int] -> Int
product lst = foldr (\x y -> x*y) 1 lst
:
ハスケルの関数product
は、空のリストが与えられた場合、なぜ1
を返しますか?なぜ商品[]は1を返しますか?
product :: [Int] -> Int
product lst = foldr (\x y -> x*y) 1 lst
:
リストは連想バイナリ操作++
で、モノイド構造を形成し、中立要素[]
。つまり、我々は
[] ++ xs = xs = xs ++ [] (xs ++ ys) ++ zs = xs ++ (ys ++ zs)
はまた、数字はモノイド構造の多くを持っていましたが、ここでは関係1は、操作が*
で、中立要素が1
あるところということです。
1 * x = x = x * 1 (x * y) * z = x * (y * z)
product
関数は、数値の数字のリストからマップだけではない:それは、数値モノイドでリストモノイド構造を反映し、モノイド準同型です。決定的に、
product (xs ++ ys) = product xs * product ys
と
product [] = 1
実際には、元を取得するために、我々はかなり後者は、私たちに強制しています。
製品はそれだけのinit値を返し、空のリストを折るときに、ウィッヒはそれをilustrateする製品実装の1
例である1の初期値を持つ倍であります正しく理解するにはfoldをご覧ください。
それは数学のことだ - これは、たとえばうまく
いつもの法律に適合しますので、あなたは、通常0
と1
なるように空の製品であることをあなたが製品の誘導定義を正当化することができ、このように空の合計を定義します - see Wikipedia
これは、乗算のカテゴリのアイデンティティです。
より実用的には:
今度はあなたが簡単な再帰でそれを実装することができますproduct [1,2,3] == product [1] * product 2:3:[]
== product [1] * product [2] * product 3:[]
== product [1] * product [2] * product [3] * product []
:
product [] = 1
product (x:xs) = x * product xs
あなたは、ハスケルであなたの数学の帽子をかぶっていることがしばしば有益だと分かります。 –