私は、Maybe a、IO a、MaybeT IO a のさまざまな組み合わせを含むプロンプト - レスポンス スタイルのシステムを作成していますが、考慮すべき点がたくさんあります。無効な入力がない (したがって MaybeT にラップされない) IO アクション、(MaybeT IO a を返す) IO アクションではないが失敗する可能性があるため、Maybe a を返すもの、および Maybe a を返すものがあります。それはただの単純な値であり、すべてを適切なタイプにするために、<$>, Just, fmap, MaybeT, lift, =<<,
との過度の組み合わせを覚えておく必要があるように思われ始めています。return
これを管理したり、必要な場所で値を取得するためにどの関数を使用する必要があるかを判断したりする簡単な方法はありますか? それとも、時間の経過とともにうまくいくことを祈る必要がありますか? これが私の例です:
getPiece :: Player -> Board -> MaybeT IO Piece
getPiece player@(Player pieces _ _ _) board = piece
where
promptString = displayToUserForPlayer player board ++ "\n" ++ (display player) ++ "\n" ++ "Enter piece number: "
input :: MaybeT IO String
input = lift $ prompt promptString
index :: MaybeT IO Int
index = MaybeT <$> return <$> ((fmap cvtFrom1indexedInt) . maybeRead) =<< input
piece :: MaybeT IO Piece
piece = MaybeT <$> return <$> maybeIndex pieces =<< index
getRotatedPiece :: Player -> Board -> MaybeT IO Piece
getRotatedPiece player@(Player pieces _ _ _) board = piece
where
promptString :: MaybeT IO String
promptString = (++) <$> displayListString <*> restOfString
input :: MaybeT IO String
input = MaybeT <$> (fmap Just) <$> prompt =<< promptString
index :: MaybeT IO Int
index = MaybeT <$> return <$> ((fmap cvtFrom1indexedInt) . maybeRead) =<< input
piece :: MaybeT IO Piece
piece = MaybeT <$> return <$> maybeIndex pieces =<< index
rotatedPieceList :: MaybeT IO [Piece]
rotatedPieceList = rotations <$> getPiece player board
displayListString :: MaybeT IO String
displayListString = displayNumberedList <$> rotatedPieceList
restOfString :: MaybeT IO String
restOfString = MaybeT <$> return <$> Just $ "\nEnter rotation number:"
型ヒントを削除したとしても、C# や Python で同じことを行うためのより短い関数を記述できる可能性があります。