не может соответствовать ожидаемому типу IO т - PullRequest
2 голосов
/ 18 апреля 2011

Не могли бы вы рассказать мне, почему у меня ошибка «Не удалось сопоставить ожидаемый тип IO t с предполагаемым типом String» - см. Ниже, чтобы увидеть неверную строку:

data RectangleType = Rectangle Int Int Int deriving(Show)

menuRectangles :: [RectangleType] -> IO [RectangleType]
menuRectangles rs = do
    putStrLn "Please choose option:"
    putStrLn "3 - Show all rectangles"
    putStrLn "4 - Quit"
    putStr "Number: "
    n <- getLine
    case n of
        "3"         ->  do { showRectangles rs; menuRectangles rs }  -- this line is wrong
        "4"         ->  do { putStrLn "Quitting"; return rs }
        otherwise   ->  do { putStrLn "The End"; return rs }

showRectangles :: [RectangleType] -> String
showRectangles x = showingRectangles x

showingRectangles [] = "Empty"
showingRectangles (x:xs) = do printRectangle x
                              showingRectangles xs

printRectangle :: RectangleType -> String
printRectangle (Rectangle id width height) = "id: " ++ show id ++ "width: " ++ show width ++ "height: " ++ show height ++ "\n";

Ответы [ 2 ]

5 голосов
/ 18 апреля 2011
  1. showingRectangles - это чистая функция, возвращающая строку.Зачем использовать запись do здесь?Измените его на printRectangle x ++ showingRectangles xs.

  2. Поскольку showRectangles - это просто функция, она не будет выводиться на консоль.«Заявление» showRectangles rs поэтому недопустимо.Вам нужно putStrLn it.

    "3" -> do { putStrLn (showRectangles rs); menuRectangles rs }
    

(Кстати, с помощью этого простого исправления showingRectangles всегда будет показывать Empty в последней строке. Вам нужно добавить одинбольше определения функции, чтобы избежать этого.)

1 голос
/ 18 апреля 2011

Возьмите больше от ввода-вывода, чтобы вы могли видеть, что происходит в вашем блоке do:

  data RectangleType = Rectangle Int Int Int deriving (Show)

  menuRectangles :: [RectangleType] -> IO [RectangleType]
  menuRectangles rs = do
    putStr options
    n <- getLine
    case n of
        "3"        -> putStrLn (showRectangles rs) >> menuRectangles rs  
        "4"        -> putStrLn "Quitting"          >> return rs 
        otherwise  -> putStrLn "The End"           >> return rs 

  showRectangles :: [RectangleType] -> String
  showRectangles [] = "Empty"
  showRectangles xs = concat (map showRectangle xs)

  showRectangle :: RectangleType -> String
  showRectangle (Rectangle id width height) = 
              "id: "      ++ show id ++ 
              " width: "  ++ show width ++ 
              " height: " ++ show height ++ "\n"

  options ::  String
  options =   "Please choose option:\n" ++
              "3 - Show all rectangles\n" ++
              "4 - Quit\n" ++ 
              "Number "

  -- for testing:
  r n = Rectangle n n n
  rectangleList = map r [1..10]
  testlist = showRectangles rectangleList 
  testempty = showRectangles []
  testio = menuRectangles rectangleList
...