2014-06-29 115 views
1
formatBill :: BillType -> String 
formatBill bill = merge' [pname ++ dots ++ show pprice | (pname, pprice) <- bill] 
    where 
    dots = ['.' | x<-[1..(lineLength - length pname - length (show pprice))]] 

這是我的代碼 - formatBill是必須返回String的函數。Haskell範圍錯誤

它應該返回的代碼示例:

Product name.................. PRICE 
Other product................. 4555 

merge'只是[String] -> String

type BillType = [(String, Int)] -- BillType definition 
lineLength = 30 -- length of row 

這些都是錯誤的,我得到:

code.hs:69:51 :不在範圍內:`pname'

個code.hs:69:72:不在範圍:`pprice」

+2

建議的可讀性:使用'複製K」 .''而比'['。' | x < - [1..k]]'。 –

回答

5

在整個函數定義一個where條款範圍,所以你不能使用的東西,只有在列表中的理解範圍。

要麼讓dots成一個函數把他們作爲參數:

formatBill :: BillType -> String 
formatBill bill = 
    merge' [pname ++ dots pname pprice ++ show pprice | (pname, pprice) <- bill] 
    where 
    dots pname pprice = 
      ['.' | x<-[1..(lineLength - length pname - length (show pprice))]] 

或者使用let列表解析裏:

formatBill :: BillType -> String 
formatBill bill = 
    merge' [pname ++ dots ++ show pprice 
       | (pname, pprice) <- bill 
       , let dots = ['.' | x <- [1..(lineLength 
               - length pname 
               - length (show pprice))]]]