Haskell Ошибка :: экземпляр не найден (читай .........) - PullRequest
1 голос
/ 01 мая 2020

Я пытаюсь создать пользовательский интерфейс, чтобы пользователь мог проверить функцию с помощью функции 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...