

いま、学校の課題でHaskellを使ってタイトルにもあるようにリスト内の数字をすべて掛け合わせるコードを書いています。

例）[1,2,3,4,5] -> 120

現段階での僕のコードは以下のようになっています。

[code]

    myproduct :: (Num a) => [a] -> a
    myproduct[] = 0
    myproduct(x:xs) = x*(myproduct xs)
    
[/code]

色々なサイトなどを参照しながら書いてみたんですがどれもうまくいってません。

また、fold functionを使わないといけないのですが、どうすればいいか全くわからない状態まで来てしまいました。  
どなたか教えていただけると幸いです。また解説等も載せてくれると幸いです。  
よろしくお願いします。


CC BY-SA 4.0
2022-10-10T06:40:41.640
91526
2022-10-12T13:10:57.380
2022-10-12T11:15:20.897
3060
54742
question
haskell
Haskellを使い、リスト内の数字をすべて掛け合わせるコードを書きたい


とりあえず [Try Haskell](https://tryhaskell.org/) で動いたので

累積和の場合

[code]

    foldl (+) 0 [1 .. 10]
    -- 55
    -- :: (Enum b, Num b) => b
    
[/code]

累積積の場合

[code]

    foldl (*) 1 [1 .. 5]
    -- 120
    -- :: (Enum b, Num b) => b
    
[/code]

* * *

#### 追記

> また、fold functionを使わないといけないのですが

まず, fold使わない場合はこんな感じ

[code]

    sum []         = 0
    sum (x:xs)     = x + sum xs
    
    product []     = 1
    product (x:xs) = x * product xs
    
[/code]

fold使うと (最初に書いたように)こんな感じ

[code]

    sum     = foldr (+) 0
    product = foldr (*) 1
    
[/code]

`foldl`使うか `foldr`使うかは(内容に合わせて)適当に。  
例えば `foldr (+) 0 [1,2,3]` なら  
`1:(2:(3:[]))` のようになり  
`1+(2+(3+0))` のように変換されます


CC BY-SA 4.0
2022-10-10T09:21:47.510
91527
2022-10-12T13:10:57.380
2022-10-12T13:10:57.380
43025
43025
91526
answer


0に何をかけても0になので、

[code]

    myproduct[] = 0
    
[/code]

だと、必ず答えは0になってしまいます。

[code]

    myproduct[] = 1
    
[/code]

とすれば、うまくいくはずです。


CC BY-SA 4.0
2022-10-10T12:26:39.503
91532
2022-10-10T12:26:39.503
3605
91526
answer