Haskell - In einer Liste gespeicherte Benutzereingaben
Ich möchte eine Benutzereingabe aufnehmen und als Liste speichern, die ich später durchsuchen kann. Im Moment habe ich eine leere Liste namens "Sales" und diese Funktion, um eine Eingabe aufzunehmen und in dieser Liste zu speichern.
sales = []
recordPurchase :: IO ()
recordPurchase = do
putStrLn "Manufacturer"
manufacturer <- getLine
putStrLn "Product Name"
product <- getLine
let sales = sales ++ [manufacturer, product]
print sales
Im Moment bekomme ich eine
"*** Exception: <<loop>>"
Error. Dieser spezielle Fehler ist jetzt behoben, es lag an der Leitung
let sales = sales ++ [manufacturer, product]
Ich bin mir jedoch nicht sicher, wie man zwei Listen miteinander kombiniert, wie es scheint. Selbst als es "funktionierte" bekam ich immer noch eine leere Liste, als der Verkauf gedruckt wurde. Ich weiß nicht, ob ich hier überhaupt auf dem richtigen Weg bin, insbesondere mit der Funktionsdefinition als "IO()".
Der Bonusteil hier ist, wenn ich eine Liste ausfüllen könnte, wie könnte ich sie dann durchsuchen und bestimmte Elemente anzeigen, z. B. Produkte eines bestimmten Herstellers?
Sie können Variablen in Haskell nicht mutieren. Alle Haskell-Variablen sind unveränderlich.
-- `sales` is now defined as `[]`. It cannot be changed, ever.
sales = []
recordPurchase :: IO ()
recordPurchase = do
putStrLn "Manufacturer"
manufacturer <- getLine
putStrLn "Product Name"
product <- getLine
-- Here, you define a new value called `sales`,
-- which is recursively defined, since it refers to itself.
-- This causes a loop.
let sales = sales ++ [manufacturer, product]
print sales
Um zu sehen, warum dies eine Schleife verursacht, betrachten Sie die Definition von sales
als Gleichung: sales = sales ++ [manufacturer, product]
:
sales
= sales ++ [manufacturer, product]
= sales ++ [manufacturer, product] ++ [manufacturer, product]
= sales ++ [manufacturer, product] ++ [manufacturer, product] ++ [manufacturer, product]
= (etc)
Was du wahrscheinlich meinst ist folgendes:
recordPurchase :: IO ()
recordPurchase = do
putStrLn "Manufacturer"
manufacturer <- getLine
putStrLn "Product Name"
product <- getLine
print [manufacturer, product]
Die übliche Art der Datenspeicherung ist jedoch die Rekursion. Wir würden es ein bisschen so machen (Pseudocode):
mainLoop :: [String] -> IO ()
mainLoop sales = do
-- Get new sales info
newInfo <- getNewInfo
-- Define a new list with the extra info
let newSales = sales ++ [newInfo]
-- Do something with the sales info, e.g. print it
print newInfo
-- Go through the 'loop' again, with the new sales info.
mainLoop newSales
-- The main program is just the main loop with initial value of `[]`:
main = mainLoop []