13 12, 2004
[ ×ªÔØ ]haskell½éÉÜ
ÓÐ side effectµÄ³ÌÐò£¬ÊDz»ÄÜ×öÈκι¤×÷µÄÎÞÓóÌÐò£»µ«ÊÇHaskell²¢²»
ÊÇÒ»ÃŲ»ÄÜ×öÈκι¤×÷µÄÎÞÓÃÓïÑÔ¡£
HaskellÈ¡ÇÉÖ®´¦£¬ÔÚÓÚº¯Êý(functiona)ºÍ¿Ú¿Ú(action)ÊÇ·Ö¿ªµÄ¡£
Ëùνfunction£¬ÈκÎÇé¿ö϶¼Äܵ÷ÓÃËü£¬ÈκÎÇé¿öϼÆËãËü£¬µÃµ½µÄ½á¹û
¶¼ÊÇÒ»ÑùµÄ£»¶øaction£¬Ö»ÄÜÔÚmonadÀïÃæµ÷ÓÃËü£¬²»Í¬Çé¿öÏÂÖ´ÐÐËü£¬µÃ
µ½µÄ½á¹û¿ÉÄܲ»Í¬¡£Action±»ÓÃÀ´ÃèÊö¸÷ÖÖpure functionalµÄÓïÑÔÄÑÒÔ
ÃèÊöµÄÊÂÇ飬±ÈÈçIO£¬±ÈÈçËæ»úÊý£¬±ÈÈçexception¡£
ËùÒÔ£¬Ð´Ò»¸öHaskellµÄ³ÌÐò£¬·ÖΪÁ½¸ö²¿·Ö¡£Ò»²¿·Ö£¬ÊÇ´¿´âµÄº¯Êý£¬
ÔÚÕâÒ»²¿·ÖÀÎÒÃÇÐèÒª¿¼ÂǵÄÊÇ£¬Êý¾ÝÔõô´¦Àí£»ÁíÒ»²¿·Ö£¬ÊÇaction£¬
ÔÚÕâÒ»²¿·ÖÀÎÒÃÇ¿¼ÂÇÔõô»ñµÃÊý¾Ý£¬ÔõôÊä³öÊý¾Ý¡£
ÎÒÃÇÓÃÒ»¸ö¼òµ¥µÄÀý×Ó(Yet Another Haskell TutorialµÄÒ»¸öÀýÌâ)
½áÊøÕâ¸ö¿ªÍ·¡£
import IO
-- Á½¸öºáÏß¿ªÍ·ÊÇ×¢ÊÍ
main = do
-- ÒÔdo¿ªÍ·£¬ÊÇactionµÄ³ä·ÖÌØÕ÷
nums <- getNums
-- Ö»ÓÐactionµÄ·µ»Ø£¬²Å¿ÉÒÔÓÃ<-µÃµ½
putStrLn ("The sum is " ++ show (sum nums))
-- putStrLnÒ²ÊÇaction£¬µ«ÊÇsumÈ´ÊÇfunction
putStrLn ("The product is " ++ show (product nums))
showFactorials nums
-- showFactorialsÒ²ÊÇaction
-- Ö»ÓÐÀàÐͲſÉÒÔ´óд¿ªÍ·¡£function£¬action»¹ÊÇvalue£¬¶¼Ö»ÄÜ
-- ÒÔСд¿ªÍ·
getNums = do
putStrLn "Give me a number (or 0 to stop)"
num <- getLine
if read num == 0
then return []
else do rest <- getNums
return ((read num :: Int) : rest)
-- ×¢Ò⣬actionÀïÃæ¿ÉÒÔµ÷ÓÃfunction£¬·´¹ýÀ´¾Í²»ÐÐ
-- ±ÈÈçÉÏÃæread num : restÊÇ´¿´âµÄfunctionµ÷Óã¬
-- Èç¹ûread num : getNums£¬ÒòΪgetNumsÊÇaction£¬¾Í
-- ²»·ûºÏhaskell¹æ¶¨ÁË¡£
showFactorials [] = return ()
-- returnÒ²ÊÇÅжÏÊDz»ÊÇactionµÄ³ä·ÖÌõ¼þ
showFactorials (x:xs) = do
putStrLn (show x ++ " factorial is " ++ show (factorial x))
showFactorials xs
factorial 1 = 1
-- factorialÊÇÒ»¸öº¯Êý
-- ÀàÐͶ¨Òå²»ÊDZØÐëµÄ£¬haskell»áÊÔ×Å×Ô¼ºÍƵ¼
factorial n = n * factorial (n-1)
×îлظ´