#haskell
#haskell
Вопрос:
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
.
Пример того, что он должен возвращать:
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’
Комментарии:
1. Предложение для удобства чтения: используйте
replicate k '.'
вместо['.' | x <- [1..k]]
.
Ответ №1:
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))]]]