· KLDP.org · KLDP.net · KLDP Wiki · KLDP BBS ·
Yet Another Haskell Tutorial

Yet Another Haskell Tutorial ¿ä¾àº»

Contents

1. ¹®¼­Á¤º¸
1.1. ÀúÀÛ±Ç ¹× ¶óÀ̼±½º
1.2. Ãâó
1.3. ¾Ë¸²
1.4. ¹®¼­ÀÇ ¿ª»ç
1.5. °øÇåÀÚ
2. ½ÃÀÛÇϸ鼭 ...
2.1. ´ëÈ­½Ä ȯ°æ¿Í ÄÄÆÄÀÏ·¯
2.2. Ç¥±â¹ý
3. ÇϽºÄÌ ¾ð¾îÀÇ ±âÃÊ
3.1. »ê¼ú¿¬»êÀÚ
3.2. ¼ø¼­½Ö(tuple)
3.3. ¸®½ºÆ®
3.3.1. ¹®ÀÚ¿­
3.3.2. ±âº»ÀûÀÎ ¸®½ºÆ® ÇÔ¼ö
3.4. ¼Ò½ºÄÚµå ÆÄÀÏ
3.5. ÇÔ¼ö
3.5.1. let ¿«±â (let binding)
3.5.2. ÁßÀ§ ¿¬»êÀÚ
3.6. ÁÖ¼®
3.7. Àç±Í
3.8. ÀÔÃâ·Â
4. Çü(type)
4.1. ±âº»Çü
4.2. ´ÙÇüÀû Çü
4.3. Çü Ŭ·¡½º
4.3.1. Çü Ŭ·¡½ºÀÇ Çʿ伺
4.3.2. equality Å×½ºÆ®
4.3.3. Num Ŭ·¡½º
4.3.4. Show Ŭ·¡½º
4.4. ÇÔ¼öÀÇ Çü
4.4.1. ¶÷´Ù ´ë¼ö (Lamda Calculus)
4.4.2. °íÂ÷¿ø Çü
4.4.3. ¼º°¡½Å IO Çü
4.4.4. ¸í½ÃÀû Çü ¼±¾ð
4.4.5. ÇÔ¼ö¸¦ ÀÎÀÚ·Î »ç¿ëÇϱâ
4.5. ÀÚ·áÇü
4.5.1. Pair
4.5.2. ´ÙÁß »ý¼ºÀÚ
4.5.3. Àç±ÍÀû ÀÚ·áÇü
4.5.4. ÀÌÁø ³ª¹« (Binary Tree)
4.5.5. Enumerated Sets
4.5.6. Unit Çü
5. ±âº» ÀÔÃâ·Â
5.1. RealWorld
5.2. Çൿ
5.3. ÀÔÃâ·Â ¶óÀ̺귯¸®
5.4. ÆÄÀÏ Àбâ ÇÁ·Î±×·¥
6. °í±Þ ±â´É
6.1. ¼½¼Ç°ú ÁßÀ§¿¬»êÀÚ
6.2. Áö¿ª ¼±¾ð
6.3. ÇÔ¼öÀÇ ºÎºÐÀû¿ë
6.4. ÆÐÅÏ ¸ÅĪ
6.5. °¡µå
6.6. ÀνºÅϽº ¼±¾ð
6.6.1. Eq Ŭ·¡½º
6.6.2. Show Ŭ·¡½º
6.6.3. ±× ¹ÛÀÇ Áß¿äÇÑ Å¬·¡½º
6.6.4. Ŭ·¡½º ¹®¸Æ
6.6.5. Ŭ·¡½ºÀÇ ÆÄ»ý (deriving class)
6.7. ÀÚ·áÇü
6.8. ¸®½ºÆ®
6.9. ¹è¿­
6.10. Map
7. ºÎ·Ï
7.1. ºÎ·Ï 1.
7.2. ºÎ·Ï 2. Prelude.hs ÀÇ ³»ÀåÇÔ¼öµé
7.3. ºÎ·Ï 3. ÀÔÃâ·Â °ü·Ã ÀÚ·áÇü ¹× ÇÔ¼ö

1. ¹®¼­Á¤º¸

1.1. ÀúÀÛ±Ç ¹× ¶óÀ̼±½º


º» ¹®¼­´Â 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 ¿¡ ÀÖ½À´Ï´Ù.


1.2. Ãâó

¿µ¾î ¿ø¹®Àº ´ÙÀ½ ÁÖ¼Ò¿¡¼­ ¹ÞÀ» ¼ö ÀÖ½À´Ï´Ù.


´ÙÀ½ ÁÖ¼Ò·Î °¡¸é ¿Â¶óÀλóÀ¸·Î º¼ ¼ö ÀÖ½À´Ï´Ù.


ÇϽºÄÌ¿¡ °üÇÑ ´õ ¸¹Àº ¹®¼­´Â ´ÙÀ½ ÁÖ¼Ò¿¡¼­ º¼ ¼ö ÀÖ½À´Ï´Ù.


1.3. ¾Ë¸²


º» ¹®¼­´Â Yet Another Haskell TutorialÀÇ ¿ä¾àÆÇÀ¸·Î,

¿ÏÀüÇÑ ³»¿ëÀ» º¸±â À§Çؼ­´Â ¿µ¾î ¿ø¹®À» º¸½Ã±â ¹Ù¶ø´Ï´Ù.

1.4. ¹®¼­ÀÇ ¿ª»ç


2007³â 12¿ù 18ÀÏ ¹ø¿ª¹® ÃÖÃÊ °Ô½Ã

2009³â 7¿ù 5ÀÏ °³Á¤

1.5. °øÇåÀÚ


QuietJoon


2. ½ÃÀÛÇϸ鼭 ...

2.1. ´ëÈ­½Ä ȯ°æ¿Í ÄÄÆÄÀÏ·¯

ÇϽºÄÌ ¼Ò½ºÄڵ带 ½ÇÇàÇϱâ À§ÇÑ ÇÁ·Î±×·¥ Áß Àß ¾Ë·ÁÁø °ÍÀº µÎ °¡Áö°¡ ÀÖ½À´Ï´Ù. ù¹ø°·Î 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¸¦ ÃßõÇÕ´Ï´Ù.

2.2. Ç¥±â¹ý

´ëÈ­½Ä ȯ°æ¿¡¼­ ½ÇÇàÇÏ´Â ÄÚµå´Â ´ÙÀ½°ú °°ÀÌ `¸ðµâ¸í>' À¸·Î ½ÃÀÛÇÕ´Ï´Ù.
Prelude> print "Hello, world"
±×·¸Áö ¾Ê´Ù¸é ÆÄÀÏ·Î ÀÛ¼ºµÇ´Â ÄÚµåÀÔ´Ï´Ù.

3. ÇϽºÄÌ ¾ð¾îÀÇ ±âÃÊ


ù¹ø°·Î, ÇϽºÄÌÀº `´À±ßÇÑ' ¾ð¾î¶ó´Â Á¡ÀÌ °¡Àå Áß¿äÇÕ´Ï´Ù. ¿©±â¼­ `´À±ßÇÑ'Àº, °á°ú°ªÀÌ °è»êµÇÁö ¾ÊÀ¸¸é ¾ÈµÉ ½ÃÁ¡±îÁö °è»êÀ» ´ÊÃá´Ù´Â ÀǹÌÀÔ´Ï´Ù. ´À±ßÇÑ ¾ð¾îÀÇ ÀåÁ¡ÀÇ ¿¹¸¦ Çϳª µé¾îº¸¸é, ¹«ÇÑÅ©±âÀÇ ÀÚ·áÇüÀ» ´Ù·ê ¼ö ÀÖ´Ù´Â Á¡ÀÔ´Ï´Ù.

¸¸¾à ¸í·ÉÇüÀÇ ¾ð¾î¿¡¼­ ¹«ÇÑÅ©±âÀÇ ÀڷᱸÁ¶¸¦ ¸¸µé±â À§Çؼ­´Â, ¿¹¸¦µé¾î ´ÙÀ½°ú °°Àº °°Àº ÇüÅÂÀÇ Äڵ带 »ç¿ëÇؾßÇÒ °ÍÀÔ´Ï´Ù.
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·Î ´ëüÇÒ ¼ö ÀÖ½À´Ï´Ù. (ÂüÁ¶Àû Åõ¸í¼º'ÀÇ Á¤ÀÇ¿¡ ´ëÇÑ ´Ù¸¥ °ßÇØ°¡ ÀÖÀ» ¼ö ÀÖ½À´Ï´Ù.)

3.1. »ê¼ú¿¬»êÀÚ


¸ÕÀú 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°¡ Á¤¼öÇüó·³ º¸À̴µ¥ ¿Ö °á°ú°ªÀÌ ½Ç¼öÇüÀ¸·Î ³ª¿À´ÂÁö ÀǾÆÇØÇÒ °ÍÀÔ´Ï´Ù. ÀÌ°ÍÀº Çü Ŭ·¡½º¿¡¼­ ÀÚ¼¼È÷ ´Ù·ç°Ú½À´Ï´Ù.)

3.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") °ú °°ÀÌ ¸»ÀÔ´Ï´Ù.

3.3. ¸®½ºÆ®


¼ø¼­½ÖÀº °íÁ¤µÈ ¼öÀÇ ¿ä¼Ò°¡ ÀÖÁö¸¸, ¸®½ºÆ®´Â ÀÓÀÇÀÇ ¼öÀÇ ¿ä¼Ò°¡ ÀÖÀ» ¼ö ÀÖ½À´Ï´Ù. ¼ø¼­½Ö°ú´Â ´Ù¸£°Ô ´ë°ýÈ£°¡ »ç¿ëµË´Ï´Ù.
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

3.3.1. ¹®ÀÚ¿­

ÇϽºÄÌ¿¡¼­´Â ¹®ÀÚ¿­Àº ¹®ÀÚÀÇ ¸®½ºÆ®ÀÔ´Ï´Ù.
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

3.3.2. ±âº»ÀûÀÎ ¸®½ºÆ® ÇÔ¼ö

¸®½ºÆ®¸¦ ´Ù·ç±â À§ÇÑ ¼¼ °¡Áö ±âº» ÇÔ¼ö°¡ ÀÖ½À´Ï´Ù. ¹Ù·Î 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 ¸¦ ³ªÅ¸³À´Ï´Ù.

3.4. ¼Ò½ºÄÚµå ÆÄÀÏ


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

3.5. ÇÔ¼ö


Á¦°öÀ» ±¸ÇÏ´Â ÇÔ¼ö¸¦ Á¤ÀÇÇغ¾½Ã´Ù.
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 []}

3.5.1. 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)

3.5.2. ÁßÀ§ ¿¬»êÀÚ


+ ¿¬»êÀÚ´Â ´ÙÀ½°ú °°ÀÌ ÁßÀ§ ¿¬»êÀÚ·Î »ç¿ëµË´Ï´Ù.
Prelude> 5 + 10
15
±×·¯³ª ´ÙÀ½°ú °°ÀÌ °ýÈ£·Î ¹­¾îÁÖ¸é ´Ù¸¥ ÇÔ¼öµé°ú ¸¶Âù°¡Áö·Î ÀÎÀÚµé ¿ÞÂÊ¿¡¼­ ¾µ ¼ö ÀÖ½À´Ï´Ù.
Prelude> (+) 5 10
15
¹Ý´ë·Î, ´Ù¸¥ ÇÔ¼öµéÀº ` ¹®ÀÚ·Î ¹­¾îÁÖ¸é ÁßÀ§ ¿¬»êÀÚó·³ »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù.
Prelude> map Char.toUpper "Hello World"
"HELLO WORLD"
Prelude> Char.toUpper ¡®map¡® "Hello World"
"HELLO WORLD"

3.6. ÁÖ¼®


ÇÑ ÁÙ ÁÖ¼®Àº -- À¸·Î ½ÃÀÛÇÏ°í, ¿©·¯ÁÙ ÁÖ¼®Àº {- ·Î ½ÃÀÛÇؼ­ -} ·Î ³¡³³´Ï´Ù. 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

3.7. Àç±Í


¸í·ÉÇü ¾ð¾î¿¡¼­´Â Á¦¾î±¸¹®À¸·Î ¹Ýº¹¹®ÀÌ ¸¹ÀÌ ¾²ÀÌÁö¸¸ ÇϽºÄÌ¿¡¼­ ¹Ýº¹¹®Àº °¡´ÉÇÏÁö ¾Ê½À´Ï´Ù. ´ë½Å¿¡ Àç±Í¸¦ »ç¿ëÇÕ´Ï´Ù. 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

3.8. ÀÔÃâ·Â


ÀÔÃâ·ÂÀ» ó¸®Çϱâ À§Çؼ­ ¸ð³ªµå¶ó´Â °³³äÀÌ »ç¿ëµÇÁö¸¸ ¿©±â¼­ ¼³¸íÇÏÁö´Â ¾Ê°Ú½À´Ï´Ù. ¿©±â¼­´Â ´ëÈ­½Ä(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)

4. Çü(type)


ÇϽºÄÌÀº Á¤ÀûÇü ¾ð¾î(static type language)ÀÔ´Ï´Ù. ÀÌ ¸»ÀÇ Àǹ̴Â, ÇϽºÄÌ¿¡´Â ¸ðµç Ç¥Çö½Ä¿¡´Â ÇüÀÌ ¹èÁ¤µÈ´Ù´Â °ÍÀÔ´Ï´Ù. ¿¹¸¦ µé¸é, 'a'ÀÇ ÇüÀº CharÀÔ´Ï´Ù. ÇÔ¼öÀÇ ÀÎÀÚ¿¡µµ ÇüÀÌ ÇÊ¿äÇÕ´Ï´Ù. ¸¸¾à ´Ù¸¥ ÇüÀ» ÀÎÀÚ·Î ³Ö°Ô µÇ¸é ÄÄÆÄÀÏ ¿À·ù°¡ ¹ß»ýÇÕ´Ï´Ù. ÀÌ·± Ư¡À¸·Î ÀÎÇØ ¸¹Àº ¹ö±×¸¦ ÁÙÀÏ ¼ö ÀÖ½À´Ï´Ù. °Ô´Ù°¡ ÇϽºÄÌÀº Çü Ãß·Ð ½Ã½ºÅÛÀ» »ç¿ëÇÕ´Ï´Ù. ÀÌ´Â ¸ðµç Ç¥ÇöÀÇ ÇüÀ» ÁöÁ¤ÇØÁÙ ÇÊ¿ä°¡ ¾ø´Ù´Â ¸»ÀÔ´Ï´Ù. C¿¡¼­´Â º¯¼ö¸¦ ¼±¾ðÇÒ ¶§ int, char, .. °°Àº ÇüÀ» ÁöÁ¤ÇؾßÇßÁö¸¸, ÇϽºÄÌ¿¡¼­´Â ÇüÀ» ¹®¸Æ¿¡¼­ Ãß·ÐÇÏ°Ô µË´Ï´Ù. ¶ÇÇÑ ÇüÀ» ¸í½ÃÀûÀ¸·Î ÁöÁ¤ÇÏ´Â °Íµµ °¡´ÉÇÕ´Ï´Ù. ÀÌ °æ¿ì¿¡´Â µð¹ö±ëÇϴµ¥ µµ¿òÀ» ÁÙ °ÍÀÔ´Ï´Ù.

Hugs ¿Í GHCi ¿¡¼­´Â :t ¸í·É¾î·Î Ç¥Çö½ÄÀÇ ÇüÀ» ¾Ë¾Æ³¾ ¼ö ÀÖ½À´Ï´Ù.
Prelude> :t 'c'
'c' :: Char
À̸¦ ÅëÇØ 'c' ´Â CharÇüÀ̶ó´Â °ÍÀ» ¾Ë ¼ö ÀÖ½À´Ï´Ù.

4.1. ±âº»Çü


³»ÀåµÈ ±âº»Çü¿¡´Â, 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
ÀÌ¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ ³»¿ëÀº `Çü Ŭ·¡½º'¿¡¼­ »ìÆ캸±â·Î ÇÏ°í ³Ñ¾î°©½Ã´Ù.

4.2. ´ÙÇüÀû Çü


ÇϽºÄÌ¿¡´Â ´ÙÇüÀû Çü ½Ã½ºÅÛÀ» °¡Áö°í ÀÖ½À´Ï´Ù. Áï, Çü º¯¼ö¸¦ »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù. 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 °ªÀ» ¹ÝȯÇÕ´Ï´Ù.

4.3. Çü Ŭ·¡½º


¾Õ¿¡¼­ ¼ýÀÚ 5¶ó´Â °ªÀº Á¤¼öÇü ¶Ç´Â ½Ç¼öÇüÀ¸·Î ÁöÁ¤ÇÒ ¼ö ÀÖ´Ù´Â °Í°ú Çü Ŭ·¡½º¿Í °ü·ÃÀÌ ÀÖ´Ù´Â °ÍÀ» ¹è¿ü½À´Ï´Ù. ÀÌÁ¦ Çü Ŭ·¡½º¿¡ ´ëÇؼ­ Á» ´õ ÀÚ¼¼È÷ ¾Ë¾Æº¾½Ã´Ù.

4.3.1. Çü Ŭ·¡½ºÀÇ Çʿ伺


¸¹Àº ¾ð¾î¿¡¼­´Â ¿À¹ö·ÎµùÀ̶ó´Â ½Ã½ºÅÛÀÌ ÀÖ½À´Ï´Ù. Áï, ÇÔ¼öÀÇ ÀÎÀÚ°¡ ´Ù¸£¸é ÇÔ¼öÀÇ µ¿ÀÛÀÌ ´Þ¶óÁý´Ï´Ù. ¿¹¸¦ µé¾î µÎ °´Ã¼¸¦ ºñ±³ÇÏ´Â equal ÇÔ¼ö°¡ ÀÖ´Ù°í Çϸé, Á¤¼ö¸¦ ºñ±³Çϱâ À§ÇÑ ¹æ¹ý°ú, ½Ç¼ö¸¦ ºñ±³Çϱâ À§ÇÑ µ¿ÀÛ, ¹®ÀÚ¸¦ ºñ±³Çϱâ À§ÇÑ µ¿ÀÛ, ¹®ÀÚ¿­À» ºñ±³ÇÏ´Â µ¿ÀÛ ¸ðµÎ ´Ù¸¨´Ï´Ù. ÀϹÝÀûÀ¸·Î ¿ì¸®°¡ ¥áÇüÀÇ °ª µÎ °³¸¦ ºñ±³ÇÏ°í ½ÍÀ» ¶§, ¥á-compareÀ» »ç¿ëÇÑ´Ù°í ÇսôÙ. ¥á´Â Çü Á¤º¸¸¦ ÀúÀåÇÏ´Â º¯¼öÀ̹ǷÎ, Çü º¯¼ö¶ó°í ÇÕ´Ï´Ù.

±×·¯³ª ºÒÇàÇÏ°Ôµµ Á¤ÀûÇü ½Ã½ºÅÛ¿¡¼­´Â ¸î°¡Áö ¹®Á¦°¡ ÀÖ½À´Ï´Ù. ¾î¶² Çü¿¡¼­ ¾î¶² µ¿ÀÛÀÌ Á¤ÀǵžßÇÒÁö¸¦ Çü °Ë»ç±â°¡ ¾ËÁö ¸øÇÕ´Ï´Ù. ÀÌ·± ¹®Á¦¸¦ Ç®±â À§ÇÑ ¸¹Àº ¹æ¹ýµéÀÌ Àִµ¥, (»ç½Ç º°·Î ¸¹Áö´Â ¾Ê½À´Ï´Ù.) ÇϽºÄÌ¿¡¼­ ÀÌ·± ¹®Á¦¸¦ ÇØ°áÇÏ´Â ¹æ½ÄÀº Çü Ŭ·¡½ºÀÔ´Ï´Ù.

4.3.2. equality Å×½ºÆ®


== ¶ó´Â ÇÔ¼ö(¶Ç´Â ¿¬»êÀÚ, ÇϽºÄÌ¿¡¼­´Â ¿¬»êÀÚ°¡ °ð ÇÔ¼öÀÓ.)°¡ µÎ °ªÀ» ºñ±³ÇÏ´Â °æ¿ì¸¦ »ìÆ캾½Ã´Ù. ¿ì¼± µÎ °ªÀÇ ÇüÀÌ °°¾Æ¾ß ÇÏ°í, (À̸¦ ¥á ¶ó°í ÇսôÙ.) ¹ÝȯÇüÀº Bool ÀÔ´Ï´Ù. == ¶ó´Â ÇÔ¼ö´Â ¸î¸î Çü¿¡¼­¸¸ Á¤ÀǵÅÀÖ½À´Ï´Ù. (¸ðµç Çü¿¡ Á¤ÀÇµÈ °ÍÀÌ ¾Æ´Õ´Ï´Ù.) ±×¸®°í == ÇÔ¼ö´Â Eq¶ó´Â Çü Ŭ·¡½º¿Í °áÇÕµÅÀÖ½À´Ï´Ù. `°áÇÕµÅÀÖ´Ù'´Â Àǹ̴Â, ¥á¶ó´Â ÇüÀÌ Eq Ŭ·¡½º¿¡ ¼ÓÇØÀÖ´Ù¸é == ÇÔ¼ö°¡ ¥áÇü¿¡ ´ëÇØ Á¤ÀǵÅÀÖ´Ù´Â °ÍÀ» ¶æÇÕ´Ï´Ù. À̶§, ¥á´Â Eq Ŭ·¡½ºÀÇ ÀνºÅϽº¶ó°í ÇÕ´Ï´Ù. ¿¹¸¦µé¾î Int´Â EqÀÇ ÀνºÅϽºÀÔ´Ï´Ù. ±×¸®°í ÇϽºÄÌ¿¡¼­´Â Çü Ŭ·¡½º¸¦ `Ŭ·¡½º'¶ó°í ºÎ¸£±âµµ ÇÕ´Ï´Ù.

4.3.3. Num Ŭ·¡½º


ÇϽºÄÌ¿¡¼­ == ¿Í °°ÀÌ ¿¬»êÀÚ¸¦ ¿À¹ö·ÎµùÇÒ »Ó¸¸ ¾Æ´Ï¶ó, ¼ýÀÚ »ó¼ö (1, 2, 3, ... µî) µéµµ ¿À¹ö·ÎµùÇÕ´Ï´Ù. ¼ýÀÚ 5¿Í °°Àº °æ¿ì´Â Num Ŭ·¡½º·Î Á¤ÀǵǾîÀÖ°í, Num Ŭ·¡½ºÀÇ ÀνºÅϽº¿¡´Â ±âº» ¼ýÀÚÇüÀÎ Int¿Í Double°¡ Á¤ÀǵǾîÀÖ½À´Ï´Ù. ±×·¯¹Ç·Î ¼ýÀÚ 5´Â ÄÄÆÄÀÏ·¯°¡ º¼¶§, Á¤¼öÇüÀ¸·Î º¼ ¼öµµ ÀÖ°í, ½Ç¼öÇüÀ¸·Î º¼ ¼öµµ ÀÖ°Ô µË´Ï´Ù.

4.3.4. Show Ŭ·¡½º


Show Ŭ·¡½ºÀÇ show ÇÔ¼ö¸¦ »ç¿ëÇÏ¸é ¹®ÀÚ¿­ÀÌ ¾Æ´Ñ °ÍÀ» ¹®ÀÚ¿­·Î º¯È¯ÇÒ ¼ö ÀÖ½À´Ï´Ù.
Prelude> show 5
"5"
Prelude> show 'a'
"'a'"
Prelude> show "Hello World"
"\"Hello World\""
¹®ÀÚ´Â ÀÛÀº µû¿ÈÇ¥·Î µÑ·¯½Î°í, ¹®ÀÚ¿­Àº Å« µû¿ÈÇ¥·Î µÑ·¯½Î°Ô µË´Ï´Ù. ¸¶Áö¸· ÁÙ¿¡ ¿ª½½·¡½¬°¡ Àִµ¥, ÀÌ´Â ´ëÈ­½Ä ȯ°æ¿¡¼­ Ư¼ö¹®ÀÚ¸¦ Ãâ·ÂÇϱâ À§ÇÑ °ÍÀÔ´Ï´Ù. ½ÇÁ¦ ¹®ÀÚ¿­Àº ¿ª½½·¡½¬¸¦ Æ÷ÇÔÇÏÁö ¾Ê½À´Ï´Ù.

4.4. ÇÔ¼öÀÇ Çü


1À̳ª 'c'°ú °°Àº °ªµéÀº ÇüÀ» °¡Áö°í ÀÖ´Ù°í Çß½À´Ï´Ù. ±×·±µ¥ ÇϽºÄÌ¿¡¼­´Â ÇÔ¼öµµ ¿ª½Ã ÇüÀ» °¡Áö°í ÀÖ½À´Ï´Ù.

4.4.1. ¶÷´Ù ´ë¼ö (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

4.4.2. °íÂ÷¿ø Çü


´Ù¸¥ °ªµé°ú´Â ´Ù¸£°Ô, ÇÔ¼öÀÇ ÇüÀ» ³ªÅ¸³»±â À§Çؼ­´Â °íÂ÷¿ø ÇüÀÌ ÇÊ¿äÇÕ´Ï´Ù. ´Ù½Ã Á¦°öÇÔ¼ö ¥ë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]

4.4.3. ¼º°¡½Å 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 ¶ó°í ¾µ ¼ö´Â ¾ø½À´Ï´Ù.

4.4.4. ¸í½ÃÀû Çü ¼±¾ð


¸í½ÃÀû Çü ¼±¾ðÀº ´ÙÀ½°ú °°Àº ¸é¿¡¼­ ÀåÁ¡ÀÌ ÀÖ½À´Ï´Ù. ¸íÈ®¼º, ¼Óµµ, µð¹ö±ë

Çü ¼±¾ðÀº ÇÔ¼öÀÇ Á¤ÀÇ¿Í´Â º°µµ·Î ÀÌ·ïÁý´Ï´Ù.
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

4.4.5. ÇÔ¼ö¸¦ ÀÎÀÚ·Î »ç¿ëÇϱâ


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 °¡ µË´Ï´Ù.

4.5. ÀÚ·áÇü

¼ø¼­½Ö°ú ¸®½ºÆ®µµ ÈǸ¢ÇÑ ÀڷᱸÁ¶ÀÌÁö¸¸, ÀڽŸ¸ÀÇ ÀڷᱸÁ¶¸¦ Á¤ÀÇÇÏ°í ½ÍÀ» ¶§µµ ÀÖ½À´Ï´Ù. ÀÌ·± ÀÚ·áÇüÀº data ±¸¹®À» ÀÌ¿ëÇÏ¿© Á¤ÀÇÇÒ ¼ö ÀÖ½À´Ï´Ù.

4.5.1. 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

4.5.2. ´ÙÁß »ý¼ºÀÚ


¸®½ºÆ®ÀÇ ¿ä¼Ò Áß¿¡¼­ ¾î¶² Á¶°ÇÀ» ¸¸Á·Çϴ ù¹ø° ¿ä¼Ò¸¦ ¹ÝȯÇÏ´Â ÇÔ¼ö¸¦ ÀÛ¼ºÇغ¾½Ã´Ù.
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ÇüÀÌ µÉ ¼ö ÀÖ½À´Ï´Ù.

4.5.3. Àç±ÍÀû ÀÚ·áÇü


´ÙÀ½°ú °°ÀÌ ¸®½ºÆ®¸¦ Á¤ÀÇÇϱâ À§Çؼ­ Àç±ÍÀû ÀÚ·áÇüÀ» »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù. Àç±ÍÀû ÀÚ·áÇüÀ̶õ, Á¤ÀÇ¿¡ ÀÚ±â ÀÚ½ÅÀ» Æ÷ÇÔÇÏ´Â °ÍÀ» ¸»ÇÕ´Ï´Ù.
data List a = Nil
            | Cons a (List a)
ÀÌ List´Â ÇϽºÄÌ¿¡ ³»ÀåµÈ ¸®½ºÆ®¿Í °ÅÀÇ °°½À´Ï´Ù. length¿¡ ÇØ´çµÇ´Â ÇÔ¼öµµ ¸¸µé¾îº¸¸é ´ÙÀ½°ú °°½À´Ï´Ù.
listLength Nil = 0
listLength (Cons x xs) = 1 + listLength xs

4.5.4. ÀÌÁø ³ª¹« (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

4.5.5. 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)

4.5.6. Unit Çü


ÇϽºÄÌÀÇ Prelude¿¡ Á¤ÀÇµÈ ÀÚ·áÇü Áß¿¡¼­ UnitÇüÀÌ ÀÖ½À´Ï´Ù.
data () = ()
UnitÇüÀÌ °¡Áú ¼ö ÀÖ´Â À¯ÀÏÇÑ °ªÀº () ÀÔ´Ï´Ù. ÀÌ´Â C³ª Java¿¡¼­ÀÇ void¿Í ±Ùº»ÀûÀ¸·Î °°½À´Ï´Ù. ÀÔÃâ·ÂÀ» ´Ù·ê ¶§ À¯¿ëÇÏ°Ô »ç¿ëµË´Ï´Ù.


5. ±âº» ÀÔÃâ·Â


±âº» ÀÔÃâ·ÂÇÔ¼ö¿¡´Â ´ÙÀ½°ú °°ÀÌ ÃÖ¼ÒÇÑ ³× Á¾·ù°¡ ÀÖ½À´Ï´Ù. ¼ø¼öÇÑ ÇÔ¼ö´Â ¾Æ´Ï¹Ç·Î `Çൿ'À̶ó°í ºÎ¸£°Ú½À´Ï´Ù.

  • È­¸é¿¡ ¹®ÀÚ¿­À» Ãâ·ÂÇÔ
  • Å°º¸µå·ÎºÎÅÍ ¹®ÀÚ¿­À» ÀԷ¹ÞÀ½
  • ÆÄÀÏÀбâ
  • ÆÄÀϾ²±â

ù¹ø° ÇൿÀº ¹®ÀÚ¿­ ÀÔ·ÂÀ» ¹Þ¾Æ¼­ ¹«¾ùÀΰ¡¸¦ ¹ÝȯÇؾßÇÕ´Ï´Ù. ±× ¹«¾ùÀΰ¡´Â ÀÏ´Ü () ¶ó°í ÇսôÙ. µÎ¹ø° ÇൿÀÇ ¹Ýȯ°ªÀº StringÀÌ°í ÀÎÀÚ´Â ÇÊ¿ä¾øÀ» °Íó·³ º¸ÀÔ´Ï´Ù. ¾Õ¿¡¼­µµ ¸»ÇßÁö¸¸ À̵éÀº ¼ø¼öÇÑ ÇÔ¼ö°¡ ¾Æ´Õ´Ï´Ù. µÎ¹ø° ÇൿÀº, ¸Å¹ø °°Àº StringÀ» ¹ÝȯÇÏÁö ¾Ê±â ¶§¹®ÀÔ´Ï´Ù. ù¹ø° ÇൿÀÌ ¼ø¼öÇÑ ÇÔ¼ö¶ó¸é, ÂüÁ¶Àû Åõ¸í¼º¿¡ ÀÇÇØ f _ = () ·Î ´ëüµÉ ¼ö ÀÖ¾î¾ß ÇÏÁö¸¸, ±×·¸Áö ¾Ê½À´Ï´Ù.

5.1. 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 ÀÎÀÚ¸¦ Àü´ÞÇؾßÇϹǷΠÀб⵵ ¾î·Æ°í ÄÚµùÇϱ⵵ ¹ø°Å·Ó½À´Ï´Ù.

5.2. Çൿ


ÀÔÃâ·ÂÀ» ´Ù·ç±â À§ÇØ 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 ¹®¿¡ ¾øÀ¸¹Ç·Î ¿¹¿Ü¸¦ ¹ß»ýÇÏ°í ÇÁ·Î±×·¥Àº Á¾·áµË´Ï´Ù.

5.3. ÀÔÃâ·Â ¶óÀ̺귯¸®


ÀÔÃâ·Â ¶óÀ̺귯¸®´Â 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)

5.4. ÆÄÀÏ Àбâ ÇÁ·Î±×·¥


À̹ø¿¡´Â ÆÄÀÏÀ» Àд ÇÁ·Î±×·¥À» ÀÛ¼ºÇغ¾½Ã´Ù. ¿À·ù󸮰¡ ¾ÈµÈ ¹Ì¿Ï¼º ÇÁ·Î±×·¥ÀÌÁö¸¸, ÀÔÃâ·Â ÇÔ¼ö¸¦ ¾î¶»°Ô »ç¿ëÇÏ´ÂÁö ¹è¿ï¼ö ÀÖ´Â ÁÁÀº ¿¹Á¦°¡ µÉ °ÍÀÔ´Ï´Ù. ´ÙÀ½ Äڵ带 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)


6. °í±Þ ±â´É

6.1. ¼½¼Ç°ú ÁßÀ§¿¬»êÀÚ


´ÙÀ½°ú °°ÀÌ 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]

6.2. Áö¿ª ¼±¾ð


éÅÍ 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°¡ ´õ ¸¹ÀÌ ¾²ÀÌ´Â °Í °°½À´Ï´Ù.

6.3. ÇÔ¼öÀÇ ºÎºÐÀû¿ë


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

6.4. ÆÐÅÏ ¸ÅĪ


éÅÍ 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    -- À߸øµÈ ÇÔ¼öÁ¤ÀÇ

6.5. °¡µå


ÆÐÅÏ ¸ÅĪ°ú ºñ½ÁÇÏ°Ô, ÇÔ¼öÀÇ Á¤ÀÇ¿¡ °¡µå¸¦ »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù. ÇÔ¼öÀÇ ÀÎÀÚ µÚ, µîÈ£ ºÎÈ£ÀÇ ¾Õ¿¡¼­ ¾µ ¼ö ÀÖ½À´Ï´Ù. °¡µå´Â | ¹®ÀÚ¸¦ ¾Õ¿¡ ºÙÀÓÀ¸·Î½á ³ªÅ¸³À´Ï´Ù. ±×·³ ´ÙÀ½ ¿¹¸¦ »ìÆ캾½Ã´Ù.
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

6.6. ÀνºÅϽº ¼±¾ð


¾î¶² ÇüÀ» Çü Ŭ·¡½ºÀÇ ÀνºÅϽº·Î ¸¸µé±â À§Çؼ­´Â, ÀνºÅϽº ¼±¾ðÀÌ ÇÊ¿äÇÕ´Ï´Ù.

´ë´Ù¼öÀÇ Å¬·¡½º¿¡´Â "ÃÖ¼ÒÇÑÀÇ ¿ÏÀüÇÑ Á¤ÀÇ"°¡ Á¦°øµË´Ï´Ù. ¸»±×´ë·Î Ŭ·¡½ºÀÇ Á¤ÀÇ¿¡ ÇÊ¿äÇÑ ÃÖ¼ÒÇÑÀÇ ±¸ÇöµÇ¾ßÇÒ ÇÔ¼öµéÀ» ÀǹÌÇÕ´Ï´Ù.

6.6.1. 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¶ó´Â Å°¿öµå°¡ ÇÊ¿äÇÕ´Ï´Ù.

6.6.2. 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

6.6.3. ±× ¹ÛÀÇ Áß¿äÇÑ Å¬·¡½º


¸ÕÀú 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ÀÌ Á¤ÀÇµÅ¾ß ÇÕ´Ï´Ù.

6.6.4. Ŭ·¡½º ¹®¸Æ


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 Ŭ·¡½ºÀÇ ÀνºÅϽº°¡ µË´Ï´Ù.

6.6.5. Ŭ·¡½ºÀÇ ÆÄ»ý (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.

6.7. ÀÚ·áÇü


´ÙÀ½°ú °°Àº ÀÚ·áÇüÀ» Á¤ÀÇÇغ¾½Ã´Ù.
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 }
¹°·Ð, µÎ¹ø° ¹æ¹ýÀÌ ÈξÀ ÀÌÇØÇϱⰡ ½±½À´Ï´Ù.

6.8. ¸®½ºÆ®


¼öÇп¡¼­ ÁýÇÕÀ» Á¤ÀÇÇÒ ¶§, ´ÙÀ½°ú °°ÀÌ ¾²±âµµ ÇÕ´Ï´Ù.

{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)]

6.9. ¹è¿­


¸®½ºÆ®´Â ¿©·¯ ¸ð·Î ÁÁÀº Á¡ÀÌ ÀÖÁö¸¸, ÀÓÀÇÁ¢±Ù(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)]

6.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

7. ºÎ·Ï

7.1. ºÎ·Ï 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


7.2. ºÎ·Ï 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

7.3. ºÎ·Ï 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

ID
Password
Join
Let not the sands of time get in your lunch.


sponsored by andamiro
sponsored by cdnetworks
sponsored by HP

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2009-07-05 18:48:18
Processing time 0.0350 sec