13 12, 2004

[ ×ªÔØ ]haskell½éÉÜ

HaskellÊÇÒ»ÃÅ´¿º¯Êýʽ(Pure Functional)µÄÓïÑÔ¡£ÖÚËùÖÜÖª£¬Ò»¸öû
ÓР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)
×îлظ´