Ошибка области видимости Haskell where

#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))]]]