2015-10-15 58 views
-1

我知道這個問題之前已被問過。我通過各種職位工作,但似乎無法找到解決問題的辦法。我有一個簡單的Haskell程序來創建一個值列表。然後我要麼打電話給Prelude的產品功能,要麼叫我自己的。無論如何,每次我在列表生成函數中調用這些函數時,我都會得到一個零結果。當我對列表中的值進行求和時,會正確添加值,這使我認爲乘法函數在實例化之前可能會使用該列表。該代碼lookes是這樣的:Haskell - 列表中的產品

module Main where 

... 

sumVals::[Int]->Int 
sumVals = foldr (+) 0 

multVals::[Int]->Int 
--multVals list = foldl (*) 1 list 
multVals [] = 1 
multVals (x:xs) = x * multVals xs 

... 

main :: IO() 
main = do 
    ... 
    print $ sumVals (listCreator num) -- prints correct sum value 
    print $ sum (listCreator num) -- prints correct sum value 
    print $ multVals (listCreator num) -- prints: 0 
    print $ product (listCreator num) -- prints: 0 
    print $ foldl (*) 1 (listCreator num) -- prints: 0 
    print $ product [1,1,3,1] -- prints: 3 
    let list = fib num 
    print $ multVals list -- prints: 0 
    print $ product list -- prints: 0 
+2

'listCreator'做什麼?如果它的創作有任何0,這將解釋的事情。 – dfeuer

+1

使用'Int'時,乘以2(或倍數)將最終得到0.嘗試用'Integer'代替。 – chi

+0

@chi,我甚至沒有注意到這些是「Int」。很好的接收。 – dfeuer

回答

2

我不知道該怎麼做listCreator或者什麼num是,但現在看來,listCreator num是包含0

馳在評論中提到的列表,另一種可能性是整數溢出。您可以通過切換到Integer類型來排除此情況。