Changing move function signature to match state method in preparation for next presentation
This commit is contained in:
parent
6d5e78c0a9
commit
cd9b71c03e
@ -1,5 +1,7 @@
|
|||||||
module Homework.Ch01.Hanoi where
|
module Homework.Ch01.Hanoi where
|
||||||
|
|
||||||
|
import Data.Maybe
|
||||||
|
|
||||||
newtype Peg = Peg ()
|
newtype Peg = Peg ()
|
||||||
|
|
||||||
data Move = Move {moveFrom :: String, moveTo :: String} deriving (Eq, Show)
|
data Move = Move {moveFrom :: String, moveTo :: String} deriving (Eq, Show)
|
||||||
@ -15,9 +17,9 @@ hanoi numDisks pegLabelA pegLabelB pegLabelC =
|
|||||||
(pegLabelB, []),
|
(pegLabelB, []),
|
||||||
(pegLabelC, [])
|
(pegLabelC, [])
|
||||||
]
|
]
|
||||||
in Right $ snd $ move pegs
|
in Right . return . fromJust . fst $ move pegs
|
||||||
|
|
||||||
move :: Pegs -> (Pegs, [Move])
|
move :: Pegs -> (Maybe Move, Pegs)
|
||||||
move pegs =
|
move pegs =
|
||||||
let (firstPegLabel, firstPeg) = head pegs
|
let (firstPegLabel, firstPeg) = head pegs
|
||||||
(lastPegLabel, lastPeg) = last pegs
|
(lastPegLabel, lastPeg) = last pegs
|
||||||
@ -26,13 +28,13 @@ move pegs =
|
|||||||
canMove = firstPegDisc < lastPegDisc
|
canMove = firstPegDisc < lastPegDisc
|
||||||
in if canMove
|
in if canMove
|
||||||
then
|
then
|
||||||
( [ (firstPegLabel, init firstPeg),
|
( Just $ Move firstPegLabel lastPegLabel,
|
||||||
|
[ (firstPegLabel, init firstPeg),
|
||||||
head $ tail pegs,
|
head $ tail pegs,
|
||||||
(lastPegLabel, lastPeg <> [firstPegDisc])
|
(lastPegLabel, lastPeg <> [firstPegDisc])
|
||||||
],
|
]
|
||||||
[Move firstPegLabel lastPegLabel]
|
|
||||||
)
|
)
|
||||||
else (pegs, [])
|
else (Nothing, [])
|
||||||
|
|
||||||
fillPegWithDiscs :: Int -> [Disc]
|
fillPegWithDiscs :: Int -> [Disc]
|
||||||
fillPegWithDiscs numDisks = Disc <$> reverse [1 .. numDisks]
|
fillPegWithDiscs numDisks = Disc <$> reverse [1 .. numDisks]
|
||||||
|
Loading…
Reference in New Issue
Block a user