Я пытаюсь создать пользовательский интерфейс, чтобы пользователь мог проверить функцию с помощью функции mainMenu, но я продолжал сталкиваться с этой ошибкой:
• No instance for (Read ((String -> IO ()) -> [Char] -> [Place]))
arising from a use of ‘read’
(maybe you haven't applied a function to enough arguments?)
Это мой код:
main :: IO ()
main = do putStrLn "Rainfall Map Without A Map"
placeFile <- readFile "place.txt"
let placeData = read placeFile
putStrLn ("\nFile Loaded "++ show(length placeData)++ "places")
mainMenu placeData
mainMenu :: [Place] -> IO()
mainMenu plcs = do
putStrLn(" 1. return the name of all places")
putStrLn(" 2. Display the average rain figures of a place")
putStrLn(" 3. Display places with formatted String")
putStrLn(" 4. Return the place that have zero raingfall")
putStrLn(" 5. Replace a place with new place")
putStrLn(" 6. Save and Exit")
putStr("Please insert a number: ")
choose<- getLine
numberChoose choose plcs
numberChoose :: String -> [Place]->IO()
numberChoose "1" plcs = first plcs
numberChoose "2" plcs = second plcs
numberChoose "3" plcs = third plcs
numberChoose "4" plcs = fourth plcs
numberChoose "5" plcs = fifth plcs
numberChoose "6" plcs = sixth plcs
numberChoose _ plcs = do
putStrLn ("Error!:-- Wrong Input")
mainMenu plcs
first :: [Place]->IO()
first plcs = do
putStrLn (unlines( placeName plcs))
mainMenu plcs
second :: [Place]->IO()
second plcs = do
putStrLn "Please enter a place: "
str<- getLine
putStrLn ("Your Str Is: " ++ str)
putStrLn $ show $ placeAverageRain plcs str
mainMenu plcs
third :: [Place]->IO()
third plcs = do
putStrLn ( placeToString plcs )
mainMenu plcs
fourth :: [Place] -> IO()
fourth plcs = do
putStrLn "Please input a days"
days <- getLine
let time = (read days ::Int)
putStrLn $ show $ dryPlaceList plcs time
mainMenu plcs
fifth :: [Place]->IO()
fifth plcs = do
putStrLn "Please enter a Location: "
str<- getLine
putStrLn "Please enter a new Place: "
newPlace <- getLine
let newPlaces = (read newPlace::Place)
putStrLn "Done"
mainMenu $ replaceLocate str newPlaces plcs
sixth:: [Place]->IO()
sixth plcs = do
putStrLn $ "Bye "
writeFile "place.txt" $ show plcs
Система говорит, что ошибка l ie в "let placeData = read placeFile". Что означает ошибка и что я сделал wrg ?? Есть ли вероятность, что я использую слишком много различных типов чтения во всех моих функциях ниже, что компилятор не может распознать, какой тип данных я указываю (не уверен, что эта строка имеет какой-либо смысл в Gd).
edit: И это мой тип данных
data Place = Place String Coord [Int]
deriving (Ord,Eq,Show,Read)
data Coord = Cord Double Double
deriving (Ord ,Eq ,Show ,Read)
replaceLocate :: String -> Place -> [Place] -> [Place]
replaceLocate _ _ [] = []
replaceLocate str (Place l d rains) ((Place p c rain):xs)
| str == p = Place l d rains : replaceLocate str (Place l d rains) xs
| otherwise = Place p c rain : replaceLocate str (Place l d rains) xs