2014-04-29 47 views
1

所以我需要編寫一個返回整數列表的產品的程序。這是我試圖做的。但每當我在第四行的=號上得到「分析錯誤」時。Haskell列表的產品

--product.hs 
    product :: [Integer] -> Integer 
    product []  = 1 
    product i f = foldl (*) 1 [i..f] 


    main = do 
      print "Please enter first number" 
      i <- readLn 
      print "Please enter second number" 
      f <- readLn 
     print "The result is:" 
     print (product i f) 

我也試圖與

product (x:xs) = x * product xs 

,但它仍然給我解析錯誤=符號

+1

什麼是「整數列表的產物」?我想你是說,列表中整數的乘積。 – leftaroundabout

回答

4

在下面的代碼

product :: [Integer] -> Integer 
product []  = 1 
product i f = foldl (*) 1 [i..f] 

聲明的product類型是[Integer] -> Integer,但在第二個條款中,您給它兩個參數,這顯然不符合它的類型。

您可以定義它只是像這樣

product xs = foldl (*) 1 xs 

,並使用它像這樣

product [i..f] 

順便說一句,productPrelude提供的標準功能,具有類似(更好)類型和相同的功能。

+1

With _a better_type:'product :: Num a => [a] - > a'。 – leftaroundabout

+0

@leftaroundabout是的,你是對的。 –

+0

甚至無意識地用'product = foldl(*)1' – ScarletAmaranth

-2

您的分析錯誤可能是由於縮進不一致。一個好的建議是隻使用空格來縮進。雖然可以使用製表符,但使用不按Haskell的方式精確處理製表符的編輯器很容易。

在這裏,所有的函數聲明都需要垂直對齊,就像do塊中的所有語句一樣。

+0

有趣的是,如何唯一解釋實際問題的原因*問*讓你失望。 (是的,我知道另一個答案解釋了稍後會顯示的內容,但它沒有解釋他們*解析錯誤。) –