Haskell IO无法返回';t匹配类型‘;[字符]’;与‘;Char’;预期类型:字符串实际类型:[字符串]

Haskell IO无法返回';t匹配类型‘;[字符]’;与‘;Char’;预期类型:字符串实际类型:[字符串],haskell,Haskell,嗨,我正在尝试创建一个用户界面,用户可以在主菜单中选择来测试功能 data Place = Place String Coord [Int] deriving (Ord,Eq,Show,Read) data Coord = Cord Double Double deriving (Ord ,Eq ,Show ,Read) placeName :: [Place] -> [String] placeName []

嗨,我正在尝试创建一个用户界面,用户可以在主菜单中选择来测试功能


data Place =  Place String Coord [Int] 
             deriving (Ord,Eq,Show,Read)

data Coord =  Cord Double Double
             deriving (Ord ,Eq ,Show ,Read)


placeName :: [Place] -> [String]
placeName []       = [""]
placeName plcs   = [s | (Place s x(n:ns))<-plcs] 




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 $  placeName plcs
   mainMenu  plcs 

putStrLn
具有类型,因此它只打印一个字符串,而不是字符串列表

您可以利用对每个元素执行一元函数,因此:

first :: [Place] -> IO ()
first plcs  = do
   mapM_ putStrLn (placeName plcs)
   mainMenu  plcs
first :: [Place] -> IO ()
first plcs  = do
   mapM_ putStrLn (placeName plcs)
   mainMenu  plcs
first :: [Place] -> IO ()
first plcs  = do
   putStrLn (unlines (placeName plcs))
   mainMenu  plcs