私のリストには多くの図があります。各図は、そのリストに多数の矩形を持つことができます。私は関数checkNewRectangleIdに問題があります。この関数は新しい矩形IDについて本当に新しいIDを書き、次にこのIDを返さなければならないと尋ねるべきですが、エラーがあります:予想される型IO tと推測された型figureType行(Figure id width height rectangles) <- findFigure idFigure x
は私の機能です - お手伝いできますか?サブリストに要素が存在するか確認してください
import IO
import Char
import System.Exit
import Maybe
import Data.Time.Calendar
import System.Time
checkNewRectangleId :: Int -> [FigureType] -> IO Int
checkNewRectangleId idFigure x = do
idRectangle <- getInt "Give me new rectangle id: "
(Figure id width height rectangles) <- findFigure idFigure x
if isJust (findRectangle idRectangle rectangles) then do
putStrLn ("We have yet rectangle with id " ++ show idRectangle)
checkNewRectangleId idFigure x
else return idRectangle
data FigureType = Figure Int Int Int [RectangleType] deriving(Show, Read)
data RectangleType = Rectangle Int CalendarTime deriving(Show, Read)
findFigure :: Int -> [FigureType] -> Maybe FigureType
findFigure _ [] = Nothing
findFigure n ((Figure id width height rectangles) : xs) =
if n == id then Just (Figure id width height rectangles)
else findFigure n xs
findRectangle :: Int -> [RectangleType] -> Maybe RectangleType
findRectangle _ [] = Nothing
findRectangle n ((Rectangle id date) : xs) =
if n == id then Just (Rectangle id date)
else findRectangle n xs
isInt i = not (null i) && all isDigit i
getInt :: String -> IO Int
getInt q = do
putStr q;
i <- getLine
if isInt i == False then do
putStrLn "Bad number"
getInt q
else return (read i)
thx非常に! – mrquestion
私の意見では、もしあなたがすでに 'let'にいれば、' Just'と一致するパターンは 'fromJust $'よりもきれいに見えます。例えば 'let Just(Figureのidの幅の高さの長方形)= findFigure idFigure x' –