❋✉♥❝t✐♦♥❛❧ Pr♦❣r❛♠♠✐♥❣ ❈♦♥t✐♥✉❛t✐♦♥ ▼♦♥❛❞ ❛♥❞ ▼♦♥❛❞ ❚r❛♥s❢♦r♠❡rs ❏❡✈❣❡♥✐ ❑❛❜❛♥♦✈ ❉❡♣❛rt♠❡♥t ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ❯♥✐✈❡rs✐t② ♦❢ ❚❛rt✉
■♥tr♦❞✉❝t✐♦♥ Pr❡✈✐♦✉s❧② ♦♥ ❋✉♥❝t✐♦♥❛❧ Pr♦❣r❛♠♠✐♥❣ ▼♦♥❛❞✐❝ ❧❛✇s ▼♦♥❛❞ ❝❧❛ss ✭ > >= ❛♥❞ r❡t✉r♥ ✮ ▼♦♥❛❞P❧✉s ❝❧❛ss ✭ ♠③❡r♦ ❛♥❞ ♠♣❧✉s ✮ do ✲♥♦t❛t✐♦♥ ▼❛②❜❡✱ ▲✐st ❛♥❞ ❙t❛t❡ ♠♦♥❛❞s ■❖ ♠♦♥❛❞ ▼♦♥❛❞✐❝ Pr❡❧✉❞❡
■♥tr♦❞✉❝t✐♦♥ Pr❡✈✐♦✉s❧② ♦♥ ❋✉♥❝t✐♦♥❛❧ Pr♦❣r❛♠♠✐♥❣ ▼♦♥❛❞✐❝ ❧❛✇s ▼♦♥❛❞ ❝❧❛ss ✭ > >= ❛♥❞ r❡t✉r♥ ✮ ▼♦♥❛❞P❧✉s ❝❧❛ss ✭ ♠③❡r♦ ❛♥❞ ♠♣❧✉s ✮ do ✲♥♦t❛t✐♦♥ ▼❛②❜❡✱ ▲✐st ❛♥❞ ❙t❛t❡ ♠♦♥❛❞s ■❖ ♠♦♥❛❞ ▼♦♥❛❞✐❝ Pr❡❧✉❞❡
❖✈❡r✈✐❡✇ ❈♦♥t ♠♦♥❛❞ ✶ ▼♦♥❛❞✐❝ ❚r❛♥s❢♦r♠❡rs ✷
❖✉t❧✐♥❡ ❈♦♥t ♠♦♥❛❞ ✶ ▼♦♥❛❞✐❝ ❚r❛♥s❢♦r♠❡rs ✷
❈♦♥t✐♥✉❛t✐♦♥s sq✉❛r❡ ❡①❛♠♣❧❡ ✶ ◆♦ ❝♦♥t✐♥✉❛t✐♦♥s✿ sq✉❛r❡ ✿✿ ■♥t ✦ ■♥t sq✉❛r❡ ① ❂ ① ✧ ✷ ♠❛✐♥ ❂ do let ① ❂ sq✉❛r❡ ✹ ♣r✐♥t ①
❈♦♥t✐♥✉❛t✐♦♥s sq✉❛r❡ ❡①❛♠♣❧❡ ✷ ❈♦♥t✐♥✉❛t✐♦♥✲♣❛ss✐♥❣ st②❧❡✿ sq✉❛r❡ ✿✿ ■♥t ✦ ✭ ■♥t ✦ ❛ ✮ ✦ ❛ sq✉❛r❡ ① ❦ ❂ ❦ ✭ ① ✧ ✷✮ ♠❛✐♥ ❂ sq✉❛r❡ ✹ ♣r✐♥t
❈♦♥t ❈♦♥t ❞❡✜♥✐t✐♦♥ newtype ❈♦♥t r ❛ ❂ ❈♦♥t ❢ r✉♥❈♦♥t ✿✿ ✭ ❛ ✦ r ✮ ✦ r ❣ sq✉❛r❡ ❡①❛♠♣❧❡ ✸ ❈♦♥t✐♥✉❛t✐♦♥ ❤✐❞❞❡♥ ❜❡❤✐♥❞ ❛ ♠♦♥❛❞✿ sq✉❛r❡ ✿✿ ■♥t ✦ ❈♦♥t r ■♥t sq✉❛r❡ ① ❂ r❡t✉r♥ ✭ ① ✧ ✷✮ ♠❛✐♥ ❂ r✉♥❈♦♥t ✭ sq✉❛r❡ ✹✮ ♣r✐♥t
❈♦♥t ❈♦♥t ❞❡✜♥✐t✐♦♥ newtype ❈♦♥t r ❛ ❂ ❈♦♥t ❢ r✉♥❈♦♥t ✿✿ ✭ ❛ ✦ r ✮ ✦ r ❣ instance ▼♦♥❛❞ ✭ ❈♦♥t r ✮ where r❡t✉r♥ ❛ ❂ ✕ ❦ ✦ ❦ ❛ ♠ > >= ❢ ❂ ✕ ❦ ✦ ♠ ✭ ✕ ❛ ✦ ❢ ❛ ❦ ✮
❈♦♥t ❈♦♥t ❞❡✜♥✐t✐♦♥ newtype ❈♦♥t r ❛ ❂ ❈♦♥t ❢ r✉♥❈♦♥t ✿✿ ✭ ❛ ✦ r ✮ ✦ r ❣ instance ▼♦♥❛❞ ✭ ❈♦♥t r ✮ where r❡t✉r♥ ❛ ❂ ❈♦♥t ✩ ✕ ❦ ✦ ❦ ❛ ✭ ❈♦♥t ❝ ✮ > >= ❢ ❂ ❈♦♥t ✩ ✕ ❦ ✦ ❝ ✭ ✕ ❛ ✦ r✉♥❈♦♥t ✭ ❢ ❛ ✮ ❦ ✮ ❙✐♥❝❡ ❈♦♥t ✐s ❛ newtype ✦
❈♦♥t sq✉❛r❡ ❡①❛♠♣❧❡ ✹ ❲❤❛t ✐s t❤❡ r❡s✉❧t❄ sq✉❛r❡ ✿✿ ■♥t ✦ ❈♦♥t r ■♥t sq✉❛r❡ ① ❂ r❡t✉r♥ ✭ ① ✧ ✷✮ ❛❞❞❚❤r❡❡ ✿✿ ■♥t ✦ ❈♦♥t r ■♥t ❛❞❞❚❤r❡❡ ① ❂ r❡t✉r♥ ✭ ① ✰ ✸✮ ♠❛✐♥ ❂ r✉♥❈♦♥t ✭ sq✉❛r❡ ✹ > >= ❛❞❞❚❤r❡❡ ✮ ♣r✐♥t
❈♦♥t sq✉❛r❡ ❡①❛♠♣❧❡ ✹ ❲❤❛t ✐s t❤❡ r❡s✉❧t❄ sq✉❛r❡ ✿✿ ■♥t ✦ ❈♦♥t r ■♥t sq✉❛r❡ ① ❂ r❡t✉r♥ ✭ ① ✧ ✷✮ ❛❞❞❚❤r❡❡ ✿✿ ■♥t ✦ ❈♦♥t r ■♥t ❛❞❞❚❤r❡❡ ① ❂ r❡t✉r♥ ✭ ① ✰ ✸✮ ♠❛✐♥ ❂ r✉♥❈♦♥t ✭ sq✉❛r❡ ✹ > >= ❛❞❞❚❤r❡❡ ✮ ♣r✐♥t ❖✉t♣✉t Main> main 19
❝❛❧❧❈❈ ❝❛❧❧❈❈ ❞❡✜♥✐t✐♦♥ ❝❛❧❧❈❈ ❝❛♣t✉r❡s t❤❡ ❝✉rr❡♥t ❝♦♥t✐♥✉❛t✐♦♥ ❛♥❞ ♣❛ss❡s ✐t ❛s ❛♥ ❛r❣✉♠❡♥t✳ ❝❛❧❧❈❈ ✿✿ ✭✭ ❛ ✦ ❈♦♥t r ❜ ✮ ✦ ❈♦♥t r ❛ ✮ ✦ ❈♦♥t r ❛
❝❛❧❧❈❈ ❝❛❧❧❈❈ ❡①❛♠♣❧❡ ✶ ❦ ✐s t❤❡ ❝✉rr❡♥t ❝♦♥t✐♥✉❛t✐♦♥✱ ❝❛❧❧✐♥❣ ❦ ❝❛✉s❡s ✐♠♠❡❞✐❛t❡ r❡t✉r♥✳ ❝❛❧❧❈❈ ✿✿ ✭✭ ❛ ✦ ❈♦♥t r ❜ ✮ ✦ ❈♦♥t r ❛ ✮ ✦ ❈♦♥t r ❛ ❜❛r ✿✿ ❈♦♥t r ■♥t ❜❛r ❂ ❝❛❧❧❈❈ ✩ ✕ ❦ ✦ do let ♥ ❂ ✺ ❦ ♥ r❡t✉r♥ ✷✺ ♠❛✐♥ ❂ r✉♥❈♦♥t ❜❛r ♣r✐♥t ❆❧✇❛②s ♣r✐♥ts ✺✳
❝❛❧❧❈❈ ❝❛❧❧❈❈ ❡①❛♠♣❧❡ ✷ ❢♦♦ ✿✿ ■♥t ✦ ❈♦♥t r ❙tr✐♥❣ ❢♦♦ ♥ ❂ ❝❛❧❧❈❈ ✩ ✕ ❦ ✦ do let ♥ ✵ ❂ ♥ ✧ ✷ ✰ ✸ ✇❤❡♥ ✭ ♥ ✵ ❃ ✷✵✮ ✩ ❦ "over twenty" r❡t✉r♥ ✭ s❤♦✇ ✩ ♥ ✵ � ✹✮ ❖✉t♣✉t Main> runCont (foo 5) print over twenty Main> runCont (foo 4) print 15
❝❛❧❧❈❈ ❝❛❧❧❈❈ ❡①❛♠♣❧❡ ✸ ❊①❝❡♣t✐♦♥s ❛r❡ s✐♠♣❧❡r t❤❛♥ ❝♦♥t✐♥✉❛t✐♦♥s✿ ❞✐✈❊①❝♣t ① ② ❤❛♥❞❧❡r ❂ ❝❛❧❧❈❈ ✩ ✕ ♦❦ ✦ do ❡rr ✥ ❝❛❧❧❈❈ ✩ ✕ ♥♦t❖❦ ✦ do ✇❤❡♥ ✭ ② ✑ ✵✮ ✩ ♥♦t❖❦ "Denominator 0" ♦❦ ✩ ① ❵ ❞✐✈ ❵ ② ❤❛♥❞❧❡r ❡rr ❖✉t♣✉t Main> runCont (divExcpt 10 2 error) id 5 Main>runCont (divExcpt 10 0 error) id *** Exception: Denominator 0
❝❛❧❧❈❈ ❝❛❧❧❈❈ ❡①❛♠♣❧❡ ✹ fun :: Int -> String fun n = (‘runCont‘ id) $ do str <- callCC $ \exit1 -> do when (n < 10) (exit1 (show n)) let ns = map digitToInt (show (n ‘div‘ 2)) n’ <- callCC $ \exit2 -> do when ((length ns) < 3) (exit2 (length ns)) when ((length ns) < 5) (exit2 n) when ((length ns) < 7) $ do let ns’ = map intToDigit (reverse ns) exit1 (dropWhile (==’0’) ns’) return $ sum ns return $ "(ns = " ++ (show ns) ++ ") " ++ (show n’) return $ "Answer: " ++ str
❝❛❧❧❈❈ ❝❛❧❧❈❈ ❡①❛♠♣❧❡ ✹ ■♥♣✉t ✭♥✮ ❖✉t♣✉t ▲✐st ❙❤♦✇♥ ✵✲✾ ♥ ♥♦♥❡ ✶✵✲✶✾✾ ♥✉♠❜❡r ♦❢ ❞✐❣✐ts ✐♥ ✭♥✴✷✮ ❞✐❣✐ts ♦❢ ✭♥✴✷✮ ✷✵✵✲✶✾✾✾✾ ♥ ❞✐❣✐ts ♦❢ ✭♥✴✷✮ ✷✵✵✵✵✲✶✾✾✾✾✾✾ ✭♥✴✷✮ ❜❛❝❦✇❛r❞s ♥♦♥❡ ❃❂ ✷✵✵✵✵✵✵ s✉♠ ♦❢ ❞✐❣✐ts ♦❢ ✭♥✴✷✮ ❞✐❣✐ts ♦❢ ✭♥✴✷✮
❝❛❧❧❈❈ ❝❛❧❧❈❈ ❞❡✜♥✐t✐♦♥ ✷ class ✭ ▼♦♥❛❞ ♠ ✮ ✮ ▼♦♥❛❞❈♦♥t ♠ where ❝❛❧❧❈❈ ✿✿ ✭✭ ❛ ✦ ♠ ❜ ✮ ✦ ♠ ❛ ✮ ✦ ♠ ❛ instance ▼♦♥❛❞❈♦♥t ✭ ❈♦♥t r ✮ where ❝❛❧❧❈❈ ❢ ❂ ❈♦♥t ✩ ✕ ❦ ✦ r✉♥❈♦♥t ✭ ❢ ✭ ✕ ❛ ✦ ❈♦♥t ✩ ✕ ✦ ❦ ❛ ✮✮ ❦
❖✉t❧✐♥❡ ❈♦♥t ♠♦♥❛❞ ✶ ▼♦♥❛❞✐❝ ❚r❛♥s❢♦r♠❡rs ✷
▼♦♥❛❞✐❝ ❚r❛♥s❢♦r♠❡rs ❖✉t❧✐♥❡ ❲❡ ✇✐❧❧ ❜❡❣✐♥ ❜② s✐♠♣❧✐❢②✐♥❣ t❤❡ ♣r❡✈✐♦✉s ❡①❛♠♣❧❡ ❚❤❡♥ ✇❡ ✇✐❧❧ tr② t♦ ❡♥❤❛♥❝❡ ✐t ❜② ❛❞❞✐♥❣ s♦♠❡ ■❖ ❋✐♥❛❧❧② ✇❡ ✇✐❧❧ ❣❡♥❡r❛❧✐③❡ t❤❡ ❛♣♣r♦❛❝❤ t♦ ❛r❜✐tr❛r② ♠♦♥❛❞s
▼♦♥❛❞✐❝ ❚r❛♥s❢♦r♠❡rs ❖✉t❧✐♥❡ ❲❡ ✇✐❧❧ ❜❡❣✐♥ ❜② s✐♠♣❧✐❢②✐♥❣ t❤❡ ♣r❡✈✐♦✉s ❡①❛♠♣❧❡ ❚❤❡♥ ✇❡ ✇✐❧❧ tr② t♦ ❡♥❤❛♥❝❡ ✐t ❜② ❛❞❞✐♥❣ s♦♠❡ ■❖ ❋✐♥❛❧❧② ✇❡ ✇✐❧❧ ❣❡♥❡r❛❧✐③❡ t❤❡ ❛♣♣r♦❛❝❤ t♦ ❛r❜✐tr❛r② ♠♦♥❛❞s
▼♦♥❛❞✐❝ ❚r❛♥s❢♦r♠❡rs ❖✉t❧✐♥❡ ❲❡ ✇✐❧❧ ❜❡❣✐♥ ❜② s✐♠♣❧✐❢②✐♥❣ t❤❡ ♣r❡✈✐♦✉s ❡①❛♠♣❧❡ ❚❤❡♥ ✇❡ ✇✐❧❧ tr② t♦ ❡♥❤❛♥❝❡ ✐t ❜② ❛❞❞✐♥❣ s♦♠❡ ■❖ ❋✐♥❛❧❧② ✇❡ ✇✐❧❧ ❣❡♥❡r❛❧✐③❡ t❤❡ ❛♣♣r♦❛❝❤ t♦ ❛r❜✐tr❛r② ♠♦♥❛❞s
■❖ ✰ ❈♦♥t ❊①❛♠♣❧❡ ✶ fun :: Int -> String fun n = (‘runCont‘ id) $ do str <- callCC $ \exit1 -> do when (n < 10) (exit1 (show n)) let ns = map digitToInt (show (n ‘div‘ 2)) n’ <- callCC $ \exit2 -> do when ((length ns) < 5) (exit2 n) return $ sum ns return $ "(ns = " ++ (show ns) ++ ") " ++ (show n’) return $ "Answer: " ++ str
Recommend
More recommend