2011-04-22 21 views
1

私のリストには多くの図があります。各図は、そのリストに多数の矩形を持つことができます。私は関数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) 

答えて

3

、あなたはMaybe FigureTypeFigureTypeへの変換にData.MaybeモジュールでfromJustを使用することができます。私は、関数checkNewRectangleIdを呼び出す前に、私はそれを確認するため

let (Figure id width height rectangles) = fromJust $ findFigure idFigure x 
+0

thx非常に! – mrquestion

+2

私の意見では、もしあなたがすでに 'let'にいれば、' Just'と一致するパターンは 'fromJust $'よりもきれいに見えます。例えば ​​'let Just(Figureのidの幅の高さの長方形)= findFigure idFigure x' –

1

findFigureはたぶんモナドで動作しますが、checkNewRectangleIdはIOモナドで動作します。 Haskellは、タイプが一致しないため、あるモナドの失敗(または成功)を別のモナドの失敗(または成功)に自動的に変換しません。だから、あなた自身に質問しなければなりません。もしfindFigureが何かを見つけられなかったらどうしたいですか?あなたはidFigureが存在することが保証されていると言うので

+0

idFigureが常に存在します。 idRectangleは存在できません。この状況では、プログラムは再度checkNewRectangleId idFigure xを呼び出す必要があります。 – mrquestion

関連する問題