Yet Another Haskell Tutorial ¿ä¾àº» [[TableOfContents]] = ¹®¼­Á¤º¸ = == ÀúÀÛ±Ç ¹× ¶óÀ̼±½º == º» ¹®¼­´Â GFDL(GNU Free Document License)·Î ¹èÆ÷µÇ¹Ç·Î ÀÚÀ¯·Ó°Ô ¼öÁ¤ ¹× Àç¹èÆ÷ÇÒ ¼ö ÀÖ½À´Ï´Ù. ´Ü, GFDL Á¦ 4Á¶ DÇ×°ú EÇ׿¡ ÀÇÇØ ´ÙÀ½ ÀúÀÛ±Ç Ç¥½Ã¸¦ ¹Ýµå½Ã Æ÷ÇÔÇØ¾ß Çϸç ÀúÀÛ±Ç Ç¥½Ã ºÎºÐÀº Àý´ë ¹Ù²ã¼­´Â ¾ÈµË´Ï´Ù. ---- Copyright (c) Hal Daume III, 2002-2006. The preprint version of this tutorial is intended to be free to the entire Haskell community. It may be distributed under the terms of the GNU Free Document License, as permission has been granted to incorporate it into the Wikibooks projects. Copyright (c) redneval@kldp.org. 2007,2009. º» ¹®¼­´Â GNU Free Document License·Î ¹èÆ÷µË´Ï´Ù. Yet Another Haskell TutorialÀÇ ¿øÀúÀÛÀÚ´Â Hal Daume III À̸ç, ¿ø¹®ÀÇ ¹ø¿ª/¿ä¾à/¼öÁ¤/Ãß°¡µÈ ºÎºÐÀÇ ÀúÀÛ±ÇÀº redneval@kldp.org ¿¡ ÀÖ½À´Ï´Ù. ---- == Ãâó == ¿µ¾î ¿ø¹®Àº ´ÙÀ½ ÁÖ¼Ò¿¡¼­ ¹ÞÀ» ¼ö ÀÖ½À´Ï´Ù. http://www.cs.utah.edu/~hal/htut/ ¶Ç´Â http://darcs.haskell.org/yaht/yaht.pdf ´ÙÀ½ ÁÖ¼Ò·Î °¡¸é ¿Â¶óÀλóÀ¸·Î º¼ ¼ö ÀÖ½À´Ï´Ù. http://en.wikibooks.org/wiki/Haskell/YAHT ÇϽºÄÌ¿¡ °üÇÑ ´õ ¸¹Àº ¹®¼­´Â ´ÙÀ½ ÁÖ¼Ò¿¡¼­ º¼ ¼ö ÀÖ½À´Ï´Ù. http://sites.google.com/site/pieceofhaskell == ¾Ë¸² == º» ¹®¼­´Â Yet Another Haskell TutorialÀÇ ¿ä¾àÆÇÀ¸·Î, ¿ÏÀüÇÑ ³»¿ëÀ» º¸±â À§Çؼ­´Â ¿µ¾î ¿ø¹®À» º¸½Ã±â ¹Ù¶ø´Ï´Ù. == ¹®¼­ÀÇ ¿ª»ç == 2007³â 12¿ù 18ÀÏ ¹ø¿ª¹® ÃÖÃÊ °Ô½Ã 2009³â 7¿ù 5ÀÏ °³Á¤ == °øÇåÀÚ == QuietJoon = ½ÃÀÛÇϸ鼭 ... = == ´ëÈ­½Ä ȯ°æ¿Í ÄÄÆÄÀÏ·¯ == ÇϽºÄÌ ¼Ò½ºÄڵ带 ½ÇÇàÇϱâ À§ÇÑ ÇÁ·Î±×·¥ Áß Àß ¾Ë·ÁÁø °ÍÀº µÎ °¡Áö°¡ ÀÖ½À´Ï´Ù. ù¹ø°·Î Hugs´Â http://haskell.org/hugs ¿¡¼­ ¹ÞÀ» ¼ö ÀÖÀ¸¸ç, ´ëÈ­¹æ½Ä(interactive mode)À¸·Î¸¸ µ¿ÀÛÇÕ´Ï´Ù. GHC(Glasgow Haskell Compiler)´Â http://haskell.org/ghc ¿¡¼­ ¹ÞÀ» ¼ö ÀÖÀ¸¸ç, ´ëÈ­½Ä(interactive mode)À¸·Îµµ µ¿ÀÛÇÏ°í, ¼Ò½ºÄڵ带 ÄÄÆÄÀÏÇÒ ¼öµµ ÀÖ½À´Ï´Ù. GHC´Â »ç½Ç»ó(de facto) Ç¥Áر¸ÇöÀ¸·Î ¿©°ÜÁý´Ï´Ù. º» ±Û¿¡¼­´Â GHC¸¦ »ç¿ëÇÏ¿© ¼³¸íÇÏ°Ú½À´Ï´Ù. ÆíÁý±â´Â Emacs/XEmacsÀÇ haskell-mode¸¦ ÃßõÇÕ´Ï´Ù. == Ç¥±â¹ý == ´ëÈ­½Ä ȯ°æ¿¡¼­ ½ÇÇàÇÏ´Â ÄÚµå´Â ´ÙÀ½°ú °°ÀÌ `¸ðµâ¸í>' À¸·Î ½ÃÀÛÇÕ´Ï´Ù. {{{ Prelude> print "Hello, world" }}} ±×·¸Áö ¾Ê´Ù¸é ÆÄÀÏ·Î ÀÛ¼ºµÇ´Â ÄÚµåÀÔ´Ï´Ù. = ÇϽºÄÌ ¾ð¾îÀÇ ±âÃÊ = ù¹ø°·Î, ÇϽºÄÌÀº `´À±ßÇÑ' ¾ð¾î¶ó´Â Á¡ÀÌ °¡Àå Áß¿äÇÕ´Ï´Ù. ¿©±â¼­ `´À±ßÇÑ'Àº, °á°ú°ªÀÌ °è»êµÇÁö ¾ÊÀ¸¸é ¾ÈµÉ ½ÃÁ¡±îÁö °è»êÀ» ´ÊÃá´Ù´Â ÀǹÌÀÔ´Ï´Ù. ´À±ßÇÑ ¾ð¾îÀÇ ÀåÁ¡ÀÇ ¿¹¸¦ Çϳª µé¾îº¸¸é, ¹«ÇÑÅ©±âÀÇ ÀÚ·áÇüÀ» ´Ù·ê ¼ö ÀÖ´Ù´Â Á¡ÀÔ´Ï´Ù. ¸¸¾à ¸í·ÉÇüÀÇ ¾ð¾î¿¡¼­ ¹«ÇÑÅ©±âÀÇ ÀڷᱸÁ¶¸¦ ¸¸µé±â À§Çؼ­´Â, ¿¹¸¦µé¾î ´ÙÀ½°ú °°Àº °°Àº ÇüÅÂÀÇ Äڵ带 »ç¿ëÇؾßÇÒ °ÍÀÔ´Ï´Ù. {{{ List makeList() { List current = new List(); current.value = 1; current.next = makeList(); return current; } }}} ±×·¯³ª ÀÌ´Â ¹«ÇѼøȯ(infinite loop)À» µ¹°Ô µÉ °ÍÀÌ°í ÇÁ·Î±×·¥Àº Á¾·áµÇÁö ¾ÊÀ» °ÍÀÔ´Ï´Ù. ÄÚµåÀÇ °á°ú°ªÀÌ ÇÊ¿äÇÏÁö ¾Ê¾Æµµ ÀüºÎ °è»êÇÏ´Â ¹æ½ÄÀ» `¾ö°ÝÇÑ °è»ê¹ý'À̶ó°í ÇÕ´Ï´Ù. ¹Ý¸é¿¡ `´À±ßÇÑ °è»ê¹ý'À» »ç¿ëÇÏ´Â ¾ð¾î´Â °á°ú°ªÀÌ ÇÊ¿äÇÏÁö ¾Ê´Ù¸é °è»êÇÏÁö ¾Ê½À´Ï´Ù. ¶ÇÇÑ, ¾ö°ÝÇÑ ¾ð¾î´Â `°ª¿¡ ÀÇÇÑ È£Ãâ'À̶ó°í ÇÏ°í, ´À±ßÇÑ ¾ð¾î´Â `À̸§¿¡ ÀÇÇÑ È£Ãâ' À̶ó°í ÇÕ´Ï´Ù. À§ÀÇ Äڵ忡¼­ 5¹ø° ÁÙ¿¡¼­ makeList ½ÇÇàµÉ ¶§ ±× `°ª'À» °¡Á®¿À°Ô µÇ¹Ç·Î, ÀÌ·Î ÀÎÇØ ¹«ÇѼøȯ¿¡ ºüÁö°Ô µË´Ï´Ù. ÇϽºÄÌ¿¡¼­´Â ´ÙÀ½°ú °°ÀÌ ÀÛ¼ºÇÒ ¼ö ÀÖ½À´Ï´Ù. {{{ makeList = 1 : makeList }}} ÀÌ ÄÚµå´Â ´ÙÀ½°ú °°ÀÌ ÀÐÀ» ¼ö ÀÖ½À´Ï´Ù. Áº¯ : ¿ì¸®´Â makeList ¸¦ Á¤ÀÇÇÏ°í ÀÖ´Ù. ¿ìº¯ : makeList ÀÇ Á¤ÀÇ´Â `1 : makeList' ÀÌ´Ù. Âü°í·Î, ÇϽºÄÌ¿¡¼­ ÄÝ·Ð(:)¿¬»êÀÚ´Â ¸®½ºÆ®¸¦ ¸¸µå´Âµ¥ »ç¿ëµË´Ï´Ù. (µÚ¿¡¼­ ÀÚ¼¼È÷ ¼³¸íÇÏ°Ú½À´Ï´Ù.) ±×·¯¹Ç·Î ¿ìº¯¿¡¼­´Â, makeListÀº 1°ú makeList·Î ÀÌ·ïÁø °ªÀ̶ó´Â °ÍÀ» ¾Ë·ÁÁÝ´Ï´Ù. ±×·±µ¥ ÇϽºÄÌÀº ´À±ßÇÑ ¾ð¾îÀ̹ǷÎ, (¶Ç´Â "À̸§¿¡ ÀÇÇÑ È£Ãâ") ½ÇÁ¦·Î´Â ÀÌ ½ÃÁ¡¿¡¼­ makeListÀÇ °ªÀ» °è»êÇÏÁö ¾Ê½À´Ï´Ù. À̸¦ °è»êÇÏ´Â ½ÃÁ¡Àº È­¸é¿¡ Ãâ·ÂÇϰųª ¸®½ºÆ®ÀÇ ÇÕÀ» °è»êÇÏ´Â µî, °á°ú°ªÀÌ ÇÊ¿äÇÑ ½ÃÁ¡¿¡¸¸ ÀÌ·ïÁö°Ô µË´Ï´Ù. ±×·¯¹Ç·Î, ¿¹¸¦ µé¸é makeListÀÇ Ã¹ 10°³ ¿ø¼Ò¸¦ °¡Áø »õ·Î¿î ¸®½ºÆ®¸¦ Á¤ÀÇÇÑ´Ù¸é, makeListÀÇ ±æÀÌ°¡ ¹«ÇÑÀ̶ó°í Çصµ »ó°ü¾ø°Ô µË´Ï´Ù. ±× °æ¿ì¿¡´Â makeListÀÇ Ã¹ 10°³ ¿ø¼Ò¸¸ °è»êµË´Ï´Ù. ÀÌ°ÍÀÌ ¹Ù·Î `´À±ßÇÔ' ÀÔ´Ï´Ù. µÎ¹ø°·Î ÇϽºÄÌÀº ´ë¼Ò¹®ÀÚ¸¦ ±¸ºÐÇÕ´Ï´Ù. ´Ù¸¥ ¾ð¾îµéÀÌ ´ë¼Ò¹®ÀÚ¸¦ ±¸ºÐÇÏ´Â °Í°ú´Â ¾à°£ ´Ù¸¥ Ư¡ÀÌ ÀÖ½À´Ï´Ù. ÇϽºÄÌ¿¡¼­ ¾î¶² °Í¿¡ À̸§À» ºÙÀÌ´Â °ÍÀº 6°¡Áö Á¾·ù°¡ ÀÖ½À´Ï´Ù. º¯¼ö(variable), »ý¼ºÀÚ(constructor), Çü º¯¼ö(type variable), Çü »ý¼ºÀÚ(type constructor), Çü Ŭ·¡½º(type class), ¸ðµâ(module)ÀÔ´Ï´Ù. ÀÌÁß¿¡¼­ º¯¼ö¿Í Çü º¯¼ö´Â ¼Ò¹®ÀÚ ¶Ç´Â ¹ØÁÙ¹®ÀÚ(`_')·Î ½ÃÀÛÇؾßÇÏ°í, ³ª¸ÓÁö ³ÝÀº ´ë¹®ÀÚ·Î ½ÃÀÛÇؾßÇÕ´Ï´Ù. (´Ù¸¥ ¾ð¾î¿¡¼­¿Í´Â ´Ù¸£°Ô, ÇϽºÄÌ¿¡¼­ º¯¼ö´Â ÇÔ¼ö¸¦ ÀǹÌÇÕ´Ï´Ù.) ÇÔ¼öÇü ¾ð¾î´ä°Ô, ÇϽºÄÌÀº ºÎ¼öÈ¿°ú¸¦ ÃÖ´ëÇÑ ÇÇÇÕ´Ï´Ù. ºÎ¼öÈ¿°ú´Â ÇÔ¼öÀÇ Ãâ·Â°ú´Â °ü·ÃÀÌ ¾ø´Â ¹«¾ùÀΰ¡¸¦ ÀǹÌÇÕ´Ï´Ù. C¿Í ÀÚ¹Ù¿¡¼­´Â ÇÔ¼ö¿¡¼­ Àü¿ªº¯¼ö¸¦ ¼öÁ¤ÇÒ ¼ö Àִµ¥, Àü¿ªº¯¼ö´Â ÇÔ¼öÀÇ Ãâ·Â°ú´Â ¹«°üÇϹǷΠÀÌ´Â ºÎ¼öÈ¿°úÀÔ´Ï´Ù. °Ô´Ù°¡, ½Ã½ºÅÛÀÇ »óŸ¦ º¯È­½ÃÅ°´Â °ÍÀº ºÎ¼öÈ¿°úÀÔ´Ï´Ù. È­¸é¿¡ ¹«¾ùÀΰ¡¸¦ Ãâ·ÂÇϰųª ÇÏ´Â °Íµµ ºÎ¼öÈ¿°úÀÔ´Ï´Ù. ºÎ¼öÈ¿°ú°¡ ¾ø´Â ÇÔ¼ö¸¦ `¼ø¼öÇÑ' ÇÔ¼ö¶ó°í ÇÕ´Ï´Ù. ÇÔ¼ö°¡ ¼ø¼öÇÑÁö ¾Ë¾Æº¼ ¼ö ÀÖ´Â °£´ÜÇÑ Å×½ºÆ®´Â ´ÙÀ½°ú °°Àº Áú¹®ÀÔ´Ï´Ù. `°°Àº ÀÎÀÚ°¡ ÁÖ¾îÁ³À» ¶§ ÇÔ¼ö°¡ Ç×»ó °°Àº Ãâ·ÂÀ» ¹ß»ý½ÃÅ°´Â°¡?' ±×·¯¹Ç·Î C ³ª ÀÚ¹Ù¿¡¼­ Çß´ø °Í°ú´Â »ý°¢À» ´Ù¸£°Ô ÇؾßÇÕ´Ï´Ù. ¸¸¾à x ¶ó´Â °ªÀÌ ÀÖ´Ù¸é, À̸¦ ·¹Áö½ºÅͳª ¸Þ¸ð¸®°°Àº °ÍÀ¸·Î »ý°¢Çؼ­´Â ¾ÈµË´Ï´Ù. x ´Â ´ÜÁö À̸§ÀÏ»ÓÀÔ´Ï´Ù. ¸¶Ä¡ ÀÌ ±ÛÀÇ ¿øÀúÀÚÀÇ À̸§ÀÌ `Hal'ÀÎ °Íó·³ º¯ÇÏÁö ¾Ê´Â ¹«¾ð°¡ÀÔ´Ï´Ù. ±×·¯¹Ç·Î ´ÙÀ½ C ÄÚµå¿Í °°ÀÌ ³ªÅ¸³»´Â °ÍÀº ÇϽºÄÌ¿¡¼­´Â ºÒ°¡´ÉÇÕ´Ï´Ù. {{{ int x = 5; x = x + 1; }}} x = x + 1 ¿Í °°ÀÌ x °¡ ¿¹Àü¿¡ °¡Á³´ø °ªÀ» ¾ø¾Ö°í »õ·Î¿î °ªÀ¸·Î ´ëüÇÏ´Â °ÍÀ» Æı«Àû °»½Å(destructive update)À̶ó°í ºÎ¸¨´Ï´Ù. ÇϽºÄÌ¿¡¼­´Â Æı«Àû °»½ÅÀÌ ¾ø½À´Ï´Ù. ÇϽºÄÌ¿¡¼­´Â Æı«Àû °»½ÅÀ» Çã¿ëÇÏÁö ¾Ê¾Ò±â ¶§¹®¿¡, Äڵ带 ÀÌÇØÇϱⰡ ¸Å¿ì ½±½À´Ï´Ù. ¿ì¸®°¡ f¶ó´Â ÇÔ¼ö¸¦ Á¤ÀÇÇϸé, °°Àº ÀÎÀÚ°¡ ÁÖ¾îÁö¸é ¾ðÁ¦ ½ÇÇàµÇ´ÂÁö¿¡ °ü°è¾øÀÌ °°Àº °á°ú°¡ ³ª¿É´Ï´Ù. ÀÌ·± °ÍÀ» `ÂüÁ¶Àû Åõ¸í¼º'À̶ó°í ºÎ¸¨´Ï´Ù. ¶ÇÇÑ, °°Àº ÀÎÀÚ°¡ ÁÖ¾îÁö¸é f¿Í g°¡ Ç×»ó °°Àº Ãâ·ÂÀ» °®´Â´Ù¸é, f´Â g·Î ´ëüÇÒ ¼ö ÀÖ½À´Ï´Ù. (`ÂüÁ¶Àû Åõ¸í¼º'ÀÇ Á¤ÀÇ¿¡ ´ëÇÑ ´Ù¸¥ °ßÇØ°¡ ÀÖÀ» ¼ö ÀÖ½À´Ï´Ù.) == »ê¼ú¿¬»êÀÚ == ¸ÕÀú Hugs³ª GHCi °°Àº ´ëÈ­½Ä ȯ°æÀ» ½ÇÇàÇÕ´Ï´Ù. GHCi°¡ ½ÇÇàµÇ¸é ´ÙÀ½°ú °°ÀÌ È­¸é¿¡ ¶ß°Ô µÉ °ÍÀÔ´Ï´Ù. {{{ Prelude> }}} ´õÇϱâ(+), »©±â(-), °öÇϱâ(*), ³ª´©±â(/), ½Â(^), Á¦°ö±Ù(sqrt)°ú °°Àº ±âº»ÀûÀÎ »ê¼ú¿¬»êÀÚ°¡ Á¦°øµË´Ï´Ù. ±×·¯¹Ç·Î ÇϽºÄÌ ½©Àº °­·ÂÇÑ °è»ê±â·Î »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù. {{{ Prelude> 5*4+3 23 Prelude> 5^5-2 3123 Prelude> sqrt 2 1.4142135623730951 Prelude> 5*(4+3) 35 }}} ÇÔ¼ö¿¡ ÀÎÀÚ¸¦ ÁÖ±â À§ÇØ °ýÈ£´Â ÇÊ¿äÇÏÁö ¾Ê½À´Ï´Ù. ±×·¯¹Ç·Î sqrt(2) ¶ó°í ¾µ ¼öµµ ÀÖ°í, sqrt 2 ¶ó°í ¾µ ¼öµµ ÀÖ½À´Ï´Ù. (C¿Í °°Àº ¾ð¾îÀÇ °æÇèÀÌ ÀÖ´Ù¸é, sqrt 2 ¿¡¼­ 2°¡ Á¤¼öÇüó·³ º¸À̴µ¥ ¿Ö °á°ú°ªÀÌ ½Ç¼öÇüÀ¸·Î ³ª¿À´ÂÁö ÀǾÆÇØÇÒ °ÍÀÔ´Ï´Ù. ÀÌ°ÍÀº Çü Ŭ·¡½º¿¡¼­ ÀÚ¼¼È÷ ´Ù·ç°Ú½À´Ï´Ù.) == ¼ø¼­½Ö(tuple) == ÇϳªÀÇ °ª ¸»°íµµ ¿©·¯ °³ÀÇ °ªÀ» ¼ø¼­½ÖÀ¸·Î Ç¥ÇöÇÒ ¼ö ÀÖ½À´Ï´Ù. ¼Ò°ýÈ£·Î µÑ·¯½Î°í ½°Ç¥·Î ±¸ºÐÇÏ¸é ¼ø¼­½ÖÀÌ µË´Ï´Ù. {{{ Prelude> (5,3) (5,3) }}} ÀÌ ¶§, °¢°¢ÀÇ ¿ä¼Ò°¡ °°Àº ÇüÀÌ ¾Æ´Ï¾îµµ »ó°ü¾ø½À´Ï´Ù. µÎ °³ÀÇ °ªÀ¸·Î ÀÌ·ïÁø ¼ø¼­½ÖÀ» ¦(pair)À̶ó°í ÇÕ´Ï´Ù. fst¶ó´Â ÇÔ¼ö´Â ¦ÀÇ Ã¹¹ø° ¿ä¼Ò¸¦ ¹ÝȯÇÕ´Ï´Ù. ¸¶Âù°¡Áö·Î snd´Â µÎ¹ø° ¿ä¼Ò¸¦ ¹ÝȯÇÕ´Ï´Ù. {{{ Prelude> fst (5, "hello") 5 Prelude> snd (5, "hello") "hello" }}} ´ÙÀ½°ú °°ÀÌ µÎ °³ ÀÌ»óÀÇ ¿ä¼Ò°¡ ÀÖÀ» ¼öµµ ÀÖ½À´Ï´Ù. ´Ù¸¸, ÀÌ °æ¿ì¿¡´Â fst¿Í snd ÇÔ¼ö´Â »ç¿ëÇÒ ¼ö ¾ø½À´Ï´Ù. {{{ Prelude> (1,2,3) (1,2,3) Prelude> (1,2,3,4) (1,2,3,4) }}} À̸¦ ¼ø¼­½ÖÀ̶ó°í ºÎ¸£¸ç, °íÁ¤µÈ ¼öÀÇ ÀڷḦ ÀúÀåÇÏ°Ô µË´Ï´Ù. ¼ø¼­½ÖÀÇ ³»ºÎ¿¡ ¼ø¼­½ÖÀ» °¡Áú ¼ö ÀÖ½À´Ï´Ù. ((1,'a'),"foo") °ú °°ÀÌ ¸»ÀÔ´Ï´Ù. == ¸®½ºÆ® == ¼ø¼­½ÖÀº °íÁ¤µÈ ¼öÀÇ ¿ä¼Ò°¡ ÀÖÁö¸¸, ¸®½ºÆ®´Â ÀÓÀÇÀÇ ¼öÀÇ ¿ä¼Ò°¡ ÀÖÀ» ¼ö ÀÖ½À´Ï´Ù. ¼ø¼­½Ö°ú´Â ´Ù¸£°Ô ´ë°ýÈ£°¡ »ç¿ëµË´Ï´Ù. {{{ Prelude> [1,2] [1,2] Prelude> [1,2,3] [1,2,3] }}} ¸®½ºÆ®´Â ºñ¾îÀÖÀ» ¼öµµ Àִµ¥, ºó ¸®½ºÆ®¸¦ [] ·Î ³ªÅ¸³À´Ï´Ù. ¸®½ºÆ®ÀÇ ¾Õ¿¡ ÄÝ·Ð ¿¬»êÀÚ¸¦ »ç¿ëÇÏ¿© ¿ä¼Ò¸¦ Ãß°¡ÇÒ ¼öµµ ÀÖ½À´Ï´Ù. {{{ Prelude> 0:[1,2] [0,1,2] Prelude> 5:[1,2,3,4] [5,1,2,3,4] Prelude> 5:1:2:3:4:[] [5,1,2,3,4] }}} »ç½ÇÀº [5,1,2,3,4] ´Â ¼³ÅÁ ±¸¹®ÀÎ ¼ÀÀÌ°í, ÄÄÆÄÀÏ·¯´Â 5:1:2:3:4:[] ¿Í °°ÀÌ Çؼ®ÇÕ´Ï´Ù. ±×·¯¹Ç·Î ÇϽºÄÌÀÇ ¸®½ºÆ®´Â (C ¿¡¼­ÀÇ ¹è¿­ÀÌ ¾Æ´Ñ) ¿¬°á ¸®½ºÆ®(linked list)¿Í À¯»çÇÕ´Ï´Ù. (¼³ÅÁ ±¸¹®À̶õ, ¹Ýµå½Ã ÇÊ¿äÇÑ ±¸¹®Àº ¾Æ´ÏÁö¸¸ ÄÚµå ÀÛ¼º°ú ÀÌÇظ¦ ½±°Ô ÇØÁÖ´Â ±¸¹®À» ¸»ÇÕ´Ï´Ù.) ¼ø¼­½Ö°ú ¸®½ºÆ®ÀÇ ¶Ç ´Ù¸¥ Á¡Àº, ¸®½ºÆ®¿¡´Â °°Àº Á¾·ùÀÇ ¿ä¼Òµé¸¸ µé¾î°¥ ¼ö ÀÖ´Ù´Â °ÍÀÔ´Ï´Ù. Á¤¼ö¿Í ¹®ÀÚ¿­À» ÇϳªÀÇ ¸®½ºÆ®¿¡ ³ÖÀ¸·Á°í ÇÏ¸é ¿À·ù°¡ ¹ß»ýÇÕ´Ï´Ù. ¶ÇÇÑ ¸®½ºÆ® ³»¿¡´Â ¸®½ºÆ®³ª ¼ø¼­½ÖÀÌ ¿Ã ¼ö ÀÖ½À´Ï´Ù. {{{ Prelude> [(1,1),(2,4),(3,9),(4,16)] [(1,1),(2,4),(3,9),(4,16)] Prelude> ([1,2,3,4],[5,6,7]) ([1,2,3,4],[5,6,7]) }}} ¸®½ºÆ®ÀÇ ±âº» ÇÔ¼ö¿¡´Â head¿Í tailÀÌ ÀÖ½À´Ï´Ù. head´Â ù¹ø° ¿ä¼Ò, tailÀº ù¹ø° ¿ä¼Ò¸¦ »©°í µÞ ºÎºÐÀ» ¹ÝȯÇÕ´Ï´Ù. ´Ù¸¸, ºó ¸®½ºÆ®ÀÎ °æ¿ì¿¡´Â ¿À·ù°¡ ¹ß»ýÇÕ´Ï´Ù. {{{ Prelude> length [1,2,3,4,10] 5 Prelude> head [1,2,3,4,10] 1 Prelude> tail [1,2,3,4,10] [2,3,4,10] }}} ´Ù½Ã Çѹø ¸»ÇÏÁö¸¸ ÇϽºÄÌÀº ¹«ÇÑ ±æÀÌÀÇ ¸®½ºÆ®¸¦ ´Ù·ê ¼öµµ ÀÖ½À´Ï´Ù. {{{ Prelude> let ones = 1 : ones Prelude> take 5 ones [1,1,1,1,1] }}} ¹°·Ð ´ÙÀ½°ú °°ÀÌ ¹«ÇÑ ±æÀÌÀÇ ¸®½ºÆ®¸¦ Ãâ·ÂÇÏ·ÁÇÑ´Ù¸é ¹«ÇѼøȯ(infinite loop)¸¦ µ¹°Ô µË´Ï´Ù. {{{ Prelude> ones }}} === ¹®ÀÚ¿­ === ÇϽºÄÌ¿¡¼­´Â ¹®ÀÚ¿­Àº ¹®ÀÚÀÇ ¸®½ºÆ®ÀÔ´Ï´Ù. {{{ Prelude> 'H':'e':'l':'l':'o':[] "Hello" }}} ±×·¯¹Ç·Î ¹®ÀÚ¿­À» ÇÕÄ¡±â À§Çؼ­´Â ¸®½ºÆ®¸¦ ÇÕÄ¡´Â ¿¬»êÀÚ°¡ ÇÊ¿äÇÕ´Ï´Ù. {{{ Prelude> "Hello " ++ "World" "Hello World" }}} show ÇÔ¼ö´Â ¾î¶°ÇÑ °ªÀ» ¹®ÀÚ¿­·Î ¹Ù²ãÁÖ°í, read ÇÔ¼ö´Â ¹Ý´ë·Î ¹®ÀÚ¿­À» ¾î¶°ÇÑ °ªÀ¸·Î ¹Ù²ãÁÝ´Ï´Ù. readÀÇ ÀÎÀÚ·Î °ªÀ¸·Î ¹Ù²ð ¼ö ¾ø´Â ¹®ÀÚ¿­ÀÌ ¿À°Ô µÇ¸é ½ÇÇà½Ã ¿À·ù°¡ ¹ß»ýÇÕ´Ï´Ù. (ÄÄÆÄÀϽÿ¡´Â ¿À·ù°¡ ¹ß»ýÇÏÁö ¾Ê½À´Ï´Ù.) {{{ Prelude> "Five squared is " ++ show (5*5) "Five squared is 25" Prelude> read "5" + 3 8 Prelude> read "Hello" + 3 Program error: Prelude.read: no parse }}} === ±âº»ÀûÀÎ ¸®½ºÆ® ÇÔ¼ö === ¸®½ºÆ®¸¦ ´Ù·ç±â À§ÇÑ ¼¼ °¡Áö ±âº» ÇÔ¼ö°¡ ÀÖ½À´Ï´Ù. ¹Ù·Î map, filter, foldr (¶Ç´Â foldl) ÀÔ´Ï´Ù. map ÇÔ¼ö´Â ¸®½ºÆ®ÀÇ °¢ °ªµé¿¡ ´ëÇØ ¾î¶² ÇÔ¼ö¸¦ Àû¿ëÇÏ°Ô µË´Ï´Ù. ¿¹¸¦ µé¾î Char.toUpper¶ó´Â ³»ÀåÇÔ¼ö´Â ¹®ÀÚ ÀÔ·ÂÀ» ¹Þ¾Æ¼­ ´ë¹®ÀÚ·Î ¹Ù²ãÁִµ¥, À̸¦ ÀÌ¿ëÇÏ¸é ¹®ÀÚ¿­ Àüü¸¦ ´ë¹®ÀÚ·Î ¹Ù²Ü ¼ö ÀÖ½À´Ï´Ù. {{{ Prelude> map Char.toUpper "Hello World" "HELLO WORLD" }}} ¸®½ºÆ®¿¡¼­ ¾î¶² °ªÀ» »©¹ö¸®°íÀÚ Çϸé, filter ÇÔ¼ö¸¦ »ç¿ëÇÏ¸é µË´Ï´Ù. Char.isLower ¶ó´Â ÇÔ¼ö´Â ¾î¶² ¹®ÀÚ°¡ ¼Ò¹®ÀÚÀÎÁö¸¦ ¾Ë·ÁÁÖ´Â ÇÔ¼öÀÔ´Ï´Ù. À̸¦ ÀÌ¿ëÇÏ¸é ´ÙÀ½°ú °°ÀÌ ¾î¶² ¹®ÀÚ¿­¿¡¼­ ¼Ò¹®ÀÚ¸¸ »Ì¾Æ³¾ ¼ö ÀÖ½À´Ï´Ù. {{{ Prelude> filter Char.isLower "Hello World" "elloorld" }}} foldrÀº ÇÔ¼ö, ÃʱⰪ, ¸®½ºÆ® ¼¼ °³ÀÇ ÀÎÀÚ¸¦ ¹Þ½À´Ï´Ù. {{{ Prelude> foldr (+) 0 [3,8,12,5] 28 }}} ¸®½ºÆ®´Â 3 : 8 : 12 : 5 : [] °ú °°°í, ºó ¸®½ºÆ®´Â ÃʱⰪÀÎ 0 À¸·Î ¹Ù²î¸ç, `:' ´Â `+' ·Î ¹Ù²î¸é, 3 + 8 + 12 + 5 + 0 °ú °°ÀÌ ¹Ù²î¾î¼­ °á°ú°ª 28ÀÌ ³ª¿À°Ô µË´Ï´Ù. ¹°·Ð, ´ÙÀ½°ú °°ÀÌ °öÇϱ⸦ ¼öÇàÇÒ ¼öµµ ÀÖ½À´Ï´Ù. {{{ Prelude> foldr (*) 1 [4,8,5] 160 }}} ±×·¯³ª ÇÔ¼ö°¡ °áÇÕ¹ýÄ¢ÀÌ ¼º¸³ÇÏÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. °áÇÕ¹ýÄ¢Àº a ¡¤ (b ¡¤ c) = (a ¡¤ b) ¡¤ c) °ú °°Àº ¼ö½ÄÀÌ ¼º¸³ÇÔÀ» ¸»ÇÕ´Ï´Ù. ¿¹¸¦ µé¾î ÇÔ¼ö (¡¤) °¡ °áÇÕ¹ýÄ¢ÀÌ ¼º¸³ÇÏÁö ¾Ê´Â´Ù¸é, ((4 ¡¤ 8) ¡¤ 5) ¡¤ 1 °ú 4 ¡¤ (8 ¡¤ ((5 ¡¤ 1)) ÀÇ °á°ú°ªÀÌ ´Ù¸¦ °ÍÀÔ´Ï´Ù. ±×¸®°í foldrÀº ¿ÞÂʺÎÅÍ ¸ÕÀú °è»êÇϸç, foldlÀº ¿À¸¥ÂʺÎÅÍ ¸ÕÀú °è»êÇÕ´Ï´Ù. ±×·¯¹Ç·Î foldr (-) 1 [4,8,5] Àº 4 - (8 - (5 - 1)) À̹ǷΠ0 ÀÌ µÇÁö¸¸, {{{ foldr (-) 1 [4,8,5] ==> 4 - (foldr (-) 1 [8,5]) ==> 4 - (8 - foldr (-) 1 [5]) ==> 4 - (8 - (5 - foldr (-) 1 [])) ==> 4 - (8 - (5 - 1)) ==> 4 - (8 - 4) ==> 4 - 4 ==> 0 }}} foldl (-) 1 [4,8,5] Àº (((1 - 4) - 8) - 5) À̹ǷΠ-16 ÀÌ µË´Ï´Ù. {{{ foldl (-) 1 [4,8,5] ==> foldl (-) (1 - 4) [8,5] ==> foldl (-) ((1 - 4) - 8) [5] ==> foldl (-) (((1 - 4) - 8) - 5) [] ==> ((1 - 4) - 8) - 5 ==> -16 }}} map°ú foldlÇÔ¼ö´Â ½±°Ô ±¸ÇöÇÒ ¼ö ÀÖ½À´Ï´Ù. {{{ my_map f [] = [] my_map f (x:xs) = f x : my_map f xs my_foldl f n [] = n my_foldl f n (x:xs) = my_foldl f (f n x) xs }}} ¿©±â¼­ (x:xs) ¶ó°í µÈ °ÍÀº x´Â head, xs´Â tailÀ» ³ªÅ¸³À´Ï´Ù. Áö±Ý±îÁö ¹è¿î °ÍÀ» ÀÌ¿ëÇÏ¿© my_drop, my_take µîÀÇ ÇÔ¼ö¸¦ ¸¸µé¾îº¾½Ã´Ù. ÀÛ¼ºµÈ ¼Ò½ºÄڵ带 ºÒ·¯¿À´Â ¹æ¹ýÀº 3.4¿¡¼­ ¼³¸íÇÏ°Ú½À´Ï´Ù. {{{ module MyList where my_drop 0 list = list my_drop n (x:xs) = my_drop (n-1) xs my_take 0 list = [] my_take n (x:xs) = x:(my_take (n-1) xs) index 0 (x:xs) = x index n (x:xs) = index (n-1) xs my_last (x:[]) = x my_last (x:xs) = my_last xs }}} {{{ *MyList> my_take 5 [1..] [1,2,3,4,5] *MyList> my_drop 3 [1,3..9] [7,9] *MyList> index 5 [0..] 5 *MyList> my_last 5 [1..10] 10 }}} ¿©±â¼­ [ 1..10 ] Àº 1ºÎÅÍ 10±îÁö ¸ðµç Á¤¼ö¸¦ ¿ä¼Ò·Î °®´Â ¸®½ºÆ®À̸ç, [ 1.. ] ´Â ¸ðµç ÀÚ¿¬¼ö¸¦ ¿ä¼Ò·Î °®´Â ¸®½ºÆ®ÀÔ´Ï´Ù. [ 1,3..9 ] ´Â [ 1,3,5,7,9 ] ¸¦ ³ªÅ¸³À´Ï´Ù. == ¼Ò½ºÄÚµå ÆÄÀÏ == Test.hs ¶ó´Â ÆÄÀÏÀ» ´ÙÀ½°ú °°ÀÌ ÀÛ¼ºÇÕ´Ï´Ù. {{{ module Test where x = 5 y = (6, "Hello") z = x * fst y }}} ¿©±â¼­ Test ´Â ¸ðµâÀ̸§Àε¥, ÀÌ´Â ÆÄÀÏÀ̸§°ú °°¾Æ¾ßÇÕ´Ï´Ù. ÆÄÀÏÀ» ÀúÀåÇßÀ¸¸é ´ÙÀ½°ú °°ÀÌ ´ëÈ­½Ä ȯ°æ(ghci)À¸·Î ºÒ·¯¿Ã ¼ö ÀÖ½À´Ï´Ù. {{{ % hugs Test.hs % ghci Test.hs }}} ´ëÈ­½Ä ȯ°æÀÌ ÀÌ¹Ì ½ÇÇàÁßÀ̶ó¸é :load ¶Ç´Â :l ¸í·É¾î·Î ºÒ·¯¿Ã ¼ö ÀÖ½À´Ï´Ù. {{{ Prelude> :l Test.hs ... Test> }}} `Test>' ¶ó°í ³ªÅ¸³ª´Â °ÍÀº Test ¸ðµâÀ» ºÒ·¯¿ÔÀ½À» ÀǹÌÇÕ´Ï´Ù. ¸¶Âù°¡Áö·Î Preludeµµ ÇϳªÀÇ ¸ðµâÀ̶ó´Â °ÍÀ» ¾Ë ¼ö ÀÖ½À´Ï´Ù. ÀÌÁ¦ Test ¸ðµâÀ» Á¦´ë·Î ºÒ·¯¿Ô´ÂÁö È®ÀÎÇغ¾½Ã´Ù. {{{ Test> x 5 Test> y (6,"Hello") Test> z 30 }}} ¿¹»ó´ë·Î Àß µ¿ÀÛÇÔÀ» ¾Ë ¼ö ÀÖ½À´Ï´Ù. ÀÌÁ¦ ÄÄÆÄÀÏÇÏ´Â ¹æ¹ýÀ» ¾Ë¾Æº¾½Ã´Ù. ½ÇÇà°¡´ÉÇÑ ÆÄÀÏ·Î ÄÄÆÄÀÏÇϱâ À§Çؼ­´Â Main ¸ðµâÀÌ ÀÖ¾î¾ß ÇÏ°í mainÀ̶ó´Â ÇÔ¼öµµ ÇÊ¿äÇÕ´Ï´Ù. ±×·¯¹Ç·Î Test.hs ÆÄÀÏÀ» ´ÙÀ½°ú °°ÀÌ ÀÛ¼ºÇÕ´Ï´Ù. {{{ module Main where main = putStrLn "Hello World" }}} {{{ % ghc --make Test.hs -o test }}} ±×·¯¸é test ¶ó´Â ½ÇÇàÆÄÀÏ·Î ÄÄÆÄÀϵǴµ¥, À©µµ¿ìÁî¿¡¼­´Â ½ÇÇàÆÄÀÏ È®ÀåÀÚ°¡ exe À̹ǷΠ"-o test.exe" ¿Í °°ÀÌ ÇÏ¸é µÇ°Ú½À´Ï´Ù. ÀÌÁ¦ ½ÇÇàÇØ º¾½Ã´Ù. {{{ % ./test Hello World }}} À©µµ¿ìÁî¿¡¼­´Â ´ÙÀ½°ú °°½À´Ï´Ù. {{{ C:\> test.exe Hello World }}} == ÇÔ¼ö == Á¦°öÀ» ±¸ÇÏ´Â ÇÔ¼ö¸¦ Á¤ÀÇÇغ¾½Ã´Ù. {{{ square x = x * x }}} ÇÔ¼öÀÇ ÀÎÀÚ°¡ 0º¸´Ù ÀÛÀ¸¸é -1, 0À̸é 0, 0º¸´Ù Å©¸é 1À» ¹ÝȯÇÏ´Â my_signumÀ̶ó´Â ÇÔ¼ö¸¦ Á¤ÀÇÇغ¾½Ã´Ù. Test.hs¸¦ ´ÙÀ½°ú °°ÀÌ ÀÛ¼ºÇÏ¸é µË´Ï´Ù. {{{ module Test where my_signum x = if x < 0 then -1 else if x > 0 then 1 else 0 }}} ÀÌÁ¦ À§¿¡¼­ Çß´ø °Íó·³ Test ¸ðµâÀ» ºÒ·¯¿Í¼­, ´ÙÀ½°ú °°ÀÌ ½ÇÇàÇغ¾½Ã´Ù. Test ¸ðµâÀ» ÀÌ¹Ì ºÒ·¯¿Â »óÅ¿¡¼­ ´Ù½Ã ºÒ·¯¿À·Á¸é :reload ¶Ç´Â :r ¸í·É¾î¸¦ ½ÇÇàÇÏ¸é µË´Ï´Ù. {{{ *Test> my_signum 5 1 *Test> my_signum 0 0 *Test> my_signum (5-10) -1 *Test> my_signum (-1) -1 }}} ¸¶Áö¸· ½ÇÇ๮¿¡´Â ¼Ò°ýÈ£°¡ ²À µé¾î°¡¾ßÇϴµ¥, ±× ÀÌÀ¯´Â ¼Ò°ýÈ£°¡ ºüÁö¸é my_signum À̶ó´Â °ª¿¡¼­ 1À» »« °ªÀ¸·Î ÄÄÆÄÀÏ·¯°¡ ÀνÄÇϱ⠶§¹®ÀÔ´Ï´Ù. ÇϽºÄÌ¿¡¼­ if¹®Àº ´Ù¸¥ ¾ð¾î¿Í ºñ½ÁÇÏÁö¸¸ then°ú else°¡ Ç×»ó ÇÊ¿äÇÏ´Ù´Â Á¡ÀÌ ´Ù¸¨´Ï´Ù. ÇϽºÄÌ¿¡´Â case ±¸¹®µµ Á¸ÀçÇÕ´Ï´Ù. ÇÔ¼öÀÇ ÀÎÀÚ°¡ 0 ÀÎ °æ¿ì¿¡´Â 1, 1ÀÎ °æ¿ì¿¡´Â 5, 2ÀÎ °æ¿ì¿¡´Â 2, ³ª¸ÓÁö °æ¿ì¿¡´Â -1 ¸¦ ¹ÝȯÇÏ´Â ÇÔ¼ö¸¦ Á¤ÀÇÇغ¾½Ã´Ù. {{{ f x = case x of 0 -> 1 1 -> 5 2 -> 2 _ -> -1 }}} ¿©±â¼­ ¹ØÁÙ¹®ÀÚ `_' ´Â ³ª¸ÓÁö ¸ðµç °æ¿ì¸¦ ÀǹÌÇÕ´Ï´Ù. ÀÌ´Â ¸¸´ÉÆÐ(wildcard)¸¦ ³ªÅ¸³»¸ç ¾î¶°ÇÑ °ª°úµµ ¸ÅÄ¡µË´Ï´Ù. ÇϽºÄÌÀº ÆÄÀ̽ã°ú À¯»çÇÏ°Ôµµ µé¿©¾²±â°¡ Áß¿äÇÕ´Ï´Ù. À̸¦ `·¹À̾ƿô'À̶ó°í ºÎ¸£´Âµ¥, ´ÙÀ½°ú °°Àº ±ÔÄ¢À» »ý°¢ÇսôÙ. * (1) where, let, do, ofÀÇ Å°¿öµå µÚ¿¡´Â `{' °¡ »ðÀԵȴÙ. ±× ´ÙÀ½¿¡ ¿À´Â ¸í·É¹®ÀÇ µé¿©¾²±â À§Ä¡°¡ ±â¾ïµÈ´Ù. where, let, do, of°¡ ÁßøµÈ´Ù¸é µé¿©¾²±â ±íÀÌ´Â Á¡Á¡ ´õ ±í¾îÁ®¾ßÇÑ´Ù. * (2) µé¿©¾²±â°¡ ±í¾îÁö¸é ÀÌÀü ¸í·É¹®ÀÌ °è¼Ó À̾îÁö´Â °ÍÀ» ³ªÅ¸³½´Ù. * (3) µé¿©¾²±â°¡ °°À¸¸é ÀÌÀü ¸í·É¹®ÀÌ ³¡³ª°í »õ·Î¿î ¸í·É¹®ÀÌ ½ÃÀÛµÊÀ» ³ªÅ¸³½´Ù. ÀÌÀü ¸í·É¹® ³¡¿¡´Â `;' °¡ ºÙ´Â´Ù. * (4) µé¿©¾²±âÀÇ ±íÀÌ°¡ ¾è¾ÆÁö¸é `;' ¿Í `}' °¡ »ðÀԵȴÙ. ·¹À̾ƿô ±ÔÄ¢À» ¸ðµÎ Àû¿ëÇÏ¸é ´ÙÀ½°ú °°½À´Ï´Ù. {{{ f x = case x of{ 0 -> 1; 1 -> 5; 2 -> 2; _ -> -1; } }}} ·¹À̾ƿô ±ÔÄ¢À» Àß ÀÌ¿ëÇÏ¸é ¼¼¹ÌÄݷаú Áß°ýÈ£°¡ ¾øÀ̵µ Äڵ带 ÀÛ¼ºÇÒ ¼ö ÀÖ½À´Ï´Ù. ¼¼¹ÌÄݷаú °ýÈ£¸¦ »ç¿ëÇÏ¸é ·¹À̾ƿôÀ» ¸ÂÃßÁö ¾Ê¾Æµµ µË´Ï´Ù. ±×·¯¹Ç·Î ´ÙÀ½°ú °°ÀÌ ³ªÅ¸³¾ ¼öµµ ÀÖ½À´Ï´Ù. {{{ f x = case x of { 0 -> 1 ; 1 -> 5 ; 2 -> 2 ; _ -> 1 } }}} ÀÌ °æ¿ì¿¡´Â µé¿©¾²±â´Â ¹«½ÃµË´Ï´Ù. ±×·¯¹Ç·Î ´ÙÀ½°ú °°Àº Äڵ尡 °¡´ÉÇÕ´Ï´Ù. {{{ f x = case x of { 0 -> 1 ; 1 -> 5 ; 2 -> 2 ; _ -> 1 } }}} ¹°·Ð ÀÌ·± ½ÄÀ¸·Î ¾²´Â °ÍÀº Äڵ带 Àб⠾î·Æ°Ô ¸¸µé »ÓÀÔ´Ï´Ù. ÇÔ¼öÀÇ Á¤ÀǸ¦ ¿©·¯ ¹ø¿¡ ³ª´²¼­ ÇÒ ¼öµµ ÀÖ½À´Ï´Ù. ´ÙÀ½°ú °°Àº ÄÚµå´Â À§ÀÇ ÄÚµå¿Í °°Àº °á°ú¸¦ °¡Á®¿É´Ï´Ù. {{{ f 0 = 1 f 1 = 5 f 2 = 2 f _ = -1 }}} ±×·¯³ª ÀÌ °æ¿ì¿¡´Â ¼ø¼­¿¡ À¯ÀÇÇؾßÇÕ´Ï´Ù. f _ = -1 °¡ ¸¶Áö¸·ÁÙÀÌ ¾Æ´Ñ ù¹ø° ÁÙ¿¡ ÀÖ´Ù¸é, f ÇÔ¼ö´Â Ç×»ó -1 °ªÀ» ¹ÝȯÇÏ´Â ÇÔ¼ö·Î Á¤Àǵ˴ϴÙ. ÄÄÆÄÀÏ·¯¿¡ µû¶ó¼­ ±×·± ½ÄÀÇ ±¸¹®¿¡ ´ëÇØ °æ°í¸¦ ÇÏ°Ô µË´Ï´Ù. º¹ÀâÇÑ ÇÔ¼ö¸¦ ¸¸µé±â À§Çؼ­´Â ÇÔ¼ö¸¦ ÇÕ¼ºÇÏ¸é µË´Ï´Ù. ÇÔ¼öÇÕ¼ºÀ̶õ ÇÔ¼öÀÇ °á°ú°ªÀ» ´Ù¸¥ ÇÔ¼öÀÇ ÀÎÀÚ·Î »ç¿ëÇÏ´Â °ÍÀ» ¸»ÇÕ´Ï´Ù. 5*4+3 µµ ÀÏÁ¾ÀÇ ÇÔ¼öÇÕ¼ºÀε¥, * ÇÔ¼öÀÇ °á°ú°ªÀ» + ÇÔ¼ö°¡ ÀÎÀÚ·Î »ç¿ëÇϱ⠶§¹®ÀÔ´Ï´Ù. ±×·¯¸é square¿Í f ÇÔ¼ö¸¦ ÇÕ¼ºÇغ¾½Ã´Ù. {{{ *Test> square (f 1) 25 *Test> square (f 2) 4 *Test> f (square 1) 5 *Test> f (square 2) -1 }}} ¿©±â¼­µµ ¼Ò°ýÈ£´Â ÇʼöÀûÀε¥, square (f 1) ¿¡¼­ ¼Ò°ýÈ£°¡ ¾ø´Ù¸é, square f ÀÇ °ªÀ» °è»êÇÏ·Á ÇÒ °ÍÀÌ°í, ¿À·ù°¡ ¹ß»ýÇÏ°Ô µË´Ï´Ù. ÀÌ·± ÇÔ¼öÇÕ¼ºÀ» . ¿¬»êÀÚ·Î ¼öÇàÇÒ ¼ö ÀÖ½À´Ï´Ù. ¼öÇп¡¼­ ◦ ¿Í °°ÀÌ µ¿ÀÛÇÕ´Ï´Ù. ¼öÇп¡¼­ (f ◦ g)(x) = f (g(x)) °ú °°ÀÌ Çؼ®µÇ¹Ç·Î ÇϽºÄÌ¿¡¼­µµ ¿À¸¥ÂÊ¿¡ ÀÖ´Â ÇÔ¼öºÎÅÍ °è»êµË´Ï´Ù. {{{ *Test> (square . f) 1 25 *Test> (square . f) 2 4 *Test> (f . square) 1 5 *Test> (f . square) 2 -1 }}} ¿©±â¼­µµ °ýÈ£°¡ ÇʼöÀûÀε¥, (square . f) 1 ¿¡¼­ °ýÈ£°¡ ¾ø´Ù¸é square ¿Í f 1 À» ÇÕ¼ºÇÏ·ÁÇϴµ¥ f 1 Àº ÇÔ¼ö°¡ ¾Æ´Ñ 5¶ó´Â °ªÀ̹ǷΠ¿À·ù°¡ ¹ß»ýÇÕ´Ï´Ù. Prelude ¸ðµâ¿¡´Â ´ÙÀ½°ú °°Àº ÇÔ¼öµéÀÌ Á¤ÀǵÅÀÖ½À´Ï´Ù. {{{ sqrt : Á¦°ö±ÙÀ» ±¸ÇÏ´Â ÇÔ¼ö id : ÇÔ¼öÀÇ ÀÎÀÚ¸¦ ±×´ë·Î ¹ÝȯÇÏ´Â ÇÔ¼ö. id x = x fst : Å©±â°¡ 2ÀÎ ¼ø¼­½ÖÀÇ Ã¹¹ø° ¿ä¼Ò¸¦ ¹ÝȯÇÔ. snd : Å©±â°¡ 2ÀÎ ¼ø¼­½ÖÀÇ µÎ¹ø° ¿ä¼Ò¸¦ ¹ÝȯÇÔ. null : ¸®½ºÆ®°¡ ºñ¾îÀÖ´ÂÁö ¾Ë·ÁÁÜ. head : ¸®½ºÆ®ÀÇ Ã¹¹øÀç ¿ä¼Ò¸¦ ¹ÝȯÇÔ. (´Ü, ºó ¸®½ºÆ®´Â ¿¹¿Ü) tail : ¸®½ºÆ®ÀÇ Ã¹¹øÀç ¿ä¼Ò¸¦ Á¦¿ÜÇÑ ³ª¸ÓÁö ¿ä¼ÒµéÀ» ¹ÝȯÇÔ. (´Ü, ºó ¸®½ºÆ®´Â ¿¹¿Ü) ++ : µÎ°³ÀÇ ¸®½ºÆ®¸¦ ¿¬°áÇÔ. == : µÎ °³ÀÇ °ªÀÌ °°ÀºÁö ºñ±³ÇÔ. /= : µÎ °³ÀÇ °ªÀÌ ´Ù¸¥Áö ºñ±³ÇÔ. }}} {{{ Prelude> sqrt 2 1.41421 Prelude> id "hello" "hello" Prelude> id 5 5 Prelude> fst (5,2) 5 Prelude> snd (5,2) 2 Prelude> null [] True Prelude> null [1,2,3,4] False Prelude> head [1,2,3,4] 1 Prelude> tail [1,2,3,4] [2,3,4] Prelude> [1,2,3] ++ [4,5,6] [1,2,3,4,5,6] Prelude> [1,2,3] == [1,2,3] True Prelude> 'a' /= 'b' True Prelude> head [] Program error: {head []} }}} === let ¿«±â (let binding) === ÀÌÂ÷¹æÁ¤½ÄÀÇ ±ÙÀ» ±¸Çϱâ À§ÇÑ ÇÁ·Î±×·¥À» ÀÛ¼ºÇغ¾½Ã´Ù. a * x ^ 2 + b * x + c = 0 À̶ó´Â ÀÌÂ÷¹æÁ¤½ÄÀÌ ÀÖ´Ù¸é, {{{ roots a b c = ((-b + sqrt(b*b - 4*a*c)) / (2*a), (-b - sqrt(b*b - 4*a*c)) / (2*a)) }}} sqrt(b*b - 4*a*c) ¶ó´Â ºÎºÐÀº °øÅëÀûÀ̹ǷÎ, let/in ±¸¹®À» ÀÌ¿ëÇÏ¿© roots ¶ó´Â ÇÔ¼ö ³»ºÎ¿¡¼­¸¸ »ç¿ëµÇ´Â det ÇÔ¼ö¸¦ Á¤ÀÇÇϸé Áߺ¹À» ÁÙÀÏ ¼ö ÀÖ½À´Ï´Ù. {{{ roots a b c = let det = sqrt (b*b - 4*a*c) in ((-b + det) / (2*a), (-b - det) / (2*a)) }}} let ¿¡´Â µÎ °³ ÀÌ»óÀÇ ÇÔ¼ö Á¤ÀÇ°¡ Æ÷Ç﵃ ¼ö ÀÖ½À´Ï´Ù. ±×·¯¹Ç·Î ´ÙÀ½°ú °°ÀÌ ¹Ù²Ü ¼ö ÀÖ½À´Ï´Ù. {{{ roots a b c = let det = sqrt (b*b - 4*a*c) twice_a = 2*a in ((-b + det) / twice_a, (-b - det) / twice_a) }}} === ÁßÀ§ ¿¬»êÀÚ === + ¿¬»êÀÚ´Â ´ÙÀ½°ú °°ÀÌ ÁßÀ§ ¿¬»êÀÚ·Î »ç¿ëµË´Ï´Ù. {{{ Prelude> 5 + 10 15 }}} ±×·¯³ª ´ÙÀ½°ú °°ÀÌ °ýÈ£·Î ¹­¾îÁÖ¸é ´Ù¸¥ ÇÔ¼öµé°ú ¸¶Âù°¡Áö·Î ÀÎÀÚµé ¿ÞÂÊ¿¡¼­ ¾µ ¼ö ÀÖ½À´Ï´Ù. {{{ Prelude> (+) 5 10 15 }}} ¹Ý´ë·Î, ´Ù¸¥ ÇÔ¼öµéÀº ` ¹®ÀÚ·Î ¹­¾îÁÖ¸é ÁßÀ§ ¿¬»êÀÚó·³ »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù. {{{ Prelude> map Char.toUpper "Hello World" "HELLO WORLD" Prelude> Char.toUpper ¡®map¡® "Hello World" "HELLO WORLD" }}} == ÁÖ¼® == ÇÑ ÁÙ ÁÖ¼®Àº -- À¸·Î ½ÃÀÛÇÏ°í, ¿©·¯ÁÙ ÁÖ¼®Àº {- ·Î ½ÃÀÛÇؼ­ -} ·Î ³¡³³´Ï´Ù. C¿¡¼­¿Í´Â ´Ù¸£°Ô, ÁÖ¼®ÀÇ Áßøµµ Çã¿ëÇÕ´Ï´Ù. ¿¹¸¦ µé¸é ´ÙÀ½°ú °°½À´Ï´Ù. {{{ module Test2 where main = putStrLn "Hello World" -- write a string -- to the screen {- f is a function which takes an integer and produces integer. {- this is an embedded comment -} the original comment extends to the matching end-comment token: -} fx= case x of 0 -> 1 -- 0 maps to 1 1 -> 5 -- 1 maps to 5 2 -> 2 -- 2 maps to 2 _ -> -1 -- everything else maps to -1 }}} == Àç±Í == ¸í·ÉÇü ¾ð¾î¿¡¼­´Â Á¦¾î±¸¹®À¸·Î ¹Ýº¹¹®ÀÌ ¸¹ÀÌ ¾²ÀÌÁö¸¸ ÇϽºÄÌ¿¡¼­ ¹Ýº¹¹®Àº °¡´ÉÇÏÁö ¾Ê½À´Ï´Ù. ´ë½Å¿¡ Àç±Í¸¦ »ç¿ëÇÕ´Ï´Ù. C¿¡¼­´Â Àç±Í¸¦ »ç¿ëÇÏÁö ¾Ê°í ´ÙÀ½°ú °°ÀÌ ¸¸µé¼ö ÀÖ½À´Ï´Ù. {{{ int factorial(int n) { int fact = 1; for (int i=2; i <= n; i++) fact = fact * i; return fact; } }}} ¹°·Ð C¿¡¼­µµ Àç±Í¸¦ »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù. {{{ int factorial(int n) { if (n == 1) return 1; else return n * factorial(n-1); } }}} ¹Ý¸é, ÇϽºÄÌ¿¡¼­´Â Àç±Í¸¦ »ç¿ëÇÏ¿© ´ÙÀ½°ú °°ÀÌ ³ªÅ¸³¾ ¼ö ÀÖ½À´Ï´Ù. {{{ factorial 1 = 1 factorial n = n * factorial (n-1) }}} ½ÂÀ» ±¸ÇÏ´Â ÇÔ¼ö´Â ´ÙÀ½°ú °°½À´Ï´Ù. {{{ exponent a 1 = a exponent a b = a * exponent a (b-1) }}} Àç±ÍÇÔ¼ö´Â ¸®½ºÆ®¿¡ ´ëÇؼ­µµ »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù. ¸®½ºÆ®ÀÇ ±æÀ̸¦ ±¸ÇÏ´Â ÇÔ¼ö¸¦ ÀçÀÛ¼ºÇÏ¸é ´ÙÀ½°ú °°½À´Ï´Ù. {{{ my_length [] = 0 my_length (x:xs) = 1 + my_length xs }}} filter ÇÔ¼öµµ ÀçÀÛ¼ºÇغ¾½Ã´Ù. {{{ my_filter p [] = [] my_filter p (x:xs) = if p x then x : my_filter p xs else my_filter p xs }}} ±×·¯¸é À̹ø¿¡´Â ÇǺ¸³ªÄ¡¼ö¿­À» ¸¸µé¾îº¾½Ã´Ù. {{{ fibo x y = x : (fibo y (x+y)) fibonacci = fibo 1 1 }}} == ÀÔÃâ·Â == ÀÔÃâ·ÂÀ» ó¸®Çϱâ À§Çؼ­ ¸ð³ªµå¶ó´Â °³³äÀÌ »ç¿ëµÇÁö¸¸ ¿©±â¼­ ¼³¸íÇÏÁö´Â ¾Ê°Ú½À´Ï´Ù. ¿©±â¼­´Â ´ëÈ­½Ä(interactive) ÇÔ¼ö¸¦ ¸¸µé±â À§Çؼ­ »ç¿ëµÇ´Â °ÍÀÌ do ±¸¹®ÀÔ´Ï´Ù. ÀÌ´Â ¼ø¼­´ë·Î ¸í·É¾î¸¦ ¼öÇàÇϵµ·Ï °­Á¦ÇÕ´Ï´Ù. (ÇϽºÄÌÀº ´À±ßÇÑ ¾ð¾îÀ̱⠶§¹®¿¡ º¸ÅëÀº ¸í·É¾îÀÇ ¼ø¼­°¡ Á¤ÇØÁöÁö ¾Ê½À´Ï´Ù.) Name.hs ÆÄÀÏÀ» ´ÙÀ½°ú °°ÀÌ ÀÛ¼ºÇÏ°í ºÒ·¯¿É´Ï´Ù. {{{ module Main where import IO main = do hSetBuffering stdin LineBuffering putStrLn "Please enter your name: " name <- getLine putStrLn ("Hello, " ++ name ++ ", how are you?") }}} ½ÇÇàÀº ´ÙÀ½°ú °°ÀÌ main ÇÔ¼ö¸¦ È£ÃâÇÏ¸é µË´Ï´Ù. {{{ *Main> main Please enter your name: Hal Hello, Hal, how are you? *Main> }}} hSetBuffering stdin LineBuffering´Â ¹öÆÛ¸¦ ¼³Á¤ÇÑ´Ù°í¸¸ ¾Ë¸é µÇ°í, ´ÙÀ½À¸·Î ³Ñ¾î°¡°Ú½À´Ï´Ù. putStrLn´Â È­¸é¿¡ ¹®ÀÚ¿­À» Ãâ·ÂÇÏ´Â ÇÔ¼öÀÔ´Ï´Ù. name <- getLine ´Â name = getLine °¡ µÅ¾ßÇÏ´Â °ÍÀÌ ¾Æ´Ñ°¡ »ý°¢ÀÌ µéÁöµµ ¸ð¸£°Ú½À´Ï´Ù¸¸, getLine Àº ¼ø¼öÇÑ `ÇÔ¼ö'°¡ ¾Æ´Ï°í ºÎ¼öÈ¿°ú°¡ ÀÖ´Â `Çൿ'À̱⠶§¹®¿¡ <- ¿¬»êÀÚ°¡ »ç¿ëµÇ¾ßÇÕ´Ï´Ù. ±×·¡¼­ `getLineÀ̶ó´Â ÇൿÀ» ¼öÇàÇÏ°í ±× °á°ú¸¦ name¿¡ ÀúÀåÇ϶ó'´Â ¶æÀÌ µË´Ï´Ù. ¿©±â¼­, `Çൿ'Àº ºÎ¼öÈ¿°ú¸¦ °¡Áö´Â ¸í·É¹®À̶ó°í »ý°¢ÇÏ°í ³Ñ¾î°©½Ã´Ù. ±×·¯¸é ´ÙÀ½°ú °°ÀÌ ¼ýÀÚ¸ÂÃ߱⠰ÔÀÓÀÎ "Guess.hs" ¸¦ ÀÛ¼ºÇغ¾½Ã´Ù. {{{ import IO import Random main = do hSetBuffering stdin LineBuffering num <- randomRIO (1::Int, 100) putStrLn "I'm thinking of a number between 1 and 100" doGuessing num doGuessing num = do putStrLn "Enter your guess:" guess <- getLine let guessNum = read guess if guessNum < num then do putStrLn "Too low!" doGuessing num else if read guess > num then do putStrLn "Too high!" doGuessing num else do putStrLn "You Win!" }}} import Random ±¸¹®Àº Random ¸ðµâ¿¡ ÀÖ´Â randomRIO¶ó´Â ÇÔ¼ö¸¦ »ç¿ëÇϱâ À§ÇØ ÇÊ¿äÇÕ´Ï´Ù. randomRIO (1::Int, 100) Àº 1ºÎÅÍ 100±îÁöÀÇ Á¤¼ö Áß¿¡¼­ ÇϳªÀÇ ¼ö¸¦ ·£´ýÇÏ°Ô ¹ÝȯÇϴµ¥, Á¤¼ö¶ó´Â °ÍÀ» ¾Ë¸®±â À§ÇØ ::Int °¡ ÇÊ¿äÇÕ´Ï´Ù. read guess ´Â ¼ø¼öÇÑ ÇÔ¼öÀ̱⠴빮¿¡ <- ±¸¹®À» »ç¿ëÇÒ ÇÊ¿ä°¡ ¾øÀ¸¸ç »ç½Ç »ç¿ëÇÒ ¼öµµ ¾ø½À´Ï´Ù. ¶Ç, do ±¸¹® ³»¿¡¼­´Â let ±¸¹®¿¡ inÀÌ ÇÊ¿ä¾ø½À´Ï´Ù. À§ÀÇ ¿¹¿¡¼­´Â returnÀÌ ÇÊ¿ä¾ø¾úÁö¸¸ °ªÀ» ¹ÝȯÇÏ´Â ÇÔ¼ö¸¦ ¸¸µé±â À§Çؼ­´Â returnÇÔ¼ö°¡ ÇÊ¿äÇÕ´Ï´Ù. {{{ askForWords = do putStrLn "Please enter a word:" word <- getLine if word == "" then return [] else return (word : askForWords) }}} À§ ÄÚµå´Â ¿À·ù°¡ Àֱ⠶§¹®¿¡ ½ÇÇàµÇÁö ¾Ê½À´Ï´Ù. ¾Õ¿¡¼­ ¹è¿ü´Ù½ÃÇÇ : ¿¬»êÀÚÀÇ ¿À¸¥ÂÊ¿¡ ¸®½ºÆ®°¡ ¿Í¾ßÇϴµ¥ askForWords ´Â ¸®½ºÆ®°¡ ¾Æ´Ï°í, ¸®½ºÆ®¸¦ ¹ÝȯÇÏ´Â ÇÔ¼öµµ ¾Æ´Õ´Ï´Ù. askForWords´Â ¸®½ºÆ®¸¦ ¹ÝȯÇÏ´Â ÇൿÀ̱⠶§¹®¿¡ ¿À·ù°¡ ¹ß»ýÇÕ´Ï´Ù. ±×·¯¹Ç·Î ´ÙÀ½°ú °°ÀÌ ¸í½ÃÀûÀ¸·Î <- ¸¦ »ç¿ëÇÏ¿© ÀÛ¼ºÇؾßÇÕ´Ï´Ù. {{{ askForWords = do putStrLn "Please enter a word:" word <- getLine if word == "" then return [] else do rest <- askForWords return (word : rest) }}} = Çü(type) = ÇϽºÄÌÀº Á¤ÀûÇü ¾ð¾î(static type language)ÀÔ´Ï´Ù. ÀÌ ¸»ÀÇ Àǹ̴Â, ÇϽºÄÌ¿¡´Â ¸ðµç Ç¥Çö½Ä¿¡´Â ÇüÀÌ ¹èÁ¤µÈ´Ù´Â °ÍÀÔ´Ï´Ù. ¿¹¸¦ µé¸é, 'a'ÀÇ ÇüÀº CharÀÔ´Ï´Ù. ÇÔ¼öÀÇ ÀÎÀÚ¿¡µµ ÇüÀÌ ÇÊ¿äÇÕ´Ï´Ù. ¸¸¾à ´Ù¸¥ ÇüÀ» ÀÎÀÚ·Î ³Ö°Ô µÇ¸é ÄÄÆÄÀÏ ¿À·ù°¡ ¹ß»ýÇÕ´Ï´Ù. ÀÌ·± Ư¡À¸·Î ÀÎÇØ ¸¹Àº ¹ö±×¸¦ ÁÙÀÏ ¼ö ÀÖ½À´Ï´Ù. °Ô´Ù°¡ ÇϽºÄÌÀº Çü Ãß·Ð ½Ã½ºÅÛÀ» »ç¿ëÇÕ´Ï´Ù. ÀÌ´Â ¸ðµç Ç¥ÇöÀÇ ÇüÀ» ÁöÁ¤ÇØÁÙ ÇÊ¿ä°¡ ¾ø´Ù´Â ¸»ÀÔ´Ï´Ù. C¿¡¼­´Â º¯¼ö¸¦ ¼±¾ðÇÒ ¶§ int, char, .. °°Àº ÇüÀ» ÁöÁ¤ÇؾßÇßÁö¸¸, ÇϽºÄÌ¿¡¼­´Â ÇüÀ» ¹®¸Æ¿¡¼­ Ãß·ÐÇÏ°Ô µË´Ï´Ù. ¶ÇÇÑ ÇüÀ» ¸í½ÃÀûÀ¸·Î ÁöÁ¤ÇÏ´Â °Íµµ °¡´ÉÇÕ´Ï´Ù. ÀÌ °æ¿ì¿¡´Â µð¹ö±ëÇϴµ¥ µµ¿òÀ» ÁÙ °ÍÀÔ´Ï´Ù. Hugs ¿Í GHCi ¿¡¼­´Â :t ¸í·É¾î·Î Ç¥Çö½ÄÀÇ ÇüÀ» ¾Ë¾Æ³¾ ¼ö ÀÖ½À´Ï´Ù. {{{ Prelude> :t 'c' 'c' :: Char }}} À̸¦ ÅëÇØ 'c' ´Â CharÇüÀ̶ó´Â °ÍÀ» ¾Ë ¼ö ÀÖ½À´Ï´Ù. == ±âº»Çü == ³»ÀåµÈ ±âº»Çü¿¡´Â, Int (Á¤¼ö), Double (½Ç¼ö), Char (¹®ÀÚ), String (¹®ÀÚ¿­) µîÀÌ ÀÖ½À´Ï´Ù. À̹ø¿¡´Â ¹®ÀÚ¿­ÀÇ ÇüÀ» ¾Ë¾Æº¾½Ã´Ù. {{{ Prelude> :t "Hello" "Hello" :: String }}} Á» ´õ º¹ÀâÇÑ ¼ö½Ä¿¡ ´ëÇؼ­µµ ÇÒ ¼ö ÀÖ½À´Ï´Ù. {{{ Prelude> :t 'a' == 'b' 'a' == 'b' :: Bool }}} ¿©±â¼­ BoolÀº Âü ¶Ç´Â °ÅÁþ°ªÀ» °¡Áö´Â Boolean(`ºÒ¸®¾ð'À̶ó°í ¹ßÀ½µÇ´Â)ÀÇ ¾àÀÚÀÔ´Ï´Ù. ¸¸¾à ÇüÀÌ ´Ù¸¥ °ªÀ» ºñ±³¿¬»êÀÚ¸¦ ÀÌ¿ëÇÏ¿© ºñ±³ÇÏ¸é ´ÙÀ½°ú °°ÀÌ ¿À·ù°¡ ¹ß»ýÇÕ´Ï´Ù. {{{ Prelude> :t 'a' == "a" ERROR - Type error in application *** Expression : 'a' == "a" *** Term : 'a' *** Type : Char *** Does not match : [ Char ] }}} ¾Õ¿¡¼­ ¹è¿üµíÀÌ :: ¸¦ ÀÌ¿ëÇÏ¿© ÇüÀ» ¸í½ÃÀûÀ¸·Î ÁöÁ¤ÇÒ ¼ö ÀÖ½À´Ï´Ù. {{{ Prelude> :t (5 :: Int) (5 :: Int) :: Int Prelude> :t (5 :: Double) (5 :: Double) :: Double }}} 5¶ó´Â °ªÀº Á¤¼öÇü ¶Ç´Â ½Ç¼öÇüÀ¸·Î ÁöÁ¤ÇÒ ¼ö ÀÖ´Ù´Â °ÍÀ» ¹ß°ßÇÒ ¼ö ÀÖ½À´Ï´Ù. ±×·³, ÇüÀ» ÁöÁ¤ÇÏÁö ¾ÊÀ¸¸é ¾î¶² °á°ú°¡ ³ª¿À´ÂÁö »ìÆ캾½Ã´Ù. {{{ Prelude> :t 5 5 :: Num a => a }}} ÀÌ¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ ³»¿ëÀº `Çü Ŭ·¡½º'¿¡¼­ »ìÆ캸±â·Î ÇÏ°í ³Ñ¾î°©½Ã´Ù. == ´ÙÇüÀû Çü == ÇϽºÄÌ¿¡´Â ´ÙÇüÀû Çü ½Ã½ºÅÛÀ» °¡Áö°í ÀÖ½À´Ï´Ù. Áï, Çü º¯¼ö¸¦ »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù. tail ÇÔ¼ö¸¦ »ìÆ캸¸é, {{{ Prelude> tail [5,6,7,8,9] [6,7,8,9] Prelude> tail "hello" "ello" Prelude> tail ["the","man","is","happy"] ["man","is","happy"] }}} ¸®½ºÆ® ³»ºÎÀÇ ¿ä¼ÒÀÇ Çü¿¡ »ó°ü¾øÀÌ »ç¿ëÇÒ ¼ö ÀÖ´Ù´Â °ÍÀ» ¾Ë ¼ö ÀÖ½À´Ï´Ù. ÀÌ´Â tail ÇÔ¼ö´Â ´ÙÇüÀû Çü [ a ] ¡æ [ a ] ¸¦ »ç¿ëÇϱ⠶§¹®ÀÔ´Ï´Ù. ÀÌ·Î ÀÎÇØ ÀÓÀÇÀÇ ÇüÀ» ´Ù·ê ¼ö ÀÖ½À´Ï´Ù. {{{ Prelude> :t tail tail :: [a] -> [a] }}} fstµµ »ìÆ캼°Ú½À´Ï´Ù. {{{ Prelude> :t fst fst :: (a, b) -> a }}} ±×·¯¹Ç·Î a, bÀÇ Çü¿¡ »ó°ü¾øÀÌ, fst ÇÔ¼ö´Â (a, b) ¿¡¼­ a °ªÀ» ¹ÝȯÇÕ´Ï´Ù. == Çü Ŭ·¡½º == ¾Õ¿¡¼­ ¼ýÀÚ 5¶ó´Â °ªÀº Á¤¼öÇü ¶Ç´Â ½Ç¼öÇüÀ¸·Î ÁöÁ¤ÇÒ ¼ö ÀÖ´Ù´Â °Í°ú Çü Ŭ·¡½º¿Í °ü·ÃÀÌ ÀÖ´Ù´Â °ÍÀ» ¹è¿ü½À´Ï´Ù. ÀÌÁ¦ Çü Ŭ·¡½º¿¡ ´ëÇؼ­ Á» ´õ ÀÚ¼¼È÷ ¾Ë¾Æº¾½Ã´Ù. === Çü Ŭ·¡½ºÀÇ Çʿ伺 === ¸¹Àº ¾ð¾î¿¡¼­´Â ¿À¹ö·ÎµùÀ̶ó´Â ½Ã½ºÅÛÀÌ ÀÖ½À´Ï´Ù. Áï, ÇÔ¼öÀÇ ÀÎÀÚ°¡ ´Ù¸£¸é ÇÔ¼öÀÇ µ¿ÀÛÀÌ ´Þ¶óÁý´Ï´Ù. ¿¹¸¦ µé¾î µÎ °´Ã¼¸¦ ºñ±³ÇÏ´Â equal ÇÔ¼ö°¡ ÀÖ´Ù°í Çϸé, Á¤¼ö¸¦ ºñ±³Çϱâ À§ÇÑ ¹æ¹ý°ú, ½Ç¼ö¸¦ ºñ±³Çϱâ À§ÇÑ µ¿ÀÛ, ¹®ÀÚ¸¦ ºñ±³Çϱâ À§ÇÑ µ¿ÀÛ, ¹®ÀÚ¿­À» ºñ±³ÇÏ´Â µ¿ÀÛ ¸ðµÎ ´Ù¸¨´Ï´Ù. ÀϹÝÀûÀ¸·Î ¿ì¸®°¡ ¥áÇüÀÇ °ª µÎ °³¸¦ ºñ±³ÇÏ°í ½ÍÀ» ¶§, ¥á-compareÀ» »ç¿ëÇÑ´Ù°í ÇսôÙ. ¥á´Â Çü Á¤º¸¸¦ ÀúÀåÇÏ´Â º¯¼öÀ̹ǷÎ, Çü º¯¼ö¶ó°í ÇÕ´Ï´Ù. ±×·¯³ª ºÒÇàÇÏ°Ôµµ Á¤ÀûÇü ½Ã½ºÅÛ¿¡¼­´Â ¸î°¡Áö ¹®Á¦°¡ ÀÖ½À´Ï´Ù. ¾î¶² Çü¿¡¼­ ¾î¶² µ¿ÀÛÀÌ Á¤ÀǵžßÇÒÁö¸¦ Çü °Ë»ç±â°¡ ¾ËÁö ¸øÇÕ´Ï´Ù. ÀÌ·± ¹®Á¦¸¦ Ç®±â À§ÇÑ ¸¹Àº ¹æ¹ýµéÀÌ Àִµ¥, (»ç½Ç º°·Î ¸¹Áö´Â ¾Ê½À´Ï´Ù.) ÇϽºÄÌ¿¡¼­ ÀÌ·± ¹®Á¦¸¦ ÇØ°áÇÏ´Â ¹æ½ÄÀº Çü Ŭ·¡½ºÀÔ´Ï´Ù. === equality Å×½ºÆ® === == ¶ó´Â ÇÔ¼ö(¶Ç´Â ¿¬»êÀÚ, ÇϽºÄÌ¿¡¼­´Â ¿¬»êÀÚ°¡ °ð ÇÔ¼öÀÓ.)°¡ µÎ °ªÀ» ºñ±³ÇÏ´Â °æ¿ì¸¦ »ìÆ캾½Ã´Ù. ¿ì¼± µÎ °ªÀÇ ÇüÀÌ °°¾Æ¾ß ÇÏ°í, (À̸¦ ¥á ¶ó°í ÇսôÙ.) ¹ÝȯÇüÀº Bool ÀÔ´Ï´Ù. == ¶ó´Â ÇÔ¼ö´Â ¸î¸î Çü¿¡¼­¸¸ Á¤ÀǵÅÀÖ½À´Ï´Ù. (¸ðµç Çü¿¡ Á¤ÀÇµÈ °ÍÀÌ ¾Æ´Õ´Ï´Ù.) ±×¸®°í == ÇÔ¼ö´Â Eq¶ó´Â Çü Ŭ·¡½º¿Í °áÇÕµÅÀÖ½À´Ï´Ù. `°áÇÕµÅÀÖ´Ù'´Â Àǹ̴Â, ¥á¶ó´Â ÇüÀÌ Eq Ŭ·¡½º¿¡ ¼ÓÇØÀÖ´Ù¸é == ÇÔ¼ö°¡ ¥áÇü¿¡ ´ëÇØ Á¤ÀǵÅÀÖ´Ù´Â °ÍÀ» ¶æÇÕ´Ï´Ù. À̶§, ¥á´Â Eq Ŭ·¡½ºÀÇ ÀνºÅϽº¶ó°í ÇÕ´Ï´Ù. ¿¹¸¦µé¾î Int´Â EqÀÇ ÀνºÅϽºÀÔ´Ï´Ù. ±×¸®°í ÇϽºÄÌ¿¡¼­´Â Çü Ŭ·¡½º¸¦ `Ŭ·¡½º'¶ó°í ºÎ¸£±âµµ ÇÕ´Ï´Ù. === Num Ŭ·¡½º === ÇϽºÄÌ¿¡¼­ == ¿Í °°ÀÌ ¿¬»êÀÚ¸¦ ¿À¹ö·ÎµùÇÒ »Ó¸¸ ¾Æ´Ï¶ó, ¼ýÀÚ »ó¼ö (1, 2, 3, ... µî) µéµµ ¿À¹ö·ÎµùÇÕ´Ï´Ù. ¼ýÀÚ 5¿Í °°Àº °æ¿ì´Â Num Ŭ·¡½º·Î Á¤ÀǵǾîÀÖ°í, Num Ŭ·¡½ºÀÇ ÀνºÅϽº¿¡´Â ±âº» ¼ýÀÚÇüÀÎ Int¿Í Double°¡ Á¤ÀǵǾîÀÖ½À´Ï´Ù. ±×·¯¹Ç·Î ¼ýÀÚ 5´Â ÄÄÆÄÀÏ·¯°¡ º¼¶§, Á¤¼öÇüÀ¸·Î º¼ ¼öµµ ÀÖ°í, ½Ç¼öÇüÀ¸·Î º¼ ¼öµµ ÀÖ°Ô µË´Ï´Ù. === Show Ŭ·¡½º === Show Ŭ·¡½ºÀÇ show ÇÔ¼ö¸¦ »ç¿ëÇÏ¸é ¹®ÀÚ¿­ÀÌ ¾Æ´Ñ °ÍÀ» ¹®ÀÚ¿­·Î º¯È¯ÇÒ ¼ö ÀÖ½À´Ï´Ù. {{{ Prelude> show 5 "5" Prelude> show 'a' "'a'" Prelude> show "Hello World" "\"Hello World\"" }}} ¹®ÀÚ´Â ÀÛÀº µû¿ÈÇ¥·Î µÑ·¯½Î°í, ¹®ÀÚ¿­Àº Å« µû¿ÈÇ¥·Î µÑ·¯½Î°Ô µË´Ï´Ù. ¸¶Áö¸· ÁÙ¿¡ ¿ª½½·¡½¬°¡ Àִµ¥, ÀÌ´Â ´ëÈ­½Ä ȯ°æ¿¡¼­ Ư¼ö¹®ÀÚ¸¦ Ãâ·ÂÇϱâ À§ÇÑ °ÍÀÔ´Ï´Ù. ½ÇÁ¦ ¹®ÀÚ¿­Àº ¿ª½½·¡½¬¸¦ Æ÷ÇÔÇÏÁö ¾Ê½À´Ï´Ù. == ÇÔ¼öÀÇ Çü == 1À̳ª 'c'°ú °°Àº °ªµéÀº ÇüÀ» °¡Áö°í ÀÖ´Ù°í Çß½À´Ï´Ù. ±×·±µ¥ ÇϽºÄÌ¿¡¼­´Â ÇÔ¼öµµ ¿ª½Ã ÇüÀ» °¡Áö°í ÀÖ½À´Ï´Ù. === ¶÷´Ù ´ë¼ö (Lamda Calculus) === `¶÷´Ù ´ë¼ö' Àº ÇÔ¼ö¸¦ Ç¥ÇöÇÏ´Â °£´ÜÇÑ ½Ã½ºÅÛÀÔ´Ï´Ù. Á¦°öÀ» ±¸ÇÏ´Â ÇÔ¼ö´Â ´ÙÀ½°ú °°Àº `¶÷´Ù½Ä'À¸·Î ¾µ ¼ö ÀÖ½À´Ï´Ù. ¥ëx.x*x ¥ë´Â ¶÷´Ù Ãß»ó ¶Ç´Â ¶÷´Ù¶ó°í ºÎ¸£¸ç, ¶÷´Ù´Â ÇϳªÀÇ ÀÎÀÚ¸¸À» °¡Áú ¼ö ÀÖ½À´Ï´Ù. ±×·¯¹Ç·Î µÎ°³ÀÇ ÀÎÀÚ¸¦ ¹Þ±â À§Çؼ­´Â ¶÷´Ù°¡ 2°³°¡ ÇÊ¿äÇÕ´Ï´Ù. ¿¹¸¦ µé¾î ´ÙÀ½°ú °°½À´Ï´Ù. ¥ëx¥ëy.2*x+y ¶÷´Ù½ÄÀ» °è»êÇϱâ À§Çؼ­´Â °¡Àå ¹Ù±ùÂÊ¿¡ ÀÖ´Â ¥ë ¸¦ ¾ø¾Ö°í ¶÷´Ù º¯¼ö¸¦ ¸ðµÎ ±× °ªÀ¸·Î º¯È¯ÇÕ´Ï´Ù. ¿¹¸¦ µé¾î (¥ëx.x * x)5 ¸¦ °è»êÇÏ·Á¸é ¥ëx ¸¦ ¾ø¾Ö°í (x * x) ¿¡¼­ x ¸¦ 5·Î ¹Ù²Ù¸é (5 * 5) °¡ µÇ¹Ç·Î 25°¡ µË´Ï´Ù. ÇϽºÄÌ¿¡¼­´Â ¶÷´Ù½ÄÀ» »ç¿ëÇÒ ¼ö Àִµ¥, ¥ë´Â \ ·Î ¹Ù²Ù°í, . Àº -> ·Î ¹Ù²Ù¸é µË´Ï´Ù. ±×¸®°í ¿©·¯ °³ÀÇ ¥ë´Â ÇϳªÀÇ \·Î ¹Ù²ò´Ï´Ù. {{{ square = \x -> x*x f = \x y -> 2*x + y }}} ÇϽºÄÌ¿¡¼­´Â ¶÷´Ù°è»êµµ °¡´ÉÇÕ´Ï´Ù. {{{ Prelude> (\x -> x*x) 5 25 Prelude> (\x y -> 2*x + y) 5 4 14 }}} === °íÂ÷¿ø Çü === ´Ù¸¥ °ªµé°ú´Â ´Ù¸£°Ô, ÇÔ¼öÀÇ ÇüÀ» ³ªÅ¸³»±â À§Çؼ­´Â °íÂ÷¿ø ÇüÀÌ ÇÊ¿äÇÕ´Ï´Ù. ´Ù½Ã Á¦°öÇÔ¼ö ¥ëx.x+x ¸¦ »ý°¢ÇØ º¾½Ã´Ù. ¸¸¾à x°¡ Int¶ó°í Çϸé, Á¦°öÇÔ¼ö´Â ÇϳªÀÇ Á¤¼öÇü ¼ýÀÚÀ» ¹Þ¾Æ¼­ Á¤¼öÇüÀÇ Á¦°ö°ªÀ» ¹ÝȯÇÏ°Ô µË´Ï´Ù. ÀÌ ¶§, Á¦°öÇÔ¼öÀÇ ÇüÀ» Int ¡æ Int ¶ó°í ÇսôÙ. ÀÌÁ¦, ¥ëx¥ëy.2*x+y ¶ó´Â ÇÔ¼ö f¸¦ »ý°¢Çغ¾½Ã´Ù. x ¿¡ 5¸¦ ´ëÀÔÇϸé, À§¿¡¼­ ¹è¿î °Íó·³ (¥ëx¥ëy.2x + y)5 °¡ µÇ°í ÀÌ´Â ¥ëy.10 + y °¡ µË´Ï´Ù. ±×·±µ¥ ÀÌ °á°ú°ªÀº Int ¡æ Int ¶ó´Â ÇÔ¼ö°¡ ³ª¿Ô½À´Ï´Ù. ±×·¯¹Ç·Î ÇÔ¼ö f ´Â Int ÇüÀÇ ÀÎÀÚ¸¦ ¹Þ¾Æ¼­ Int ¡æ Int ¶ó´Â ÇÔ¼ö¸¦ °á°ú°ªÀ¸·Î ³»º¸³»¹Ç·Î, ÇÔ¼ö fÀÇ ÇüÀº Int ¡æ (Int ¡æ Int) °¡ µË´Ï´Ù. ¿©±â¼­ °ýÈ£´Â ¾ø¾îµµ »ó°ü¾ø½À´Ï´Ù. Áï, (Int ¡æ Int) ¡æ Int ³ª Int ¡æ Int ¡æ Int ¸ðµÎ °°½À´Ï´Ù. ÀϹÝÈ­Çؼ­ Int°¡ ¾Æ´Ñ a¶ó´Â Çü¿¡ Àû¿ë½ÃÄѺ¸¸é, ÇÔ¼ö fÀÇ ÇüÀº a ¡æ a ¡æ a ·Î ³ªÅ¸³¾ ¼ö ÀÖ½À´Ï´Ù. ±×·³ ¸î°¡Áö ±âº» ÇÔ¼öµéÀÇ ÇüÀ» ¾Ë¾Æº¾½Ã´Ù. {{{ Prelude> :t head head :: [a] -> a Prelude> :t tail tail :: [a] -> [a] Prelude> :t null null :: [a] -> Bool Prelude> :t fst fst :: (a,b) -> a Prelude> :t snd snd :: (a,b) -> b }}} ÁßÀ§¿¬»êÀÚ¿¡ °ýÈ£¸¦ ºÙÀ̸é ÇÔ¼öó·³ ´Ù·ê ¼ö ÀÖÀ¸¹Ç·Î, ´ÙÀ½°ú °°ÀÌ ÇÒ ¼öµµ ÀÖ½À´Ï´Ù. {{{ Prelude> :t (+) (+) :: Num a => a -> a -> a Prelude> :t (*) (*) :: Num a => a -> a -> a Prelude> :t (++) (++) :: [a] -> [a] -> [a] Prelude> :t (:) (:) :: a -> [a] -> [a] }}} === ¼º°¡½Å IO Çü === ÀÔÃâ·Â ÇÔ¼öµéÀº ¾î¶² ÇüÀ» °¡Á³´ÂÁö »ìÆ캾½Ã´Ù. {{{ Prelude> :t putStrLn putStrLn :: String -> IO () Prelude> :t readFile readFile :: FilePath -> IO String }}} »ç½Ç À̵éÀº ºÎ¼öÈ¿°ú°¡ ÀÖ´Â `Çൿ'ÀÔ´Ï´Ù. ÀÌ·± Â÷ÀÌ·Î ÀÎÇØ Çൿ°ú ¼ø¼öÇÑ ÇÔ¼ö¸¦ °áÇÕÇÒ ¼ö ÀÖ´Â ¹æ¹ýÀº do ±¸¹® »ÓÀÔ´Ï´Ù. ¸¸¾à ¾î¶² ÆÄÀϷκÎÅÍ ¹®ÀÚ¿­À» ¹Þ¾Æ¼­, ¹®ÀÚ¿­À» ¼ýÀÚ¸¦ ¹Ù²Ù´Â ÇÔ¼ö f ¸¦ ÀÌ¿ëÇÏ¿© ¼ýÀÚ·Î ¹Ù²Ù°í, À̸¦ È­¸é¿¡ Ãâ·ÂÇϱâ À§Çؼ­´Â ´ÙÀ½°ú °°ÀÌ ÇؾßÇÕ´Ï´Ù. {{{ main = do s <- readFile "somefile" let i = f s putStrLn (show i) }}} ¿©±â¼­ <- ±¸¹®Àº ÀÔÃâ·Â ÇൿÀ¸·ÎºÎÅÍ ¹®ÀÚ¿­À» ¹Þ´Â´Ù´Â ¶æÀ̸ç, ±× ÀÌÈÄ¿¡ f ÇÔ¼ö¸¦ »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù. ¹Ý¸é¿¡ f°¡ ÇൿÀÌ ¾Æ´Ñ ¼ø¼öÇÑ ÇÔ¼öÀ̱⠶§¹®¿¡ i <- f s ¶ó°í ¾µ ¼ö´Â ¾ø½À´Ï´Ù. === ¸í½ÃÀû Çü ¼±¾ð === ¸í½ÃÀû Çü ¼±¾ðÀº ´ÙÀ½°ú °°Àº ¸é¿¡¼­ ÀåÁ¡ÀÌ ÀÖ½À´Ï´Ù. ¸íÈ®¼º, ¼Óµµ, µð¹ö±ë Çü ¼±¾ðÀº ÇÔ¼öÀÇ Á¤ÀÇ¿Í´Â º°µµ·Î ÀÌ·ïÁý´Ï´Ù. {{{ square :: Num a => a -> a square x = x*x }}} µÎ ¹®ÀåÀÌ ÀÎÁ¢ÇؾßÇÒ ÇÊ¿ä´Â ¾ø½À´Ï´Ù. ´Ù¸¸, ÇÔ¼öÁ¤ÀÇ¿¡ ÀÇÇØ Ãß·ÐµÈ Çü°ú ÀÏÄ¡Çϰųª ´õ ±¸Ã¼ÀûÀ̾î¾ßÇÕ´Ï´Ù. ´õ ±¸Ã¼ÀûÀ̶ó´Â Àǹ̴Â, ´ÙÀ½°ú °°ÀÌ ÇÔ¼öÀÎÀÚ¸¦ Á¤¼öÇüÀ¸·Î Á¦ÇÑÇÏ´Â °ÍÀ» ÀǹÌÇÕ´Ï´Ù. {{{ square :: Int -> Int square x = x*x }}} È®Àå±â´ÉÀ» ÀÌ¿ëÇؼ­ (Hugs ¿¡¼­´Â "-98" ¶Ç´Â GHC(i) ¿¡¼­´Â "-fglasgow-exts" ·Î ½ÇÇà¿É¼ÇÀ» ÁÖ°í ½ÇÇàÇÑ´Ù.) ´ÙÀ½°ú °°ÀÌ ÇÔ¼öÁ¤ÀÇ¿Í ÇÔ²² ÇüÀ» ÁöÁ¤ÇØ ÁÙ ¼öµµ ÀÖ½À´Ï´Ù. {{{ square (x :: Int) = x*x }}} ´ÙÀ½°ú °°ÀÌ ´ëÈ­½Ä ȯ°æ¿¡¼­ square ÇÔ¼öÀÇ ÇüÀ» ¾Ë¾Æº¾½Ã´Ù. {{{ Prelude> let square (x :: Int) = x*x Prelude> :t square square :: Int -> Int }}} ¹°·Ð, ´ÙÀ½°ú °°ÀÌ ¶÷´Ù½ÄÀ» »ç¿ëÇÒ ¼öµµ ÀÖ½À´Ï´Ù. {{{ Prelude> :t (\(x :: Int) -> x*x) }}} ±×·¯¸é À̹ø¿¡´Â Int ÇüÀ» Double ÇüÀ¸·Î ¹Ù²Ù´Â ÇÔ¼ö intToDoubleÀ» ¸¸µé¾îº¾½Ã´Ù. realToFracÀ̶ó´Â Ç¥ÁØÇÔ¼ö´Â Real Ŭ·¡½ºÀÇ ÇüÀ» Fractional Ŭ·¡½ºÀÇ ÇüÀ¸·Î ¹Ù²ãÁÝ´Ï´Ù. {{{ Prelude> :t realToFrac realToFrac :: (Fractional b, Real a) => a -> b }}} ±×·¯¸é intToDoubleÀ» ¸¸µé±â À§Çؼ­´Â Çü ¼±¾ðÀ» ÇÏ°í realToFracÀ» ÀÌ¿ëÇÏ¸é µË´Ï´Ù. {{{ intToDouble :: Int -> Double intToDouble = realToFrac }}} {{{ *MyModule> let x = intToDouble 7 *MyModule> x 7.0 *MyModule> :t x x :: Double }}} === ÇÔ¼ö¸¦ ÀÎÀÚ·Î »ç¿ëÇϱâ === mapÀ̳ª filter °°Àº ÇÔ¼ö´Â ¶Ç ´Ù¸¥ ÇÔ¼ö¸¦ ÀÎÀÚ·Î »ç¿ëÇÕ´Ï´Ù. ¸ÕÀú map ÇÔ¼ö¸¦ »ý°¢Çغ¾½Ã´Ù. ¸®½ºÆ®¸¦ ÀÎÀÚ·Î ¹Þ¾Æ¼­ ¶Ç ´Ù¸¥ ¸®½ºÆ®¸¦ ¹ÝȯÇÕ´Ï´Ù. À̶§ µÎ ¸®½ºÆ®ÀÇ ÇüÀº ´Ù¸¦ ¼öµµ ÀÖ½À´Ï´Ù. ÀÌ ÇüÀº ÀÎÀÚ·Î ¹Þ´Â ÇÔ¼öÀÇ Çü¿¡ ÀÇÇØ °áÁ¤µË´Ï´Ù. ±×·¯¹Ç·Î mapÀÇ ÇüÀº (a ¡æ b) ¡æ [a] ¡æ [b] °¡ µË´Ï´Ù. filter ÇÔ¼öÀÇ ÇüÀº (a ¡æ Bool) ¡æ [a] ¡æ [a] ÀÔ´Ï´Ù. ±×·¯¸é foldl ÀÇ ÇüÀº ¹«¾ùÀϱî¿ä? ¾Æ¸¶ (a ¡æ a ¡æ a) ¡æ a ¡æ [a] ¡æ a ¸¦ »ý°¢ÇßÀ»Áö ¸ð¸¨´Ï´Ù. ±×·¯³ª ½ÇÁ¦·Î´Â À̺¸´Ù´Â ´õ ÀϹÝÀûÀÎ (a ¡æ b ¡æ a) ¡æ a ¡æ [b] ¡æ a °¡ foldlÀÇ ÇüÀÔ´Ï´Ù. ºñ½ÁÇÏ°Ô foldr ÀÇ ÇüÀº (a ¡æ b ¡æ b) ¡æ b ¡æ [a] ¡æ b ÀÔ´Ï´Ù. ¸®½ºÆ®ÀÇ ¿ä¼ÒÀÇ Çü°ú ÃʱⰪÀÇ ÇüÀÌ ´Ù¸¦ ¼öµµ ÀÖ´Ù´Â »ç½ÇÀ» ÀÌ¿ëÇÏ¿© ÇÔ¼ö¸¦ Çϳª ¸¸µé¾îº¾½Ã´Ù. ¸®½ºÆ®ÀÇ ¿ä¼Ò Áß¿¡¼­ ¾î¶² Á¶°ÇÀ» ¸¸Á·ÇÏ´Â ¿ä¼ÒÀÇ °³¼ö¸¦ ¹ÝȯÇÏ´Â ÇÔ¼ö count¸¦ Á¤ÀÇÇغ¾½Ã´Ù. ¹°·Ð length¿Í filter¸¦ »ç¿ëÇؼ­ my_count p l = length (filter p l) ·Î ¸¸µé¼öµµ ÀÖÁö¸¸, À̹ø¿¡´Â foldr ¸¦ »ç¿ëÇؼ­ ¸¸µé¾îº¾½Ã´Ù. {{{ module Count where my_count p l = foldr (\x c -> if p x then c+1 else c) 0 l }}} ÀÌ ¶§, my_count ÇÔ¼öÀÇ ÇüÀº (Num b) => (a ¡æ Bool) ¡æ [a] ¡æ b °¡ µË´Ï´Ù. == ÀÚ·áÇü == ¼ø¼­½Ö°ú ¸®½ºÆ®µµ ÈǸ¢ÇÑ ÀڷᱸÁ¶ÀÌÁö¸¸, ÀڽŸ¸ÀÇ ÀڷᱸÁ¶¸¦ Á¤ÀÇÇÏ°í ½ÍÀ» ¶§µµ ÀÖ½À´Ï´Ù. ÀÌ·± ÀÚ·áÇüÀº data ±¸¹®À» ÀÌ¿ëÇÏ¿© Á¤ÀÇÇÒ ¼ö ÀÖ½À´Ï´Ù. === Pair === Pair ¶ó´Â ¼ø¼­½ÖÀ» ³ªÅ¸³»´Â ÀڷᱸÁ¶¸¦ Á¤ÀÇÇغ¾½Ã´Ù. {{{ data Pair a b = Pair a b }}} Áº¯À» »ìÆ캸¸é, data´Â ÀÚ·áÇüÀ» ¼±¾ðÇÑ´Ù´Â °ÍÀ» ¾Ë·ÁÁÖ°í, Pair´Â ÀڷᱸÁ¶ÀÇ À̸§À» ³ªÅ¸³»°í, a b ´Â ÀÚ·áÇüÀÇ ¸Å°³º¯¼öÀÇ ÇüÀÌ °¢°¢ a¿Í b¶ó´Â °ÍÀ» ³ªÅ¸³À´Ï´Ù. ¿ìº¯À» »ìÆ캸¸é, Pair´Â »ý¼ºÀÚ¸¦ ³ªÅ¸³À´Ï´Ù. ÀÌ »ý¼ºÀÚ´Â ÀÚ·áÇüÀÇ À̸§°ú ÀÏÄ¡ÇÒ ÇÊ¿ä´Â ¾øÁö¸¸, ÀÌ °æ¿ì¿¡´Â ÀÚ·áÇüÀÇ À̸§°ú °°°Ô Á¤Çß½À´Ï´Ù. µÞ ºÎºÐÀÇ a b ´Â »ý¼ºÀÚ PairÀÇ ÀÎÀÚ·Î ¹Þ´Â µÎ °³ÀÇ °ªÀÇ ÇüÀÌ °¢°¢ a¿Í b¶ó´Â °ÍÀ» ³ªÅ¸³À´Ï´Ù. ±×·¯¸é Pair »ý¼ºÀÚ(»ý¼ºÀÚµµ ¿ª½Ã ÇÔ¼öÀÔ´Ï´Ù.)ÀÇ ÇüÀ» »ìÆ캾½Ã´Ù. {{{ Datatypes> :t Pair Pair :: a -> b -> Pair a b Datatypes> :t Pair 'a' Pair 'a' :: b -> Pair Char b Datatypes> :t Pair 'a' "Hello" Pair 'a' "Hello" :: Pair Char [ Char ] }}} ±×·¯¸é ´ÙÀ½°ú °°ÀÌ fst snd ÇÔ¼ö¿Í À¯»çÇÑ ÇÔ¼ö¸¦ ¸¸µé¾î º¾½Ã´Ù. {{{ pairFst (Pair x y) = x pairSnd (Pair x y) = y }}} ¹°·Ð ´ÙÀ½°ú °°ÀÌ _ ¹®ÀÚ¸¦ »ç¿ëÇÒ ¼öµµ ÀÖ½À´Ï´Ù. {{{ pairFst (Pair x _) = x pairSnd (Pair _ y) = y }}} === ´ÙÁß »ý¼ºÀÚ === ¸®½ºÆ®ÀÇ ¿ä¼Ò Áß¿¡¼­ ¾î¶² Á¶°ÇÀ» ¸¸Á·Çϴ ù¹ø° ¿ä¼Ò¸¦ ¹ÝȯÇÏ´Â ÇÔ¼ö¸¦ ÀÛ¼ºÇغ¾½Ã´Ù. {{{ findElement p (x:xs) = if p x then x else findElement p xs }}} ¸¸¾à À§¿Í °°ÀÌ ÀÛ¼ºÇß´Ù¸é, Á¶°ÇÀ» ¸¸Á·ÇÏ´Â ¿ä¼Ò°¡ Çϳªµµ ¾ø´Â °æ¿ì´Â ¿À·ù°¡ ¹ß»ýÇÕ´Ï´Ù. ±×·¯¹Ç·Î Á¶°ÇÀ» ¸¸Á·ÇÏ´Â ¿ä¼Ò°¡ ¾ø´Â °æ¿ì´Â ¿¹¿Ü󸮸¦ ÇؾßÇÕ´Ï´Ù. errorÇÔ¼ö¸¦ ÀÌ¿ëÇÏ¿© ¿À·ù¸¦ ¹ß»ý½Ãų ¼öµµ ÀÖÁö¸¸, ±×·¸°Ô ÇÏ¸é ¿À·ù¸¦ ´Ù·ç±â°¡ ¾î·Æ´Ù´Â ¹®Á¦Á¡ÀÌ ÀÖ½À´Ï´Ù. ´Ù¸¥ ¹æ¹ýÀ¸·Î´Â ¿À·ù¸¦ ó¸®ÇÒ ¼ö ÀÖ´Â ÀÚ·áÇüÀ» ÀÌ¿ëÇÏ´Â °ÍÀÔ´Ï´Ù. Maybe´Â ÇϽºÄÌÀÇ ±âº»ÀÚ·áÇüÀε¥, Prelude¿¡ ´ÙÀ½°ú °°ÀÌ Á¤ÀǵÅÀÖ½À´Ï´Ù. {{{ data Maybe a = Nothing | Just a }}} Maybe a ¶ó´Â ÀÚ·áÇüÀ» »ý¼ºÇÏ´Â ¹æ¹ý¿¡´Â µÎ °¡Áö°¡ ÀÖ½À´Ï´Ù. Nothing »ý¼ºÀÚ¸¦ ÀÌ¿ëÇÏ´Â ¹æ¹ý°ú, aÇüÀÇ °ª°ú ÇÔ²² Just »ý¼ºÀÚ¸¦ ÀÌ¿ëÇÏ´Â °ÍÀÔ´Ï´Ù. {{{ Prelude> Nothing Prelude> Just "foobar" }}} ±×·¯¸é my_head ÇÔ¼ö¸¦ ¸¸µé¾î º¾½Ã´Ù. ÀÌ ÇÔ¼ö´Â, ºó ¸®½ºÆ®ÀÎ °æ¿ì´Â NothingÀ» ¹ÝȯÇÏ°í, ±×·¸Áö ¾ÊÀ¸¸é ù¹ø° ¿ä¼Ò¸¦ ¹ÝȯÇÕ´Ï´Ù. {{{ my_head :: [a] -> Maybe a my_head [] = Nothing my_head (x:xs) = Just x }}} ÀÌÁ¦ findElement¸¦ ´Ù½Ã ¸¸µé¾î º¾½Ã´Ù. {{{ findElement :: (a -> Bool) -> [a] -> Maybe a findElement p [] = Nothing findElement p (x:xs) = if p x then Just x else findElement p xs }}} ÀÌ°ÍÀ¸·Î findElement ÇÔ¼öÀÇ ¿¹¿Ü󸮰¡ ³¡³µ½À´Ï´Ù. ¶Ç ÇÑ°¡Áö À¯¿ëÇÑ ÀÚ·áÇüÀº Either ÀÔ´Ï´Ù. {{{ data Either a b = Left a | Right b }}} Either ÀÚ·áÇüÀº aÇüÀ̳ª bÇüÀÌ µÉ ¼ö ÀÖ½À´Ï´Ù. === Àç±ÍÀû ÀÚ·áÇü === ´ÙÀ½°ú °°ÀÌ ¸®½ºÆ®¸¦ Á¤ÀÇÇϱâ À§Çؼ­ Àç±ÍÀû ÀÚ·áÇüÀ» »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù. Àç±ÍÀû ÀÚ·áÇüÀ̶õ, Á¤ÀÇ¿¡ ÀÚ±â ÀÚ½ÅÀ» Æ÷ÇÔÇÏ´Â °ÍÀ» ¸»ÇÕ´Ï´Ù. {{{ data List a = Nil | Cons a (List a) }}} ÀÌ List´Â ÇϽºÄÌ¿¡ ³»ÀåµÈ ¸®½ºÆ®¿Í °ÅÀÇ °°½À´Ï´Ù. length¿¡ ÇØ´çµÇ´Â ÇÔ¼öµµ ¸¸µé¾îº¸¸é ´ÙÀ½°ú °°½À´Ï´Ù. {{{ listLength Nil = 0 listLength (Cons x xs) = 1 + listLength xs }}} === ÀÌÁø ³ª¹« (Binary Tree) === À̹ø¿¡´Â ¸®½ºÆ®º¸´Ù ´õ º¹ÀâÇÑ ÀڷᱸÁ¶¸¦ ¸¸µé¾îº¾½Ã´Ù. {{{ data BinaryTree a = Leaf a | Branch (BinaryTree a) a (BinaryTree a) }}} ÀÌ ÀÌÁø ³ª¹«ÀÇ Å©±â¸¦ ±¸ÇÏ´Â ÇÔ¼ö¸¦ Á¤ÀÇÇغ¾½Ã´Ù. {{{ treeSize (Leaf x) = 1 treeSize (Branch left x right) = 1 + treeSize left + treeSize right }}} === Enumerated Sets === À̹ø¿¡´Â (´Ù¸¥ ¾ð¾î¿¡¼­ enum À¸·Î ºÎ¸£´Â) ¿­°ÅÇüÀ» ¸¸µé¾îº¾½Ã´Ù. {{{ data Color = Red | Orange | Yellow | Green | Blue | Purple | White | Black }}} ÇÁ·Î±×·¥¿¡¼­ ´Ù·ç±â ÁÁµµ·Ï »öÀ̸§À» RGB °ªÀ¸·Î ¹Ù²Ù´Â ÇÔ¼ö¸¦ ¸¸µé¸é, {{{ colorToRGB Red = (255,0,0) colorToRGB Orange = (255,128,0) colorToRGB Yellow = (255,255,0) colorToRGB Green = (0,255,0) colorToRGB Blue = (0,0,255) colorToRGB Purple = (255,0,255) colorToRGB White = (255,255,255) colorToRGB Black = (0,0,0) }}} ÀÓÀÇÀÇ RGB °ªÀ¸·Î »öÀ» ¸¸µé±â À§Çؼ­ »ý¼ºÀÚ¸¦ Çϳª ´õ Ãß°¡Çغ¾½Ã´Ù. {{{ data Color = Red | Orange | Yellow | Green | Blue | Purple | White | Black | Custom Int Int Int -- R G B components }}} colorToRGB ÇÔ¼ö¿¡µµ ÇÑ °¡Áö ´õ Ãß°¡ÇսôÙ. {{{ colorToRGB (Custom r g b) = (r,g,b) }}} === Unit Çü === ÇϽºÄÌÀÇ Prelude¿¡ Á¤ÀÇµÈ ÀÚ·áÇü Áß¿¡¼­ UnitÇüÀÌ ÀÖ½À´Ï´Ù. {{{ data () = () }}} UnitÇüÀÌ °¡Áú ¼ö ÀÖ´Â À¯ÀÏÇÑ °ªÀº () ÀÔ´Ï´Ù. ÀÌ´Â C³ª Java¿¡¼­ÀÇ void¿Í ±Ùº»ÀûÀ¸·Î °°½À´Ï´Ù. ÀÔÃâ·ÂÀ» ´Ù·ê ¶§ À¯¿ëÇÏ°Ô »ç¿ëµË´Ï´Ù. = ±âº» ÀÔÃâ·Â = ±âº» ÀÔÃâ·ÂÇÔ¼ö¿¡´Â ´ÙÀ½°ú °°ÀÌ ÃÖ¼ÒÇÑ ³× Á¾·ù°¡ ÀÖ½À´Ï´Ù. ¼ø¼öÇÑ ÇÔ¼ö´Â ¾Æ´Ï¹Ç·Î `Çൿ'À̶ó°í ºÎ¸£°Ú½À´Ï´Ù. * È­¸é¿¡ ¹®ÀÚ¿­À» Ãâ·ÂÇÔ * Å°º¸µå·ÎºÎÅÍ ¹®ÀÚ¿­À» ÀԷ¹ÞÀ½ * ÆÄÀÏÀбâ * ÆÄÀϾ²±â ù¹ø° ÇൿÀº ¹®ÀÚ¿­ ÀÔ·ÂÀ» ¹Þ¾Æ¼­ ¹«¾ùÀΰ¡¸¦ ¹ÝȯÇؾßÇÕ´Ï´Ù. ±× ¹«¾ùÀΰ¡´Â ÀÏ´Ü () ¶ó°í ÇսôÙ. µÎ¹ø° ÇൿÀÇ ¹Ýȯ°ªÀº StringÀÌ°í ÀÎÀÚ´Â ÇÊ¿ä¾øÀ» °Íó·³ º¸ÀÔ´Ï´Ù. ¾Õ¿¡¼­µµ ¸»ÇßÁö¸¸ À̵éÀº ¼ø¼öÇÑ ÇÔ¼ö°¡ ¾Æ´Õ´Ï´Ù. µÎ¹ø° ÇൿÀº, ¸Å¹ø °°Àº StringÀ» ¹ÝȯÇÏÁö ¾Ê±â ¶§¹®ÀÔ´Ï´Ù. ù¹ø° ÇൿÀÌ ¼ø¼öÇÑ ÇÔ¼ö¶ó¸é, ÂüÁ¶Àû Åõ¸í¼º¿¡ ÀÇÇØ f _ = () ·Î ´ëüµÉ ¼ö ÀÖ¾î¾ß ÇÏÁö¸¸, ±×·¸Áö ¾Ê½À´Ï´Ù. == RealWorld == À̵é ÇൿÀÌ ¼ø¼öÇÑ ÇÔ¼ö°¡ ¾Æ´Ñ ÀÌÀ¯´Â ½Ç¼¼°è¿Í »óÈ£ÀÛ¿ëÇϱ⠶§¹®ÀÔ´Ï´Ù. RealWorld¶ó´Â ÇüÀÌ ÀÖ´Ù°í »ý°¢ÇÏ°í, ´ÙÀ½°ú °°ÀÌ Á¤ÀÇÇغ¾½Ã´Ù. {{{ printAString :: RealWorld -> String -> RealWorld readAString :: RealWorld -> (RealWorld, String) }}} ÀÌ·¸°Ô RealWorld¸¦ ÇϳªÀÇ °ªÀ¸·Î »ý°¢Çϸé, 3.8 ¿¡¼­ ´Ù·ð´ø Name.hs¸¦ ´ÙÀ½°ú °°ÀÌ ¹Ù²ã¼­ »ý°¢ÇÒ ¼ö ÀÖ½À´Ï´Ù. RealWorldÀÇ »óŸ¦ main ÇÔ¼öÀÇ ÀÎÀÚ·Î ¹Þ´Â °ÍÀÔ´Ï´Ù. {{{ -- ÀÇ»çÄÚµå(pseudo code)ÀÓ. ÄÄÆÄÀÏ ¿À·ù ¹ß»ýÇÔ. main rW = let rW' = printAString rW "Please enter your name: " (rW'', name) = readAString rW' in printAString rW'' ("Hello, " ++ name ++ ", how are you?") }}} ÇÏÁö¸¸ ±×·¸°Ô Çϸé, Ç×»ó RealWorld ÀÎÀÚ¸¦ Àü´ÞÇؾßÇϹǷΠÀб⵵ ¾î·Æ°í ÄÚµùÇϱ⵵ ¹ø°Å·Ó½À´Ï´Ù. == Çൿ == ÀÔÃâ·ÂÀ» ´Ù·ç±â À§ÇØ Phil Wadler°¡ »ý°¢Çس½ °ÍÀº `¸ð³ªµå' ÀÔ´Ï´Ù. ÀÔÃâ·ÂÀ» ´Ù·ç´Â ¸ð³ªµå¸¦ IO ¸ð³ªµå¶ó°í ºÎ¸¨´Ï´Ù. ÇÔ¼öÀÇ Çü¿¡ IO ¸ð³ªµå°¡ µé¾î°¡¸é ÀÔÃâ·ÂÇÔ¼ö¶ó°í º¸¸é µË´Ï´Ù. (¹°·Ð Ç×»ó ±×·± °ÍÀº ¾Æ´Õ´Ï´Ù.) ¸ÕÀú putStrLnÀÇ ÇüÀ» »ìÆ캸¸é, {{{ putStrLn :: String -> IO () }}} ¿¹»ó´ë·Î ÀÎÀÚ´Â String¸¦ ¹Þ½À´Ï´Ù. ¹Ýȯ°ªÀº IO () ¶ó´Â ÇüÀÔ´Ï´Ù. IO ¸ð³ªµåÀ̹ǷΠputStrLn°¡ ÇൿÀ̶ó´Â °ÍÀ» ÁüÀÛÇÒ ¼ö ÀÖ½À´Ï´Ù. (ÇൿÀ» ¸¸µé±â À§Çؼ­ IO ¸ð³ªµå¸¦ ¸¸µé¾ú±â ¶§¹®ÀÔ´Ï´Ù.) ±×¸®°í ÀÌ ÇൿÀÇ °á°ú°ªÀº () ¶ó´Â ÇüÀ» °®½À´Ï´Ù. getLineÀÇ ÇüÀº ÁüÀÛÇÑ´ë·Î ´ÙÀ½°ú °°½À´Ï´Ù. {{{ getLine :: IO String }}} ¾Õ¿¡¼­ ¹è¿î ´ë·Î do ±¸¹®À» »ç¿ëÇÏ¿© ¿©·¯ °³ÀÇ ÇൿÀ» »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù. {{{ main = do hSetBuffering stdin LineBuffering putStrLn "Please enter your name: " name <- getLine putStrLn ("Hello, " ++ name ++ ", how are you?") }}} do ±¸¹®³»¿¡¼­µµ if/then/else ±¸¹®, case/of ±¸¹®, where ±¸¹®À» »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù. ¿¹¸¦ µé¾î ¼ýÀÚ ¸ÂÃ߱⠰ÔÀÓÀ» »ý°¢Çغ¾½Ã´Ù. {{{ do ... if (read guess) < num then do putStrLn "Too low!" doGuessing num else if read guess > num then do putStrLn "Too high!" doGuessing num else do putStrLn "You Win!" }}} if/then/else ±¸¹®¿¡¼­´Â ¼¼ °¡Áö°¡ ÇÊ¿äÇÕ´Ï´Ù. Á¶°Ç¹®, `then' branch, ±×¸®°í `else' branch. Á¶°Ç¹®ÀÇ ÇüÀº BoolÀ̾î¾ß ÇÕ´Ï´Ù. `then' branch¿Í `else' branch´Â °°Àº ÇüÀ̾î¾ß ÇÕ´Ï´Ù. if/then/elseÀÇ ÇüÀº `then' branch¿Í `else' branchÀÇ Çü°ú °°½À´Ï´Ù. ±×·³ `then' branch ¸¦ »ìÆ캾½Ã´Ù. {{{ do putStrLn "Too low!" doGuessing num }}} ù¹ø° ÁÙÀÇ putStrLn "Too low!" ´Â IO () ÇüÀÔ´Ï´Ù. µÎ¹ø° ÁÙµµ IO () ÇüÀÔ´Ï´Ù. do ±¸¹® ÀüüÀÇ ÇüÀº ¸¶Áö¸· Ç¥Çö½ÄÀÇ Çü°ú °°À¸¹Ç·Î `then' branchÀÇ ÇüÀº ¿ª½Ã IO () ÀÔ´Ï´Ù. ¸¶Âù°¡Áö ¹æ½ÄÀ¸·Î `else' branchÀÇ ÇüÀ» »ìÆ캸¸é IO () ¶ó´Â °ÍÀ» ¾Ë ¼ö ÀÖÀ¸¸ç, if/then/elseÀÇ ÇüÀº IO () °¡ µË´Ï´Ù. ÇÑ°¡Áö ÁÖÀÇÇÒ Á¡Àº, `do ±¸¹®À» ½ÃÀÛÇßÀ¸´Ï ´õ ÀÌ»ó do ´Â ÇÊ¿ä¾ø°ÚÁö'¶ó´Â »ý°¢À¸·Î ´ÙÀ½°ú °°ÀÌ ¾²´Â °ÍÀº ¿ÇÁö ¾Ê´Ù´Â Á¡ÀÔ´Ï´Ù. {{{ do ... if (read guess) < num then putStrLn "Too low!" doGuessing num else ... }}} ¿Ö³ÄÇϸé then µÚ¿¡ µÎ °³ÀÇ Ç¥Çö½Ä(putStrLn "Too low!" °ú doGuessing num)ÀÌ ¿Ã ¼ö ¾ø±â ¶§¹®ÀÔ´Ï´Ù. µÚ¿¡ ¿©·¯ °³ÀÇ Ç¥Çö½ÄÀÌ ¿À±â À§Çؼ­´Â do, let, where, of °¡ ¹Ýµå½Ã ÇÊ¿äÇÕ´Ï´Ù. À̹ø¿¡´Â case ±¸¹®À» »ìÆ캾½Ã´Ù. {{{ doGuessing num = do putStrLn "Enter your guess:" guess <- getLine case compare (read guess) num of LT -> do putStrLn "Too low!" doGuessing num GT -> do putStrLn "Too high!" doGuessing num EQ -> putStrLn "You Win!" }}} ¿©±â¼­ compare ÇÔ¼ö´Â (Ord Ŭ·¡½ºÀÇ) °°Àº ÇüÀÇ °ª µÎ °³¸¦ ºñ±³ÇÏ¿©, ù¹ø°°¡ Å©¸é GT, °°À¸¸é EQ, ù¹ø°°¡ ÀÛÀ¸¸é LT À» ¹ÝȯÇÕ´Ï´Ù. C³ª Java¿Í´Â ´Þ¸® returnÀÌ »ç¿ëµÇÁö ¾Ê´ÂÁö Àǹ®À» °¡ÁúÁö ¸ð¸¨´Ï´Ù. ÇϽºÄÌ¿¡¼­ return´Â È帧Á¦¾î¸¦ ÇÏ´Â ±¸¹®ÀÌ ¾Æ´Õ´Ï´Ù. ´ÜÁö ¾î¶² °ªÀ» ¸ð³ªµå °ªÀ¸·Î ¹Ù²ãÁÖ´Â Çൿ¿¡ ºÒ°úÇÕ´Ï´Ù. {{{ Prelude > :t return return :: (Monad m) => a -> m a }}} À§¿¡¼­ ¸¸µç °Í°ú °°Àº ÇÁ·Î±×·¥À» ¸í·ÉÇü ¾ð¾î·Î ´ÙÀ½°ú °°ÀÌ ÀÛ¼ºÇÒ ¼öµµ ÀÖ½À´Ï´Ù. {{{ void doGuessing(int num) { print "Enter your guess:"; int guess = atoi(readLine()); if (guess == num) { print "You win!"; return (); } // we won't get here if guess == num if (guess < num) { print "Too low!"; doGuessing(num); } else { print "Too high!"; doGuessing(num); } } }}} ÀÌ¿Í ºñ½ÁÇÏ°Ô À̹ø¿¡´Â ÇϽºÄÌ·Î ÀÛ¼ºÇغ¾½Ã´Ù. {{{ doGuessing num = do putStrLn "Enter your guess:" guess <- getLine case compare (read guess) num of EQ -> do putStrLn "You win!" return () -- guess == num ÀÎ °æ¿ì¿¡ ÀÌ ¹Ø¿¡ ½ÄÀº ½ÇÇàµÇÁö ¾ÊÀ»±î? if (read guess < num) then do print "Too low!"; doGuessing else do print "Too high!"; doGuessing }}} ±×·¯³ª ÀÌ ÇÁ·Î±×·¥Àº ¿øÇϴ´ë·Î µ¿ÀÛÇÏÁö ¾Ê½À´Ï´Ù. (read guess) == num ÀÎ °æ¿ì¿¡´Â "You win!" À̶ó´Â ¹®ÀÚ¿­ÀÌ Ãâ·ÂµÇÁö¸¸ ÇÁ·Î±×·¥ÀÌ Á¾·áÇÏÁö ¾Ê°í, if ¹®À» ½ÇÇàÇÕ´Ï´Ù. if¹® ¾ÈÀÇ Á¶°Ç¹®ÀÌ ÂüÀÌ ¾Æ´Ï±â ¶§¹®¿¡ "Too high!" ¶ó´Â ¹®ÀÚ¿­ÀÌ Ãâ·ÂµÇ°í ÇÁ·Î±×·¥Àº °è¼Ó µ¹¾Æ°©´Ï´Ù. ¹Ý¸é¿¡ (read guess) == num ÀÌ ¾Æ´Ñ °æ¿ì¿¡´Â case ¹®ÀÇ °è»ê°á°ú´Â LT À̳ª GT °¡ µÇ´Âµ¥ ÀÌ´Â case ¹®¿¡ ¾øÀ¸¹Ç·Î ¿¹¿Ü¸¦ ¹ß»ýÇÏ°í ÇÁ·Î±×·¥Àº Á¾·áµË´Ï´Ù. == ÀÔÃâ·Â ¶óÀ̺귯¸® == ÀÔÃâ·Â ¶óÀ̺귯¸®´Â IO ¸ðµâÀ» ºÒ·¯¿È(import)À¸·Î½á »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù. {{{ data IOMode = ReadMode | WriteMode | AppendMode | ReadWriteMode openFile :: FilePath -> IOMode -> IO Handle hClose :: Handle -> IO () hIsEOF :: Handle -> IO Bool hGetChar :: Handle -> IO Char hGetLine :: Handle -> IO String hGetContents :: Handle -> IO String getChar :: IO Char getLine :: IO String getContents :: IO String hPutChar :: Handle -> Char -> IO () hPutStr :: Handle -> String -> IO () hPutStrLn :: Handle -> String -> IO () putChar :: Char -> IO () putStr :: String -> IO () putStrLn :: String -> IO () readFile :: FilePath -> IO String writeFile :: FilePath -> String -> IO () bracket :: IO a -> (a -> IO b) -> (a -> IO c) -> IO c }}} (¿©±â¼­ FilePath ´Â String °ú °°½À´Ï´Ù. ÀÌ·± °ÍÀ» Çü µ¿ÀǾî¶ó°í ÇÕ´Ï´Ù.) bracket ÇÔ¼ö´Â ÇൿÀ» ¾ÈÀüÇÏ°Ô ¼öÇàÇϱâ À§Çؼ­ »ç¿ëµË´Ï´Ù. bracket ÇÔ¼ö´Â ¼¼ °³ÀÇ ÀÎÀÚ°¡ ÇÊ¿äÇÕ´Ï´Ù. ù¹ø° ÀÎÀÚ·Î ¿À´Â ÇൿÀÌ °¡Àå ¸ÕÀú ¼öÇàµË´Ï´Ù. µÎ¹ø° ÀÎÀÚ´Â, ¿À·ù°¡ ÀÖµç ¾øµç °¡Àå ³ªÁß¿¡ ¼öÇàµË´Ï´Ù. ¼¼¹ø° ÀÎÀÚ´Â Áß°£¿¡ ¼öÇàµÇ´Âµ¥, ÀÌ´Â ¿À·ù°¡ ¹ß»ýÇÒ ¼öµµ ÀÖ´Â ÇൿÀÌ ¿À°Ô µË´Ï´Ù. ¿¹¸¦µé¾î ´ÙÀ½°ú °°ÀÌ ÆÄÀÏ¿¡ ¹®ÀÚ Çϳª¸¦ ÀúÀåÇÏ´Â ÇÔ¼ö¸¦ ¸¸µé ¼ö ÀÖ½À´Ï´Ù. {{{ writeChar :: FilePath -> Char -> IO () writeChar fp c = bracket (openFile fp ReadMode) hClose (\h -> hPutChar h c) }}} == ÆÄÀÏ Àбâ ÇÁ·Î±×·¥ == À̹ø¿¡´Â ÆÄÀÏÀ» Àд ÇÁ·Î±×·¥À» ÀÛ¼ºÇغ¾½Ã´Ù. ¿À·ù󸮰¡ ¾ÈµÈ ¹Ì¿Ï¼º ÇÁ·Î±×·¥ÀÌÁö¸¸, ÀÔÃâ·Â ÇÔ¼ö¸¦ ¾î¶»°Ô »ç¿ëÇÏ´ÂÁö ¹è¿ï¼ö ÀÖ´Â ÁÁÀº ¿¹Á¦°¡ µÉ °ÍÀÔ´Ï´Ù. ´ÙÀ½ Äڵ带 FileRead.hs ÆÄÀÏ·Î ÀúÀåÇÏ°í ÄÄÆÄÀÏ ÈÄ ½ÇÇàÇغ¾½Ã´Ù. {{{ module Main where import IO main = do hSetBuffering stdin LineBuffering doLoop doLoop = do putStrLn "Enter a command rFN wFN or q to quit:" command <- getLine case command of 'q':_ -> return () 'r':filename -> do putStrLn ("Reading " ++ filename) doRead filename doLoop 'w':filename -> do putStrLn ("Writing " ++ filename) doWrite filename doLoop _ -> doLoop doRead filename = bracket (openFile filename ReadMode) hClose (\h -> do contents <- hGetContents h putStrLn "The first 100 chars:" putStrLn (take 100 contents)) doWrite filename = do putStrLn "Enter text to go into the file:" contents <- getLine bracket (openFile filename WriteMode) hClose (\h -> hPutStrLn h contents) }}} = °í±Þ ±â´É = == ¼½¼Ç°ú ÁßÀ§¿¬»êÀÚ == ´ÙÀ½°ú °°ÀÌ map ÇÔ¼ö¿Í ¶÷´Ù ÇÔ¼ö¸¦ »ç¿ëÇÏ¸é ¸®½ºÆ®ÀÇ ¸ðµç ¿ä¼ÒÀÇ °ªÀ» µÎ ¹è·Î ¸¸µé ¼ö ÀÖ½À´Ï´Ù. {{{ Prelude> map (\x -> x*2) [1,2,3,4] [2,4,6,8] }}} ¹°·Ð ´ÙÀ½°ú °°ÀÌ ÇÒ ¼öµµ ÀÖ½À´Ï´Ù. {{{ Prelude> map (\x -> x*2) [1..4] [2,4,6,8] }}} ±×·±µ¥ À̸¦ ´õ °£´ÜÇÏ°Ô ³ªÅ¸³¾ ¼ö ÀÖ½À´Ï´Ù. {{{ Prelude> map (*2) [1..4] [2,4,6,8] Prelude> map (2*) [1..4] [2,4,6,8] }}} ÀÌ´Â ÁßÀ§¿¬»êÀÚ´Â ¸ðµÎ ÀÌ·± ¹æ½ÄÀ¸·Î »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù. {{{ Prelude> map (+5) [1..4] [6,7,8,9] Prelude> map (/2) [1..4] [0.5,1.0,1.5,2.0] Prelude> map (2/) [1..4] [2.0,1.0,0.666667,0.5] Prelude> map (5-) [1..4] [4,3,2,1] }}} ±×·¯³ª - ¿¬»êÀÚ¿¡ ´ëÇؼ­´Â ÁÖÀÇ°¡ ÇÊ¿äÇÕ´Ï´Ù. map (-2) [1..4] ¿Í °°ÀÌ Çϸé, ¿©±â¼­ - ´Â ÀÌÇ׿¬»êÀÚÀÎ `»©±â'¿¬»êÀÚ·Î º¸´Â °ÍÀÌ ¾Æ´Ï°í ´ÜÇ׿¬»êÀÚ·Î º¸¹Ç·Î ¿©±â¼­ -2 ´Â ¥ëx.x - 2 ¶ó´Â ÇÔ¼ö°¡ ¾Æ´Ï°í ¼ýÀÚ -2 °¡ µË´Ï´Ù. ±×·¯¹Ç·Î ´ÙÀ½°ú °°ÀÌ ÇսôÙ. {{{ Prelude> map (+(-2)) [1..4] [-1,0,1,2] Prelude> map (-2+) [1..4] [-1,0,1,2] }}} (¹Ý¸é¿¡, ´Ù¸¥ ¾ð¾î¿Í´Â ´Ù¸£°Ô ÇϽºÄÌ¿¡¼­´Â +5 ´Â ¼ýÀÚ 5·Î º¸Áö¾Ê°í ¥ëx.x + 2 ¶ó´Â ÇÔ¼ö·Î º¾´Ï´Ù.) °ýÈ£¸¦ »ç¿ëÇϸé ÁßÀ§¿¬»êÀÚ¸¦ ÇÔ¼öó·³ »ç¿ëÇÒ ¼ö ÀÖ´Ù°í ¹è¿ü½À´Ï´Ù. {{{ Prelude> (+) 5 3 8 Prelude> (-) 5 3 2 }}} ´ÙÀ½°ú °°ÀÌ ÁßÀ§¿¬»êÀÚ¿Í ÀÎÀÚ¸¦ ÇÔ²² °ýÈ£·Î ¹­À¸¸é `¼½¼Ç'ÀÌ µË´Ï´Ù. {{{ Prelude> (+5) 3 8 Prelude> (/3) 6 2.0 Prelude> (3/) 6 0.5 }}} ÁßÀ§ ¿¬»êÀÚ°¡ ¾Æ´Ñ ÇÔ¼ö´Â ` ·Î µÑ·¯½Î¸é ÁßÀ§ ¿¬»êÀÚó·³ »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù. ±×·³ Áö±Ý±îÁö ¹è¿î °ÍÀ» º¹½ÀÇغ¾½Ã´Ù. {{{ Prelude> (+2) `map` [1..10] [3,4,5,6,7,8,9,10,11,12] }}} == Áö¿ª ¼±¾ð == éÅÍ 3.5ÀÇ ÀÌÂ÷¹æÁ¤½ÄÀÇ ±ÙÀ» ±¸ÇÏ´Â ÇÁ·Î±×·¥À» ´Ù½Ã »ìÆ캾½Ã´Ù. {{{ roots a b c = ((-b + sqrt(b*b - 4*a*c)) / (2*a), (-b - sqrt(b*b - 4*a*c)) / (2*a)) }}} let/in ±¸¹®À» »ç¿ëÇÒ ¼öµµ ÀÖÁö¸¸ À̹ø¿¡´Â where ±¸¹®À» »ç¿ëÇغ¾½Ã´Ù. {{{ roots a b c = ((-b + det) / (2*a), (-b - det) / (2*a)) where det = sqrt(b*b-4*a*c) }}} where¿¡¼­ Á¤ÀÇµÈ °ªÀº ¿ÜºÎ¿¡¼­´Â »ç¿ëÇÒ ¼ö ¾ø½À´Ï´Ù. {{{ det = "Hello World" roots a b c = ((-b + det) / (2*a), (-b - det) / (2*a)) where det = sqrt(b*b-4*a*c) f _ = det }}} where ±¸¹®ÀÇ det Á¤ÀÇ´Â ÃÖ»óÀ§°èÃþ¿¡´Â ¿µÇâÀ» ÁÖÁö ¾Ê½À´Ï´Ù. ±×·¯¹Ç·Î f¶ó´Â ÇÔ¼ö´Â °á°ú°ªÀ¸·Î "Hello World" ¸¦ ¹ÝȯÇÏ´Â ÇÔ¼ö°¡ µË´Ï´Ù. where ±¸¹®¿¡ µÎ °³ ÀÌ»óÀÇ Ç¥Çö½ÄÀÌ ¿Ã ¼öµµ ÀÖ½À´Ï´Ù. {{{ roots a b c = ((-b + det) / (a2), (-b - det) / (a2)) where det = sqrt(b*b-4*a*c) a2 = 2*a }}} let/in ±¸¹®À¸·Îµµ °¡´ÉÇÕ´Ï´Ù. {{{ roots a b c = let det = sqrt (b*b - 4*a*c) a2 = 2*a in ((-b + det) / a2, (-b - det) / a2) }}} ÀÌ µÎ °¡Áö ½ºÅ¸ÀÏÀ» ¼¯¾î¼­ »ç¿ëÇÏÁö ¾Ê±â¸¦ °­·ÂÈ÷ ±ÇÇÕ´Ï´Ù. {{{ f x = let y = x + 1 in y where y = x + 2 }}} f 5 ÀÇ °ªÀº 7ÀÌ ¾Æ´Ï°í 6ÀÔ´Ï´Ù. ±»ÀÌ ÀÌÀ¯¸¦ ¼³¸íÇÏÀÚ¸é let ±¸¹®¿¡¼­ where ´Â º¸ÀÌÁö ¾Ê±â ¶§¹®Àε¥, ÀÌ·± ½ÄÀ¸·Î ¼¯Àº ±¸¹®Àº »ç¿ëÇÏÁö ¾Ê±â¸¦ ¹Ù¶ø´Ï´Ù. let/in °ú where ÀÇ ¼±ÅÃÀº °³ÀÎÀÇ ±âÈ£¿¡ ´Þ¸° ¹®Á¦ÀÌÁö¸¸, °³ÀÎÀûÀÎ »ý°¢À¸·Î´Â where°¡ ´õ ¸¹ÀÌ ¾²ÀÌ´Â °Í °°½À´Ï´Ù. == ÇÔ¼öÀÇ ºÎºÐÀû¿ë == n°³ÀÇ ÀÎÀÚ¸¦ ÇÊ¿ä·Î ÇÏ´Â ÇÔ¼ö°¡ ÀÖ´Â °æ¿ì, n º¸´Ù ÀûÀº ¼öÀÇ ÀÎÀÚ¸¸ »ç¿ëÇÏ´Â °ÍÀ» ÇÔ¼öÀÇ ºÎºÐÀû¿ëÀ̶ó°í ÇÕ´Ï´Ù. ¿¹¸¦ µé¾î, map (+1) [1,2,3] ¿¡¼­ (+1) ´Â + ÇÔ¼öÀÇ ºÎºÐÀû¿ëÀÔ´Ï´Ù. ¿Ö³ÄÇϸé + ÇÔ¼ö´Â ÀÎÀÚ°¡ µÎ °³°¡ ÇÊ¿äÇѵ¥, Çϳª¸¸ »ç¿ëµÆ±â ¶§¹®ÀÔ´Ï´Ù. ÀÌ·¯ÇÑ ÇÔ¼öÀÇ ºÎºÐÀû¿ëÀº ÇÔ¼öÀÇ Á¤ÀÇ¿¡µµ »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù. ¹®ÀÚ¿­À» ¼Ò¹®ÀÚ·Î ¹Ù²Ù´Â ÇÔ¼ö lcaseStringÀ» »ý°¢Çغ¾½Ã´Ù. {{{ lcaseString s = map (\x->toLower x) s }}} ±×¸®°í toLower ÇÔ¼ö¿¡ ºÎºÐÀû¿ëÀ» ÀÌ¿ëÇÏ¸é ´ÙÀ½°ú °°ÀÌ ¹Ù²Ü ¼ö ÀÖ½À´Ï´Ù. {{{ lcaseString s = map toLower s }}} ±×·¯¸é ÀÌÁ¦ map ÇÔ¼ö¿¡µµ ºÎºÐÀû¿ëÀ» ÀÌ¿ëÇغ¾½Ã´Ù. {{{ lcaseString = map toLower }}} À̸¦ ¥ç-º¯È¯À̶ó°íµµ ÇÕ´Ï´Ù. ¾î¶»°Ô ÀÌ·± ÀÏÀÌ °¡´ÉÇÑÁö »ý°¢Çغ¾½Ã´Ù. mapÀº ÀÎÀÚ¸¦ µÎ °³ ¹Þ´Âµ¥, ÇϳªÀÇ ÇÔ¼öÀÌ°í, ´Ù¸¥ Çϳª´Â ¸®½ºÆ®ÀÔ´Ï´Ù. ¾Õ¿¡¼­µµ ¸»ÇßµíÀÌ, mapÀÇ ÇüÀº (a ¡æ b) ¡æ ([a] ¡æ [b]) ÀÔ´Ï´Ù. toLower ÇÔ¼öÀÇ ÇüÀº Char ¡æ Char ÀÔ´Ï´Ù. ±×·¯¹Ç·Î map ÇÔ¼ö¿¡ toLower ÇÔ¼ö¸¦ ÀÎÀÚ·Î »ç¿ëÇÏ¸é ±× °á°ú°ªÀº [ Char ] ¡æ [ Char ] °¡ µË´Ï´Ù. ±×·¯¹Ç·Î lcaseStringÀÇ ÇüÀº [ Char ] ¡æ [ Char ] ÀÌ µÇ°í, ÀÌ´Â ¿ì¸®°¡ ¿øÇÏ´Â °á°ú¿Í °°½À´Ï´Ù. À̹ø¿¡´Â ÇÔ¼öÇÕ¼ºÀ» ÀÌ¿ëÇÏ¿©, ¹®ÀÚ¿­¿¡¼­ ¾ËÆĺªÀÌ ¾Æ´Ñ ¹®ÀÚ¸¦ Á¦¿ÜÇÏ°í ±× ¹®ÀÚ¿­À» ¼Ò¹®ÀÚ·Î ¹Ù²Ù´Â ÇÔ¼ö¸¦ ¸¸µé¾îº¾½Ã´Ù. {{{ lcaseLetters s = map toLower (filter isAlpha s) }}} ±×¸®°í . ¿¬»êÀÚ¸¦ ÀÌ¿ëÇÏ¸é ´ÙÀ½°ú °°ÀÌ ¹Ù²Ü ¼ö ÀÖ½À´Ï´Ù. {{{ lcaseLetters s = (map toLower . filter isAlpha) s }}} ºÎºÐÀû¿ëÀ» ÀÌ¿ëÇÏ¸é ´ÙÀ½°ú °°½À´Ï´Ù. {{{ lcaseLetters = map toLower . filter isAlpha }}} À̹ø¿¡´Â `$' ¿¬»êÀÚ¿¡ ´ëÇؼ­ ¾Ë¾Æº¸°Ú½À´Ï´Ù. `$' ÀÇ Á¤ÀÇ´Â ¸Å¿ì °£´ÜÇÕ´Ï´Ù. {{{ f $ x = f x }}} $ÀÇ ¿ì¼±¼øÀ§°¡ ¸Å¿ì ³·±â ¶§¹®¿¡ °ýÈ£´ë½Å¿¡ »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù. ¸¸¾à ´ÙÀ½°ú °°Àº ÇÔ¼öÁ¤ÀÇ°¡ ÀÖ´Ù¸é, {{{ foo x y = bar y (baz (fluff (ork x))) }}} ´ÙÀ½°ú °°ÀÌ $ ¸¦ »ç¿ëÇÏ¿© ¹Ù²Ü ¼ö ÀÖ½À´Ï´Ù. {{{ foo x y = bar y $ baz $ fluff $ ork x }}} ¦À» ¿ä¼Ò·Î °¡Áø ¸®½ºÆ®¸¦ ÀÎÀÚ·Î ÇÏ°í, ù¹ø° ¿ä¼Ò°¡ 0º¸´Ù Å« ¦µé¸¸ »Ì¾Æ³»´Â ÇÔ¼ö¸¦ ¸¸µé¾îº¾½Ã´Ù. {{{ fstGt0 l = filter (\ (a,b) -> a > 0) l }}} ¥ç-º¯È¯¿¡ ÀÇÇØ ´ÙÀ½°ú °°°í, {{{ fstGt0 = filter (\ (a,b) -> a > 0) }}} fst ÇÔ¼ö¸¦ ÀÌ¿ëÇÏ¸é ´ÙÀ½°ú °°½À´Ï´Ù. {{{ fstGt0 = filter (\x -> fst x > 0) }}} > ¿¬»êÀÚÀÇ ºÎºÐÀû¿ë°ú ÇÔ¼öÇÕ¼ºÀ» ÀÌ¿ëÇÏ¸é ´ÙÀ½°ú °°°í, {{{ fstGt0 = filter (\x -> ((>0) . fst) x) }}} ¸¶Áö¸·À¸·Î ºÎºÐÀû¿ëÀ» ÀÌ¿ëÇÏ¸é ´ÙÀ½°ú °°½À´Ï´Ù. {{{ fstGt0 = filter ((>0).fst) }}} ÀÌ·¸°Ô ºÎºÐÀû¿ëÀ» ÀÌ¿ëÇÏ¿© ÇÔ¼ö¸¦ Á¤ÀÇÇÏ´Â ½ºÅ¸ÀÏÀ» point-free ÇÁ·Î±×·¡¹ÖÀ̶ó°í ÇÕ´Ï´Ù. ÇÔ¼öÀÇ Á¤ÀÇ¿¡¼­ ÀÎÀÚ¸¦ »©¹ö¸®°í, ÇÔ¼ö°¡ µ¿ÀÛÇÏ´Â °Í¿¡ ÃÊÁ¡À» ¸ÂÃè±â ¶§¹®¿¡ point-free ¶ó´Â À̸§ÀÌ ºÙ¾ú½À´Ï´Ù. ÀÌ·± point-free ÇÁ·Î±×·¡¹ÖÀ» µµ¿ÍÁÖ´Â ¸î¸î ÇÔ¼öµéÀÌ ÀÖ½À´Ï´Ù. uncurry ÇÔ¼ö´Â a ¡æ b ¡æ c ÇüÀÇ ÇÔ¼ö¸¦ (a, b) ¡æ c ÇüÀÇ ÇÔ¼ö·Î ¹Ù²ãÁÝ´Ï´Ù. ¾î¶»°Ô »ç¿ëÇÏ´ÂÁö ÇÑ ¹ø º¾½Ã´Ù. {{{ Prelude> map (uncurry (*)) [(1,2),(3,4),(5,6)] [2,12,30] }}} curry ÇÔ¼ö´Â uncurry ÇÔ¼öÀÇ ¹Ý´ëÀÔ´Ï´Ù. flip ÇÔ¼ö´Â ÀÎÀÚÀÇ ¼ø¼­¸¦ ¹Ù²ß´Ï´Ù. a ¡æ b ¡æ c ÇüÀÇ ÇÔ¼ö¸¦ ÀÎÀÚ·Î ¹Þ¾Æ¼­, b ¡æ a ¡æ c ÇüÀÇ ÇÔ¼ö·Î ¹Ù²ß´Ï´Ù. ¸®½ºÆ®¸¦ ¿À¸§Â÷¼øÀ¸·Î Á¤·ÄÇϱâ À§Çؼ­´Â ´ÙÀ½°ú °°ÀÌ ÇÕ´Ï´Ù. {{{ Prelude> List.sortBy compare [5,1,8,3] [1,3,5,8] }}} ³»¸²Â÷¼øÀ¸·Î Á¤·ÄÇϱâ À§Çؼ­, ¶÷´ÙÇÔ¼ö¸¦ ¾µ ¼öµµ ÀÖÁö¸¸ {{{ Prelude> List.sortBy (\a b -> compare b a) [5,1,8,3] [8,5,3,1] }}} flip ÇÔ¼ö¸¦ ÀÌ¿ëÇÏ¿© Á» ´õ ª°Ô ¸¸µé¾î º¾½Ã´Ù. {{{ Prelude> List.sortBy (flip compare) [5,1,8,3] [8,5,3,1] }}} ÀÌ·± point-free ÇÁ·Î±×·¡¹ÖÀÌ Ç×»ó °¡´ÉÇÑ °ÍÀº ¾Æ´Õ´Ï´Ù. ¿¹¸¦ µé¾î Á¦°öÀ» ±¸ÇÏ´Â ÇÔ¼öÀÇ °æ¿ì´Â, {{{ square x = x * x }}} point-free ¹æ½ÄÀ» ¾µ ¼ö ¾ø½À´Ï´Ù. ´ÙÀ½°ú °°ÀÌ Ãß°¡ÀûÀ¸·Î pair ÇÔ¼ö¸¦ Á¤ÀÇÇϸé square ÇÔ¼ö´Â point-free ¹æ½ÄÀ¸·Î ¾µ ¼ö ÀÖÁö¸¸, pair ÇÔ¼ö´Â point-free ¹æ½ÄÀÌ ¾Æ´Ñµ¥´Ù°¡ ±¦È÷ º¹ÀâÇØÁö±â¸¸ ÇÕ´Ï´Ù. {{{ pair x = (x,x) square = uncurry (*) . pair }}} == ÆÐÅÏ ¸ÅĪ == éÅÍ 4.5 ÀÇ Color ¹®Á¦·Î µ¹¾Æ°¡º¾½Ã´Ù. {{{ data Color = Red | Orange | Yellow | Green | Blue | Purple | White | Black | Custom Int Int Int deriving (Show,Eq) colorToRGB Red = (255,0,0) colorToRGB Orange = (255,128,0) colorToRGB Yellow = (255,255,0) colorToRGB Green = (0,255,0) colorToRGB Blue = (0,0,255) colorToRGB Purple = (255,0,255) colorToRGB White = (255,255,255) colorToRGB Black = (0,0,0) colorToRGB (Custom r g b) = (r,g,b) }}} ´ëÈ­½Ä ȯ°æ¿¡¼­ ´ÙÀ½°ú °°ÀÌ ½ÇÇàÇغ¾½Ã´Ù. {{{ *Color> colorToRGB Yellow (255,255,0) }}} ÀÚ, ÀÌÁ¦ ¾î¶² ÀÏÀÌ ¹ß»ýÇß´ÂÁö¸¦ ¾Ë¾Æº¾½Ã´Ù. ¸ÕÀú Yellow¶ó´Â °ªÀ» °¡Áø ¾î¶² °ªÀ» ¸¸µé¾î ³À´Ï´Ù. ±× °ªÀ» ÀÏ´ÜÀº x¶ó°í ºÎ¸¨½Ã´Ù. ±×¸®°í colorToRGB ÇÔ¼ö¿¡ Àû¿ëÇغ¾´Ï´Ù. °á°ú°ªÀ» °è»êÇϱâ À§Çؼ­, colorToRGB ÇÔ¼öÀÇ Á¤ÀǸ¦ »ìÆ캾½Ã´Ù. Á¤ÀÇ¿¡ µû¶ó¼­, ¸ÕÀú Red¿Í x°¡ ¸ÅÄ¡µÇ´ÂÁö »ìÆ캾´Ï´Ù. ColorÀÇ Á¤ÀÇ¿¡¼­ Red¿Í Yellow´Â ´Ù¸¥ °ªÀ¸·Î Á¤ÀǵǾîÀÖÀ¸¹Ç·Î ÀÌ ¸ÅÄ¡´Â ½ÇÆÐÇÏ°Ô µË´Ï´Ù. ±× ´ÙÀ½¿¡´Â Orange¿Í x°¡ ¸ÅÄ¡µÇ´ÂÁö »ìÆ캾´Ï´Ù. ÀÌ ¸ÅÄ¡µµ ¿ª½Ã ½ÇÆÐÀÔ´Ï´Ù. ±×·¯¸é ´ÙÀ½¿¡ Yellow¿Í x°¡ ¸ÅÄ¡µÇ´ÂÁö »ìÇÇ°Ô µÇ°í, ÀÌ ¸ÅÄ¡´Â ¼º°øÇÕ´Ï´Ù. colorToRGB Yellow = (255,255,0) ÀÇ ¿ìº¯Àº (255,255,0) À̹ǷΠ(255,255,0) ¸¦ ¹ÝȯÇÕ´Ï´Ù. À̹ø¿¡´Â Custom »ý¼ºÀÚ¸¦ »ç¿ëÇغ¾½Ã´Ù. {{{ *Color> colorToRGB (Custom 50 200 100) (50,200,100) }}} À̹ø¿¡µµ ¸ÅÄ¡¸¦ Çغ¸¸é, RedºÎÅÍ Black±îÁöÀÇ ¸ÅÄ¡´Â ½ÇÆÐÇÕ´Ï´Ù. ¸¶Áö¸·À¸·Î colorToRGB (Custom r g b) °ú ¸ÅÄ¡Çغ¸¸é, ¸ÅÄ¡°¡ ¼º°øÇÕ´Ï´Ù. ÇÔ¼ö Á¤ÀÇ¿¡ ÀÇÇؼ­ r °ªÀº 50ÀÌ µÇ°í, g °ªÀº 200, b °ªÀº 100ÀÌ µÇ¹Ç·Î ¹Ýȯ°ªÀº (50,200,100) ÀÌ µË´Ï´Ù. ÀÌ·¯ÇÑ ÆÐÅÏ ¸ÅĪÀ» ÀÌ¿ëÇÏ¿© isCustomColor ¶ó´Â ÇÔ¼ö¸¦ ÀÛ¼ºÇÒ ¼ö ÀÖ½À´Ï´Ù. {{{ isCustomColor (Custom _ _ _) = True isCustomColor _ = False }}} r,g,b °ª Áß¿¡¼­ Çϳª¶óµµ 255ÀÎ °ªÀÌ ÀÖ´Ù¸é True¸¦ ¹ÝȯÇÏ´Â isMaxBright ÇÔ¼ö¸¦ ÀÛ¼ºÇÒ ¼ö ÀÖ½À´Ï´Ù. {{{ isMaxBright = isMaxBright' . colorToRGB where isMaxBright' (255,_,_) = True isMaxBright' (_,255,_) = True isMaxBright' (_,_,255) = True isMaxBright' _ = False }}} ±×·¯¸é À̹ø¿¡´Â ¹Ý´ë·Î rgbToColor ÇÔ¼ö¸¦ ¸¸µé¾îº¾½Ã´Ù. ÇÑ°¡Áö ¾î·Á¿î Á¡Àº, ¿¹¸¦µé¾î (600,-40,99) ¿Í °°Àº °ªÀÌ ÀÔ·ÂÀ¸·Î µé¾î¿À´Â °æ¿ì¸¦ ¿¹¿Üó¸®ÇؾßÇÑ´Ù´Â Á¡ÀÔ´Ï´Ù. ¾Õ¿¡¼­ ¹è¿üµíÀÌ ÀÌ´Â Maybe ÀڷᱸÁ¶¸¦ ÀÌ¿ëÇÏ¿© ÇØ°áÇÒ ¼ö ÀÖ½À´Ï´Ù. {{{ data Maybe a = Nothing | Just a rgbToColor 255 0 0 = Just Red rgbToColor 255 128 0 = Just Orange rgbToColor 255 255 0 = Just Yellow rgbToColor 0 255 0 = Just Green rgbToColor 0 0 255 = Just Blue rgbToColor 255 0 255 = Just Purple rgbToColor 255 255 255 = Just White rgbToColor 0 0 0 = Just Black rgbToColor r g b= if 0 <= r && r <= 255 && 0 <= g && g <= 255 && 0 <= b && b <= 255 then Just (Custom r g b) else Nothing -- invalid RGB value }}} À§ ÇÔ¼ö¸¦ ÀÌ¿ëÇÏ¿© rgb °ªÀÌ ¿Ã¹Ù¸¥Áö °Ë»çÇÏ´Â ÇÔ¼ö¸¦ ¸¸µé ¼ö ÀÖ½À´Ï´Ù. {{{ rgbIsValid r g b = rgbIsValid' (rgbToColor r g b) where rgbIsValid' (Just _) = True rgbIsValid' _ = False }}} ÆÐÅϸÅĪÀ» »ç¿ëÇÒ ¶§ ÇÑ°¡Áö ÁÖÀÇÇÒ Á¡Àº, ÀÚ·áÇü¿¡¸¸ ¸ÅÄ¡°¡ ÀÌ·ïÁø´Ù´Â Á¡ÀÔ´Ï´Ù. ±×·¯¹Ç·Î ´ÙÀ½°ú °°ÀÌ ÇÔ¼ö¿¡ ´ëÇؼ­´Â ¸ÅÄ¡¸¦ ÇÒ ¼ö ¾ø½À´Ï´Ù. {{{ f x = x + 1 g (f x) = x -- À߸øµÈ ÇÔ¼öÁ¤ÀÇ }}} == °¡µå == ÆÐÅÏ ¸ÅĪ°ú ºñ½ÁÇÏ°Ô, ÇÔ¼öÀÇ Á¤ÀÇ¿¡ °¡µå¸¦ »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù. ÇÔ¼öÀÇ ÀÎÀÚ µÚ, µîÈ£ ºÎÈ£ÀÇ ¾Õ¿¡¼­ ¾µ ¼ö ÀÖ½À´Ï´Ù. °¡µå´Â | ¹®ÀÚ¸¦ ¾Õ¿¡ ºÙÀÓÀ¸·Î½á ³ªÅ¸³À´Ï´Ù. ±×·³ ´ÙÀ½ ¿¹¸¦ »ìÆ캾½Ã´Ù. {{{ comparison x y | x < y = "The first is less" | x > y = "The second is less" | otherwise = "They are equal" }}} {{{ *Guards> comparison 5 10 "The first is less" *Guards> comparison 10 5 "The second is less" *Guards> comparison 7 7 "They are equal" }}} ±×·¯¹Ç·Î isMaxBright ÇÔ¼ö´Â ´ÙÀ½°ú °°ÀÌ ¹Ù²Ü ¼ö ÀÖ½À´Ï´Ù. {{{ isMaxBright2 c | r == 255 = True | g == 255 = True | b == 255 = True | otherwise = False where (r,g,b) = colorToRGB c }}} == ÀνºÅϽº ¼±¾ð == ¾î¶² ÇüÀ» Çü Ŭ·¡½ºÀÇ ÀνºÅϽº·Î ¸¸µé±â À§Çؼ­´Â, ÀνºÅϽº ¼±¾ðÀÌ ÇÊ¿äÇÕ´Ï´Ù. ´ë´Ù¼öÀÇ Å¬·¡½º¿¡´Â "ÃÖ¼ÒÇÑÀÇ ¿ÏÀüÇÑ Á¤ÀÇ"°¡ Á¦°øµË´Ï´Ù. ¸»±×´ë·Î Ŭ·¡½ºÀÇ Á¤ÀÇ¿¡ ÇÊ¿äÇÑ ÃÖ¼ÒÇÑÀÇ ±¸ÇöµÇ¾ßÇÒ ÇÔ¼öµéÀ» ÀǹÌÇÕ´Ï´Ù. === Eq Ŭ·¡½º === Eq Ŭ·¡½ºÀÇ ¸â¹ö (Áï, ÇÔ¼ö) ¿¡´Â 2°³°¡ ÀÖ½À´Ï´Ù. {{{ (==) :: Eq a => a -> a -> Bool (/=) :: Eq a => a -> a -> Bool }}} Eq Ŭ·¡½ºÀÇ ¿ÏÀüÇÑ Á¤ÀǸ¦ À§Çؼ­´Â ÃÖ¼ÒÇÑ À§ÀÇ µÎ ÇÔ¼ö Áß Çϳª°¡ Á¤ÀǵžßÇÕ´Ï´Ù. À̸¦ Á¤ÀÇÇϱâ À§Çؼ­´Â ÀνºÅϽº ¼±¾ðÀÌ ÇÊ¿äÇÕ´Ï´Ù. ¼³¸íÀ» À§ÇØ ´Ù½Ã Color ¹®Á¦·Ñ µ¹¾Æ°¡º¾½Ã´Ù. {{{ data Color = Red | Orange | Yellow | Green | Blue | Purple | White | Black | Custom Int Int Int -- R G B components }}} Color¶ó´Â ÀÚ·áÇüÀ» EqÀÇ ÀνºÅϽº·Î ¸¸µé±â À§Çؼ­, ´ÙÀ½°ú °°ÀÌ ÀνºÅϽº ¼±¾ðÀ» ÇÕ´Ï´Ù. {{{ instance Eq Color where Red == Red = True Orange == Orange = True Yellow == Yellow = True Green == Green = True Blue == Blue = True Purple == Purple = True White == White = True Black == Black = True (Custom r g b) == (Custom r' g' b') = r == r' && g == g' && b == b' _ == _ = False }}} instance¶ó´Â Å°¿öµå·Î ÀνºÅϽº ¼±¾ðÀÓÀ» ¾Ë¸®°í, Eq À̶ó´Â Ŭ·¡½º, Color¶ó´Â ÇüÀ» Àû¾îÁÝ´Ï´Ù. ±×¸®°í ¸¶Áö¸·À¸·Î where¶ó´Â Å°¿öµå°¡ ÇÊ¿äÇÕ´Ï´Ù. === Show Ŭ·¡½º === Show Ŭ·¡½º´Â ¾î¶² °ªÀ» ¹®ÀÚ¿­·Î ¹Ù²Ù±â À§ÇØ »ç¿ëµË´Ï´Ù. ÀÌ Å¬·¡½ºÀÇ ¸â¹ö´Â ¼¼ °³°¡ ÀÖ½À´Ï´Ù. {{{ show :: Show a => a -> String showsPrec :: Show a => Int -> a -> String -> String showList :: Show a => [a] -> String -> String }}} Show Ŭ·¡½ºÀÇ ÃÖ¼ÒÇÑÀÇ ¿ÏÀüÇÑ Á¤ÀǸ¦ À§Çؼ­´Â, show ¶Ç´Â showsPrec µÑ Áß ÇϳªÀÇ ÇÔ¼ö°¡ Á¤ÀǵžßÇÕ´Ï´Ù. ColorÇüÀÇ ÀνºÅϽº ¼±¾ðÀ» Çغ¾½Ã´Ù. {{{ instance Show Color where show Red = "Red" show Orange = "Orange" show Yellow = "Yellow" show Green = "Green" show Blue = "Blue" show Purple = "Purple" show White = "White" show Black = "Black" show (Custom r g b) = "Custom " ++ show r ++ " " ++ show g ++ " " ++ show b }}} === ±× ¹ÛÀÇ Áß¿äÇÑ Å¬·¡½º === ¸ÕÀú Ord Ŭ·¡½º¸¦ »ìÆ캸¸é, {{{ compare :: Ord a => a -> a -> Ordering (<=) :: Ord a => a -> a -> Bool (>) :: Ord a => a -> a -> Bool (>=) :: Ord a => a -> a -> Bool (<) :: Ord a => a -> a -> Bool min :: Ord a => a -> a -> a max :: Ord a => a -> a -> a }}} ÃÖ¼ÒÇÑÀÇ ¿ÏÀüÇÑ Á¤ÀǸ¦ À§Çؼ­´Â, À§ÀÇ 7°³ ÇÔ¼öÁß¿¡¼­ Çϳª°¡ Á¤ÀǵǾßÇÕ´Ï´Ù. ¼±ÅÃÀº ÀÚÀ¯Áö¸¸, compare ÇÔ¼ö¸¦ Á¤ÀÇÇÒ °ÍÀ» ±ÇÇÕ´Ï´Ù. ±×¸®°í Ordering ÀÚ·áÇüÀº ´ÙÀ½°ú °°½À´Ï´Ù. {{{ data Ordering = LT | EQ | GT }}} ´ÙÀ½°ú °°ÀÌ È®ÀÎÇغ¼ ¼ö ÀÖ½À´Ï´Ù. {{{ Prelude> compare 5 7 LT Prelude> compare 6 6 EQ Prelude> compare 7 5 GT }}} Ord Ŭ·¡½ºÀÇ ÀνºÅϽº·Î ¼±¾ðÇϱâ À§Çؼ­´Â ¸ÕÀú Eq Ŭ·¡½ºÀÇ ÀνºÅϽº·Î ¼±¾ðÇؾßÇÕ´Ï´Ù. ´Ù¸¥ ¸»·Î Çϸé, Ord Ŭ·¡½º´Â Eq Ŭ·¡½ºÀÇ ¼­ºêŬ·¡½ºÀÔ´Ï´Ù. ´ÙÀ½À¸·Î Enum Ŭ·¡½º¸¦ »ìÆ캸°Ú½À´Ï´Ù. ÀÌ´Â ¿­°ÅÇüÀ» ´Ù·ç±â À§ÇØ »ç¿ëµË´Ï´Ù. {{{ pred :: Enum a => a -> a succ :: Enum a => a -> a toEnum :: Enum a => Int -> a fromEnum :: Enum a => a -> Int enumFrom :: Enum a => a -> [a] enumFromThen :: Enum a => a -> a -> [a] enumFromTo :: Enum a => a -> a -> [a] enumFromThenTo :: Enum a => a -> a -> a -> [a] }}} ÃÖ¼ÒÇÑÀÇ ¿ÏÀüÇÑ Á¤ÀǸ¦ À§Çؼ­´Â, toEnum°ú fromEnumÀÌ Á¤ÀǵžßÇÕ´Ï´Ù. ±× ´ÙÀ½Àº Num Ŭ·¡½ºÀÔ´Ï´Ù. »ê¼ú¿¬»êÀÚ¸¦ ¸â¹öÇÔ¼ö·Î Á¦°øÇÕ´Ï´Ù. {{{ (-) :: Num a => a -> a -> a (*) :: Num a => a -> a -> a (+) :: Num a => a -> a -> a negate :: Num a => a -> a signum :: Num a => a -> a abs :: Num a => a -> a fromInteger :: Num a => Integer -> a }}} Read Ŭ·¡½º´Â Show Ŭ·¡½ºÀÇ ¹Ý´ë¿ªÇÒÀ» ÇÕ´Ï´Ù. {{{ readsPrec :: Read a => Int -> String -> [(a, String)] readList :: String -> [([a], String)] }}} ÃÖ¼ÒÇÑÀÇ ¿ÏÀüÇÑ Á¤ÀǸ¦ À§Çؼ­´Â, readsPrecÀÌ Á¤ÀÇµÅ¾ß ÇÕ´Ï´Ù. === Ŭ·¡½º ¹®¸Æ === MaybeÇüÀº ´ÙÀ½°ú °°´Ù°í ¹è¿ü½À´Ï´Ù. {{{ data Maybe a = Nothing | Just a }}} ±×·¯¸é MaybeÇüÀ», EqÀÇ ÀνºÅϽº·Î ¼±¾ðÇغ¸µµ·Ï ÇÏ°Ú½À´Ï´Ù. {{{ instance Eq a => Eq (Maybe a) where Nothing == Nothing = True (Just x) == (Just x') = x == x' }}} Eq a => Eq (Maybe a) ¿¡¼­ `Eq a =>' ´Â a°¡ Eq Ŭ·¡½ºÀÇ ÀνºÅϽºÀÓÀ» ¾Ë·ÁÁÝ´Ï´Ù. `Eq (Maybe a)'´Â Maybe a ÇüÀº Eq Ŭ·¡½ºÀÇ ÀνºÅϽºÀÓÀ» ¼±¾ðÇÕ´Ï´Ù. ±×·¯¹Ç·Î À§ÀÇ ¼±¾ð¿¡ µû¸£¸é, Eq Ŭ·¡½ºÀÇ ÀνºÅϽºÀÎ aÇüÀÌ ÀÖ´Ù¸é Maybe a Çüµµ Eq Ŭ·¡½ºÀÇ ÀνºÅϽº°¡ µË´Ï´Ù. === Ŭ·¡½ºÀÇ ÆÄ»ý (deriving class) === Eq, Ord, Read, Show µî°ú °°Àº Ŭ·¡½ºµéÀÇ ÀνºÅϽº·Î ¼±¾ðÇÏ´Â °ÍÀº, deriving Å°¿öµå¸¦ »ç¿ëÇÏ¿© ÀÚµ¿ÀûÀ¸·Î ó¸®ÇÒ ¼ö ÀÖ½À´Ï´Ù. {{{ data Color = Red | ... | Custom Int Int Int -- R G B components deriving (Eq, Ord, Read, Show) data Maybe a = Nothing | Just a deriving (Eq, Ord, Read, Show) }}} ÀÌ·¸°Ô ÆÄ»ý½Ãų ¼ö Àִ Ŭ·¡½º¿¡´Â 6°³°¡ ÀÖ½À´Ï´Ù. Eq, Ord, Enum, Bounded, Show, Read. == ÀÚ·áÇü == ´ÙÀ½°ú °°Àº ÀÚ·áÇüÀ» Á¤ÀÇÇغ¾½Ã´Ù. {{{ data Configuration = Configuration String -- user name String -- local host String -- remote host Bool -- is guest? Bool -- is super user? String -- current directory String -- home directory Integer -- time connected deriving (Eq, Show) }}} user name, local host µîÀ» ¹ÝȯÇÏ´Â ÇÔ¼ö¸¦ ¸¸µé¾î º¾½Ã´Ù. {{{ getUserName (Configuration un _ _ _ _ _ _ _) = un getLocalHost (Configuration _ lh _ _ _ _ _ _) = lh getRemoteHost (Configuration _ _ rh _ _ _ _ _) = rh getIsGuest (Configuration _ _ _ ig _ _ _ _) = ig ... }}} ±×·¯³ª ÀÌ´Â ºñÈ¿À²ÀûÀÔ´Ï´Ù. ÀڷᱸÁ¶ÀÇ °¢ Çʵ忡 À̸§À» ºÙ¿©º¾½Ã´Ù. {{{ data Configuration = Configuration { username :: String, localhost :: String, remotehost :: String, isguest :: Bool, issuperuser :: Bool, currentdir :: String, homedir :: String, timeconnected :: Integer } }}} ÀÌ·¸°Ô ÇÏ¸é ´ÙÀ½°ú °°Àº ÇÔ¼ö°¡ ÀÚµ¿À¸·Î »ý¼ºµË´Ï´Ù. {{{ username :: Configuration -> String localhost :: Configuration -> String ... }}} °Ô´Ù°¡ ÇʵåÀÇ °ªÀ» °»½ÅÇÒ ¼öµµ ÀÖ½À´Ï´Ù. ´ÙÀ½ Äڵ带 »ìÆ캾½Ã´Ù. {{{ changeDir :: Configuration -> String -> Configuration changeDir cfg newDir = -- make sure the directory exists if directoryExists newDir then -- change our current directory cfg{currentdir = newDir} else error "directory does not exist" postWorkingDir :: Configuration -> String -- retrieve our current directory postWorkingDir cfg = currentdir cfg }}} ÀϹÝÀûÀ¸·Î ÀÚ·áÇü aÀÇ Çʵå xÀÇ °ªÀ» x'·Î ¹Ù²Ù°í ½Í´Ù¸é, a{ x = x' } ¿Í °°ÀÌ ¾²¸é µË´Ï´Ù. ¿©·¯ °³¸¦ ¹Ù²Ù±â À§Çؼ­´Â a{ x = x', y = y', z = z' } ¿Í °°ÀÌ ÇÒ ¼öµµ ÀÖ½À´Ï´Ù. ´ÙÀ½°ú °°ÀÌ ¿©·¯ °³ÀÇ ÇÊµå °ªÀ» °¡Á®¿À´Â ÇÔ¼ö°¡ ÇÊ¿äÇÒ ¼öµµ ÀÖ½À´Ï´Ù. {{{ getHostData (Configuration _ lh rh _ _ _ _ _) = (lh,rh) }}} ±×·± °æ¿ì¿¡´Â ´ÙÀ½°ú °°ÀÌ ÆÐÅϸÅĪÀ» ÀÌ¿ëÇÏ¸é °¡µ¶¼ºÀÌ ÁÁÀº Äڵ带 ÀÛ¼ºÇÒ ¼ö ÀÖ½À´Ï´Ù. {{{ getHostData (Configuration{ localhost = lh, remotehost = rh }) = (lh,rh) }}} ±×¸®°í ¸¶Áö¸·À¸·Î, ConfigurationÇüÀÇ °ªÀ» »ý¼ºÇÏ´Â ¹æ¹ý¿¡´Â µÎ °¡Áö ¹æ¹ýÀÌ ÀÖ½À´Ï´Ù. {{{ initCFG = Configuration "nobody" "nowhere" "nowhere" False False "/" "/" 0 initCFG' = Configuration { username = "nobody", localhost = "nowhere", remotehost = "nowhere", isguest = False, issuperuser = False, currentdir = "/", homedir = "/", timeconnected = 0 } }}} ¹°·Ð, µÎ¹ø° ¹æ¹ýÀÌ ÈξÀ ÀÌÇØÇϱⰡ ½±½À´Ï´Ù. == ¸®½ºÆ® == ¼öÇп¡¼­ ÁýÇÕÀ» Á¤ÀÇÇÒ ¶§, ´ÙÀ½°ú °°ÀÌ ¾²±âµµ ÇÕ´Ï´Ù. {f(x) | x ¡ô s ¡ü p(x)} ÀÌ´Â sÀÇ ¿ä¼ÒÁß¿¡¼­ p¸¦ ¸¸Á·ÇÏ´Â ¸ðµç ¿ä¼ÒÀÇ ÁýÇÕÀ» ³ªÅ¸³À´Ï´Ù. ÇϽºÄÌ¿¡¼­´Â ÀÌ¿Í ºñ½ÁÇÑ ¹®¹ýÀ» Áö¿øÇÕ´Ï´Ù. {{{ [f x | x <- s, p x] }}} ÀÌ·± ½ÄÀ¸·Î ¸®½ºÆ®¸¦ Ç¥ÇöÇÏ´Â °ÍÀ» ¸®½ºÆ® ³»Æ÷±¸¹®(list comprehension)À̶ó°í ÇÕ´Ï´Ù. ¸®½ºÆ® ³»Æ÷±¸¹®À» ÀÌ¿ëÇÏ¿© ¹®ÀÚ¿­¿¡¼­ ´ë¹®ÀÚ¸¸À» °ñ¶ó ¼Ò¹®ÀÚ·Î º¯È¯ÇÑ ¸®½ºÆ®¸¦ ¹ÝȯÇÏ´Â ÇÔ¼ö¸¦ ÀÛ¼ºÇغ¾½Ã´Ù. {{{ Prelude> map toLower (filter isUpper "Hello World") "hw" Prelude> [toLower x | x <- "Hello World", isUpper x] "hw" }}} ´ÙÀ½°ú °°ÀÌ ¼ø¼­½Ö¿¡ Àû¿ëÇÒ ¼öµµ ÀÖ½À´Ï´Ù. {{{ Prelude> [(x,y) | x <- [1..5], y <- [x..7]] [(1,1),(1,2),(1,3),(1,4),(1,5),(1,6),(1,7),(2,2),(2,3), (2,4),(2,5),(2,6),(2,7),(3,3),(3,4),(3,5),(3,6),(3,7), (4,4),(4,5),(4,6),(4,7),(5,5),(5,6),(5,7)] }}} == ¹è¿­ == ¸®½ºÆ®´Â ¿©·¯ ¸ð·Î ÁÁÀº Á¡ÀÌ ÀÖÁö¸¸, ÀÓÀÇÁ¢±Ù(random access)ÀÇ ½Ã°£ º¹Àâµµ°¡ O(n) À̶ó´Â ´ÜÁ¡ÀÌ ÀÖ½À´Ï´Ù. ±×·¸±â ¶§¹®¿¡ ÀÓÀÇÁ¢±ÙÀÌ ºó¹øÇÑ °æ¿ì¿¡´Â ¹è¿­À» »ç¿ëÇÏ´Â °ÍÀÌ ÁÁ½À´Ï´Ù. ¹è¿­À» »ç¿ëÇϱâ À§Çؼ­´Â ¿ì¼± Array ¸ðµâÀ» ºÒ·¯¿É´Ï´Ù. ¹è¿­À» »ý¼ºÇÏ´Â ÇÔ¼ö¿¡´Â array, listArray ±×¸®°í accumArray °¡ ÀÖ½À´Ï´Ù. array ÇÔ¼ö´Â µÎ °³ÀÇ ÀÎÀÚ¸¦ ¹Þ½À´Ï´Ù. ù¹ø° ÀÎÀÚ´Â ¹è¿­ÀÇ Å©±â¸¦ ³ªÅ¸³À´Ï´Ù. µÎ¹ø° ÀÎÀÚ´Â ¹è¿­ÀÇ °ªÀ» ³ªÅ¸³»´Âµ¥, ¦À» ¿ä¼Ò·Î °®´Â ¸®½ºÆ®ÀÔ´Ï´Ù. listArrayÀÇ Ã¹¹ø° ÀÎÀÚµµ ¹è¿­ÀÇ Å©±â¸¦ ³ªÅ¸³À´Ï´Ù. µÎ¹ø° ÀÎÀÚ´Â ¹è¿­ÀÇ °ªÀ» ¿ä¼Ò·Î °®´Â ¸®½ºÆ®ÀÔ´Ï´Ù. accumArrayÀÇ ¼¼¹ø°, ³×¹ø° ÀÎÀÚ´Â °¢°¢ arrayÀÇ Ã¹¹ø°, µÎ¹ø° ÀÎÀÚ¿Í °°½À´Ï´Ù. array ÇÔ¼ö¿ÍÀÇ Â÷ÀÌÁ¡Àº, ù¹ø° ÀÎÀÚ·Î ¹Þ´Â ÇÔ¼ö¿Í µÎ¹ø° ÀÎÀÚ·Î ¹Þ´Â ÃʱⰪÀ» ÀÌ¿ëÇÏ¿© »õ·Î¿î ¹è¿­À» ¸¸µé¾î ¹ÝȯÇÑ´Ù´Â Á¡ÀÔ´Ï´Ù. {{{ Prelude Array> array (1,5) [(i,2*i) | i <- [1..5]] array (1,5) [(1,2),(2,4),(3,6),(4,8),(5,10)] Prelude Array> listArray (1,5) [3,7,5,1,10] array (1,5) [(1,3),(2,7),(3,5),(4,1),(5,10)] Prelude Array> accumArray (+) 2 (1,5) [(i,i) | i <- [1..5]] array (1,5) [(1,3),(2,4),(3,5),(4,6),(5,7)] }}} ! ¿¬»êÀÚ¸¦ ÀÌ¿ëÇÏ¿© ¹è¿­°ª¿¡ Á¢±ÙÇÒ ¼ö ÀÖ½À´Ï´Ù. {{{ Prelude Array> (listArray (1,5) [3,7,5,1,10]) ! 3 5 }}} // ¿¬»êÀÚ¸¦ ÀÌ¿ëÇÏ¿© ¿©·¯ °ªÀ» ÇÑ ¹ø¿¡ °»½ÅÇÒ ¼ö ÀÖ½À´Ï´Ù. {{{ Prelude Array> (listArray (1,5) [3,7,5,1,10]) // [(2,99),(3,-99)] array (1,5) [(1,3),(2,99),(3,-99),(4,1),(5,10)] }}} ±×·¯³ª !¿Í // ¿¬»êÀÚ¸¦ ÀÌ¿ëÇÏ¿© ¹è¿­À» º¯È­ÇÏ´Â °ÍÀº O(1)ÀÌ ¾Æ´Ï°í O(n)ÀÔ´Ï´Ù. ¿Ö³ÄÇϸé ÇÔ¼öÀÇ ¼ø¼öÇÔÀ» À¯ÁöÇϱâ À§Çؼ­, »õ·Î¿î ¹è¿­À» ¸¸µé ¶§ ¿ø·¡ÀÇ ¹è¿­À» Áö¿ìÁö ¾Ê°í º¹»çÇÏ¿© ¸¸µé±â ¶§¹®ÀÔ´Ï´Ù. ¹è¿­º¸´Ù Á» ´õ ºü¸£°Ô °»½ÅÇÒ ¼ö ÀÖ´Â ÀڷᱸÁ¶¸¦ ¿øÇÑ´Ù¸é MapÀ» »ç¿ëÇؾßÇÕ´Ï´Ù. {{{ bounds : ¹è¿­ÀÇ Å©±â¸¦ ¹Ýȯ indices : ¹è¿­ÀÇ ¸ðµç »öÀÎ(index)À» ¿ä¼Ò·Î ÇÏ´Â ¸®½ºÆ®¸¦ ¹Ýȯ elems : ¹è¿­ÀÇ ¸ðµç °ªÀ» ¿ä¼Ò·Î ÇÏ´Â ¸®½ºÆ®¸¦ ¹Ýȯ assocs : »öÀΰú °ªÀÇ Â¦À» ¿ä¼Ò·Î °®´Â ¸®½ºÆ®¸¦ ¹Ýȯ }}} {{{ Arrays> bounds arr (1,5) Arrays> indices arr [1,2,3,4,5] Arrays> elems arr [3,7,5,1,10] Arrays> assocs arr [(1,3),(2,7),(3,5),(4,1),(5,10)] }}} == Map == MapÀ̶ó´Â ÀڷᱸÁ¶´Â Data.MapÀ̶ó´Â ¸ðµâÀ» ºÒ·¯¿ÈÀ¸·Î½á »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù. ÀÌ°ÍÀº balanced tree¸¦ ±¸ÇöÇÑ °ÍÀε¥, ¸®½ºÆ®¿Í ¹è¿­°ú ºñ±³¸¦ Çغ¸¸é ´ÙÀ½°ú °°½À´Ï´Ù. {{{ ¸®½ºÆ® ¹è¿­ Map »ðÀÔ (1°³) O(1) O(n) O(log n) ¼öÁ¤ (1°³) O(n) O(n) O(log n) »èÁ¦ (1°³) O(n) O(n) O(log n) ÀÓÀÇÁ¢±Ù (1°³) O(n) O(1) O(log n) Àüüº¯È¯ (n°³) O(n) O(n) O(n log n) }}} {{{ ¸®½ºÆ® ¹è¿­ Map (:) *2 insert *1 (//) adjust *1 *2 delete (!!) (!) lookup map amap map *1 : mapÀ̳ª filter¸¦ ÀÌ¿ëÇÏ¿© ÇÔ¼ö¸¦ ¸¸µé¾î¾ß ÇÑ´Ù. *2 : ¹è¿­Àüü¸¦ Àоî¿Í¼­ »õ·Î¿î ¹è¿­À» ¸¸µé¸é µÈ´Ù. }}} ±âº»ÀûÀÎ ÇÔ¼ö¿Í ±× ÇüÀº ´ÙÀ½°ú °°½À´Ï´Ù. {{{ empty :: Map key elt insert :: Ord key => key -> elt -> Map key elt -> Map key elt delete :: Ord key => key -> Map key elt -> Map key elt member :: Ord key => key -> Map key elt -> Bool lookup :: Ord key => key -> Map key elt -> Maybe elt }}} »ç¿ë¹ýÀº ´ÙÀ½°ú °°½À´Ï´Ù. {{{ Prelude> :m Data.Map Prelude Data.Map> let m = fromList [('a',5),('b',10),('c',1),('d',2)] Prelude Data.Map> let m' = insert 'e' 6 m Prelude Data.Map> toList m [('a',5),('b',10),('c',1),('d',2)] Prelude Data.Map> toList m' [('a',5),('b',10),('c',1),('d',2),('e',6)] Prelude Data.Map> Data.Map.lookup 'e' m' Just 6 Prelude Data.Map> Data.Map.lookup 'e' m Nothing }}} = ºÎ·Ï = == ºÎ·Ï 1. == ÀÚÁÖ »ç¿ëÇÏ´Â »ê¼úÇü ---- || '''Çü''' |||| '''Ŭ·¡½º''' |||| '''¼³¸í''' || || Integer |||| Integral |||| Arbitrary-precision integers || || Int |||| Integral |||| Fixed-precision integers || || (Integral a) => Ratio a |||| RealFrac |||| Rational numbers || || Float |||| RealFloat |||| Real floating-point, single precision || || Double |||| RealFloat |||| Real floating-point, double precision || || (RealFloat a) => Complex a |||| Floating |||| Complex floating-point || ---- Ŭ·¡½º °ü°è ---- || '''Ŭ·¡½º''' |||| '''ÆÄ»ýµÈ Ŭ·¡½º''' || || Real |||| Num, Ord || || Integral |||| Real, Enum || || Fractional |||| Num || || Floating |||| Fractional || || RealFrac |||| Real, Fractional || || RealFloat |||| RealFrac, Floating || ---- == ºÎ·Ï 2. Prelude.hs ÀÇ ³»ÀåÇÔ¼öµé == {{{ compare, <, <=, >=, >, max, min : µÎ °ªÀ» ºñ±³ == : µÎ °³ÀÇ °ªÀÌ °°ÀºÁö ºñ±³ /= : µÎ °³ÀÇ °ªÀÌ ´Ù¸¥Áö ºñ±³ abs : Àý´ë°ª fromInteger : IntegerÇüÀÇ °ªÀ» ¹Þ¾Æ º¯È¯ toInteger : IntegerÇüÀÇ °ªÀ¸·Î º¯È¯ fromRational : RationalÇüÀÇ °ªÀ» ¹Þ¾Æ º¯È¯ toRational : RationalÇüÀÇ °ªÀ¸·Î º¯È¯ realToFrac : RealÇüÀÇ °ªÀ» FractionalÇüÀ¸·Î º¯È¯ show : StringÇüÀÇ °ªÀ¸·Î º¯È¯ read : StringÇüÀÇ °ªÀ» ¹Þ¾Æ º¯È¯ pi, (**), exp, log, sqrt, logBase, sin, cos, tan, asin, acos, atan, sinh, cosh, tanh, asinh, acosh, atanh truncate, round, ceiling, floor div, mod : ³ª´°¼À°ú ³ª¸ÓÁö gcd, lcm : ÃÖ´ë°ø¾à¼ö¿Í ÃÖ¼Ò°ø¹è¼ö even, odd : ¾î¶² °ªÀÌ Â¦ÀÎÀÎÁö Ȧ¼öÀÎÁö id : id x = x flip : flip f x y = f y x $ : f $ x = f x $! : f $! x = x `seq` f x (&&), (||) : ºÒ¸° ¿¬»êÀÚ True, False : True && x = x False && _ = False True || _ = True False || x = x not : not True = False not False = True otherwise : otherwise = True succ, pred fst, snd curry, uncurry error : ¿À·ù ¹®±¸¸¦ Ãâ·ÂÇÏ°í ½ÇÇàÀ» ¸ØÃã. error = primError undefined : undefined = error "Prelude.undefined" : : ¸®½ºÆ®ÀÇ ¾Õ¿¡ »õ·Î¿î ¿ä¼Ò¸¦ Ãß°¡ÇÔ ++ : ¸®½ºÆ® µÎ °³¸¦ ¿¬°áÇÒ ¶§ null : ¸®½ºÆ®°¡ ºñ¾îÀÖ´ÂÁö head : ¸®½ºÆ®ÀÇ Ã³À½ ¿ä¼Ò last : ¸®½ºÆ®ÀÇ ¸¶Áö¸· ¿ä¼Ò tail : ¸®½ºÆ®ÀÇ Ã³À½ ¿ä¼Ò¸¦ Á¦¿ÜÇÑ ³ª¸ÓÁö init : ¸®½ºÆ®ÀÇ ¸¶Áö¸· ¿ä¼Ò¸¦ Á¦¿ÜÇÑ ³ª¸ÓÁö length : ¸®½ºÆ®ÀÇ ±æÀÌ !! : ¸®½ºÆ®ÀÇ i¹ø° ¿ä¼Ò¸¦ ¹Ýȯ reverse : ¸®½ºÆ®¸¦ µÚÁý´Â´Ù. concat : ¸®½ºÆ®ÀÇ ¸®½ºÆ®¸¦ ÀÎÀÚ·Î ¹Þ¾Æ¼­ ¸ðµç ¸®½ºÆ®¸¦ ÇÕÄ£´Ù. map, filter foldl, foldr scanl, scanl1, scanr, scanr1 iterate : [ x, f x, f(f x), ... ] À» ¹Ýȯ repeat : ¸ðµç ¿ä¼ÒÀÇ °ªÀÌ xÀÎ ¹«ÇѱæÀÌ ¸®½ºÆ® replicate : ¸ðµç ¿ä¼ÒÀÇ °ªÀÌ xÀÎ À¯ÇѱæÀÌ ¸®½ºÆ® cycle : ÁÖ¾îÁö ¸®½ºÆ®¸¦ ¹«Çѹݺ¹ÇÏ´Â ¸®½ºÆ®¸¦ ¹Ýȯ take, drop : take´Â ù¹ø° n°³ÀÇ ¿ä¼Ò¸¦ ¹Ýȯ, dropÀº ù¹ø° n°³¸¦ Á¦¿ÜÇÑ ¿ä¼Ò¸¦ ¹Ýȯ splitAt : splitAt n xs = (take n xs, drop n xs) takeWhile, dropWhile : take, drop°ú ºñ½ÁÇÏ´Ù. ÇÔ¼ö¸¦ ÀÎÀÚ·Î ¹Þ¾Æ¼­ ¿ä¼Ò¸¦ Å×½ºÆ®Çϴµ¥ ±× ÇÔ¼ö¸¦ »ç¿ëÇÑ´Ù. words, unwords : words ÇÔ¼ö´Â ¹®ÀÚ¿­À» °ø¹éÀ» ±âÁØÀ¸·Î ¿©·¯ °³ÀÇ ¸®½ºÆ®·Î ³ª´«´Ù. lines, unlines : lines ÇÔ¼ö´Â new line ¹®ÀÚ¸¦ ±âÁØÀ¸·Î ¿©·¯ °³ÀÇ ¸®½ºÆ®·Î ³ª´«´Ù. and = foldr (&&) True or = foldr (||) False any p = or . map p all p = and . map p elem, notElem : ¸®½ºÆ®¿¡ ¾î¶² ¿ä¼ÒÀÇ °ªÀÌ Á¸ÀçÇÏ´ÂÁö ¾Ë·ÁÁØ´Ù. notElemÀº elemÀÇ ¹Ý´ë sum, product : ¸®½ºÆ®ÀÇ ÇÕ°ú °ö maximum, minimum zip : zip ÇÔ¼ö´Â µÎ °³ÀÇ ¸®½ºÆ®¸¦ ¹Þ¾Æ¼­ ¦ÀÇ ¸®½ºÆ®·Î ¸¸µê unzip zipWith }}} == ºÎ·Ï 3. ÀÔÃâ·Â °ü·Ã ÀÚ·áÇü ¹× ÇÔ¼ö == {{{ data IOMode = ReadMode | WriteMode | AppendMode | ReadWriteMode data BufferMode = NoBuffering | LineBuffering | BlockBuffering (Maybe Int) data SeekMode = AbsoluteSeek | RelativeSeek | SeekFromEnd stdin, stdout, stderr :: Handle openFile :: FilePath -> IOMode -> IO Handle hClose :: Handle -> IO () hFileSize :: Handle -> IO Integer hIsEOF :: Handle -> IO Bool isEOF :: IO Bool isEOF = hIsEOF stdin hSetBuffering :: Handle -> BufferMode -> IO () hGetBuffering :: Handle -> IO BufferMode hFlush :: Handle -> IO () hGetPosn :: Handle -> IO HandlePosn hSetPosn :: HandlePosn -> IO () hSeek :: Handle -> SeekMode -> Integer -> IO () hWaitForInput :: Handle -> Int -> IO Bool hReady :: Handle -> IO Bool hReady h = hWaitForInput h 0 hGetChar :: Handle -> IO Char hGetLine :: Handle -> IO String hLookAhead :: Handle -> IO Char hGetContents :: Handle -> IO String hPutChar :: Handle -> Char -> IO () hPutStr :: Handle -> String -> IO () hPutStrLn :: Handle -> String -> IO () hPrint :: Show a => Handle -> a -> IO () hIsOpen :: Handle -> IO Bool hIsClosed :: Handle -> IO Bool hIsReadable :: Handle -> IO Bool hIsWritable :: Handle -> IO Bool hIsSeekable :: Handle -> IO Bool isAlreadyExistsError :: IOError -> Bool isDoesNotExistError :: IOError -> Bool isAlreadyInUseError :: IOError -> Bool isFullError :: IOError -> Bool isEOFError :: IOError -> Bool isIllegalOperation :: IOError -> Bool isPermissionError :: IOError -> Bool isUserError :: IOError -> Bool ioeGetErrorString :: IOError -> String ioeGetHandle :: IOError -> Maybe Handle ioeGetFileName :: IOError -> Maybe FilePath try :: IO a -> IO (Either IOError a) bracket :: IO a -> (a -> IO b) -> (a -> IO c) -> IO c bracket_ :: IO a -> (a -> IO b) -> IO c -> IO c }}}