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

Yet Another Haskell Tutorial ¿ä¾àº»

Contents

1 ¹®¼­Á¤º¸
1.1 ¶óÀ̼¾½º ¹× ÀúÀÛ±Ç
1.2 Ãâó
1.3 ¾Ë¸²
2 ½ÃÀÛÇϸ鼭 ...
2.1 ÀÎÅÍÇÁ¸®ÅÍ¿Í ÄÄÆÄÀÏ·¯
2.2 Ç¥±â¹ý
3 ÇϽºÄÌ ¾ð¾îÀÇ ±âÃÊ
3.1 »ê¼ú¿¬»êÀÚ
3.2 Æ©ÇÃ
3.3 ¸®½ºÆ®
3.3.1 ¹®ÀÚ¿­
3.3.2 ±âº»ÀûÀÎ ¸®½ºÆ® ÇÔ¼ö
3.4 ¼Ò½ºÄÚµå ÆÄÀÏ
3.5 ÇÔ¼ö
3.5.1 let ¹ÙÀεù
3.5.2 ÁßÀ§ ¿¬»êÀÚ
3.6 ÁÖ¼®
3.7 Àç±Í
3.8 ÀÎÅÍ·¢Æ¼ºê
4 ŸÀÔ
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 Action
5.3 IO ¶óÀ̺귯¸®
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 ÆÄ»ýµÈ Ŭ·¡½º
6.7 µ¥ÀÌÅÍ Å¸ÀÔ
6.8 ¸®½ºÆ®
6.9 ¹è¿­
6.10 Finate Map
7 ºÎ·Ï
7.1 ºÎ·Ï D.
7.2 ºÎ·Ï E. Prelude.hs ÀÇ ³»ÀåÇÔ¼öµé
7.3 ºÎ·Ï F. I/O °ü·Ã µ¥ÀÌÅÍŸÀÔ ¹× ÇÔ¼ö

1 ¹®¼­Á¤º¸

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


º» ¹®¼­´Â 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. º» ¹®¼­´Â GNU Free Document License ·Î ¹èÆ÷µË´Ï´Ù. Yet Another Haskell Tutorial ÀÇ ¿øÀúÀÛÀÚ´Â Hal Daume III À̸ç, ¿ø¹®ÀÇ ¹ø¿ª/¿ä¾à/¼öÁ¤/Ãß°¡µÈ ºÎºÐÀÇ ÀúÀÛ±ÇÀº redneval@kldp.org ¿¡ ÀÖ½À´Ï´Ù.


1.2 Ãâó

¿À¸®Áö³Î ¿µ¹®¹öÀüÀº ´ÙÀ½ ÁÖ¼Ò¿¡¼­ ¹ÞÀ» ¼ö ÀÖ½À´Ï´Ù.


¿Â¶óÀÎ ¹öÀüÀº ´ÙÀ½ ÁÖ¼Ò¿¡¼­ º¼ ¼ö ÀÖ½À´Ï´Ù.


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


ÇϽºÄÌ98ÀÇ ¶óÀ̺귯¸®


GHCÀÇ ¶óÀ̺귯¸®


1.3 ¾Ë¸²


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

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

2 ½ÃÀÛÇϸ鼭 ...

2.1 ÀÎÅÍÇÁ¸®ÅÍ¿Í ÄÄÆÄÀÏ·¯

ÇϽºÄÌ Äڵ带 ½ÇÇàÇϱâ À§ÇÑ Àß ¾Ë·ÁÁø ÇÁ·Î±×·¥ÀÌ µÎ °¡Áö°¡ ÀÖ½À´Ï´Ù. ù¹øÂ°·Î Hugs ´Â http://haskell.org/hugs ¿¡¼­ ¹ÞÀ» ¼ö ÀÖÀ¸¸ç, ÀÎÅÍ·¢Æ¼ºê ¸ðµå·Î¸¸ µ¿ÀÛÇÕ´Ï´Ù. GHC ´Â http://haskell.org/ghc ¿¡¼­ ¹ÞÀ» ¼ö ÀÖÀ¸¸ç, ÀÎÅÍ·¢Æ¼ºê ¸ðµå·Îµµ µ¿ÀÛÇϰí, Äڵ带 ÄÄÆÄÀÏ ÇÒ ¼öµµ ÀÖ½À´Ï´Ù. GHC ´Â »ç½Ç»ó(de facto) Ç¥Áر¸ÇöÀ¸·Î ¿©°ÜÁý´Ï´Ù.

ÆíÁý±â´Â 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;
}
±×·¯³ª ÀÌ´Â ¹«ÇÑ·çÇÁ¸¦ µ¹°Ô µÉ °ÍÀ̰í ÇÁ·Î±×·¥Àº Á¾·áµÇÁö ¾ÊÀ» °ÍÀÔ´Ï´Ù. ÀÌ·± ¸é¿¡¼­ ¸í·ÉÇüÀÇ ¾ð¾î´Â `¾ö¹ÐÇÏ´Ù'°í Çϰí, ÇÔ¼öÇü ¾ð¾î´Â `°ÔÀ¸¸£´Ù'°í ÇÕ´Ï´Ù. ¶ÇÇÑ, ¾ö¹ÐÇÑ ¾ð¾î´Â "°ª¿¡ ÀÇÇÑ È£Ãâ"À̶ó°í Çϰí, °ÔÀ¸¸¥ ¾ð¾î´Â "À̸§¿¡ ÀÇÇÑ È£Ãâ" À̶ó°í ÇÕ´Ï´Ù. À§ÀÇ ÀÇ»çÄڵ忡¼­ 5¹øÂ° ÁÙ¿¡¼­ makeList ½ÇÇàµÉ ¶§ ±× `°ª'À» °¡Á®¿À°Ô µÇ¹Ç·Î, ÀÌ·Î ÀÎÇØ ¹«ÇÑ·çÇÁ¿¡ ºüÁö°Ô µË´Ï´Ù. ÇϽºÄÌ¿¡¼­´Â ´ÙÀ½°ú °°ÀÌ ÀÛ¼ºÇÒ ¼ö ÀÖ½À´Ï´Ù.
makeList = 1 : makeList
ÀÌ ÄÚµå´Â ´ÙÀ½°ú °°ÀÌ ÀÐÀ» ¼ö ÀÖ½À´Ï´Ù. Áº¯ : ¿ì¸®´Â makeList ¸¦ Á¤ÀÇÇϰí ÀÖ´Ù. ¿ìº¯ : makeList ÀÇ Á¤ÀÇ´Â 1 : makeList ÀÌ´Ù. Âü°í·Î, ÇϽºÄÌ¿¡¼­ ÄݷכּêÀÚ´Â ¸®½ºÆ®¸¦ ¸¸µå´Âµ¥ »ç¿ëµË´Ï´Ù. (µÚ¿¡¼­ ÀÚ¼¼È÷ ¼³¸íÇϰڽÀ´Ï´Ù.) ¿ìº¯À» »ìÆìº¸¸é, makeList Àº 1 °ú makeList ·Î ÀÌ·ïÁø °ªÀ̶ó´Â °ÍÀ» ¾Ë·ÁÁÝ´Ï´Ù. ±×·±µ¥ ÇϽºÄÌÀº °ÔÀ¸¸£¹Ç·Î, (¶Ç´Â "À̸§¿¡ ÀÇÇÑ È£Ãâ") ½ÇÁ¦·Î´Â ÀÌ ½ÃÁ¡¿¡¼­ makeList ÀÇ °ªÀ» °è»êÇÏÁö ¾Ê½À´Ï´Ù. À̸¦ °è»êÇÏ´Â ½ÃÁ¡Àº È­¸é¿¡ Ãâ·ÂÇϰųª ¸®½ºÆ®ÀÇ ÇÕÀ» °è»êÇÏ´Â µî, °á°ú°ªÀÌ ÇÊ¿äÇÑ ½ÃÁ¡¿¡¸¸ ÀÌ·ïÁö°Ô µË´Ï´Ù. ±×·¯¹Ç·Î, ¿¹¸¦ µé¸é makeList ÀÇ Ã¹ 10°³ ¿ø¼Ò¸¦ °¡Áø »õ·Î¿î ¸®½ºÆ®¸¦ Á¤ÀÇÇÑ´Ù¸é, makeList ÀÇ ±æÀ̰¡ ¹«ÇÑÀ̶ó°í ÇØµµ »ó°ü¾ø°Ô µË´Ï´Ù. ±× °æ¿ì¿¡´Â makeList ÀÇ Ã¹ 10°³ ¿ø¼Ò¸¸ °è»êµË´Ï´Ù. À̰ÍÀÌ ¹Ù·Î `°ÔÀ¸¸§' ÀÔ´Ï´Ù.

µÎ¹øÂ°·Î ÇϽºÄÌÀº ´ë¼Ò¹®ÀÚ¸¦ ±¸ºÐÇÕ´Ï´Ù. ´Ù¸¥ ¾ð¾îµéÀÌ ´ë¼Ò¹®ÀÚ¸¦ ±¸ºÐÇÏ´Â °Í°ú´Â ¾à°£ ´Ù¸¥ Ư¡ÀÌ ÀÖ½À´Ï´Ù. ÇϽºÄÌ¿¡¼­´Â °ª, ¹®ÀÚ¿­, ¹®ÀÚ, ÇÔ¼ö, ŸÀÔ µîÀÌ Àִµ¥, °ª°ú ÇÔ¼ö´Â Ç×»ó ¼Ò¹®ÀÚ·Î ½ÃÀÛÇØ¾ßÇÕ´Ï´Ù. (¿©±â¼­ ¼ýÀÚ´Â 1, 2, 3, ... , ¹®ÀÚ´Â 'a', 'b', 'c' , ¹®ÀÚ¿­Àº "abc", "hello" °ú °°ÀÌ Ç¥ÇöÇÕ´Ï´Ù.) ÇÔ¼öÇü ¾ð¾î´ä°Ô, ÇϽºÄÌÀº ºÎ¼öÈ¿°ú¸¦ ÃÖ´ëÇÑ ÇÇÇÕ´Ï´Ù. ºÎ¼öÈ¿°ú´Â ÇÔ¼öÀÇ Ãâ·Â°ú´Â °ü·ÃÀÌ ¾ø´Â ¹«¾ùÀΰ¡¸¦ ÀǹÌÇÕ´Ï´Ù. C ¿Í ÀÚ¹Ù¿¡¼­´Â ÇÔ¼ö¿¡¼­ Àü¿ªº¯¼ö¸¦ ¼öÁ¤ÇÒ ¼ö Àִµ¥, Àü¿ªº¯¼ö´Â ÇÔ¼öÀÇ Ãâ·Â°ú´Â ¹«°üÇϹǷΠÀÌ´Â ºÎ¼öÈ¿°úÀÔ´Ï´Ù. °Ô´Ù°¡, ½Ã½ºÅÛÀÇ »óŸ¦ º¯È­½ÃŰ´Â °ÍÀº ºÎ¼öÈ¿°úÀÔ´Ï´Ù. È­¸é¿¡ ¹«¾ùÀΰ¡¸¦ Ãâ·ÂÇϰųª ÇÏ´Â °Íµµ ºÎ¼öÈ¿°úÀÔ´Ï´Ù. ºÎ¼öÈ¿°ú°¡ ¾ø´Â ÇÔ¼ö¸¦ `¼ø¼öÇÑ' ÇÔ¼ö¶ó°í ÇÕ´Ï´Ù. ÇÔ¼ö°¡ ¼ø¼öÇÑÁö ¾Ë¾Æ º¼¼ö ÀÖ´Â °¡Àå ½¬¿î Å×½ºÆ®´Â ´ÙÀ½°ú °°Àº Áú¹®ÀÔ´Ï´Ù. "°°Àº ÀÎÀÚ°¡ ÁÖ¾îÁ³À» ¶§ ÇÔ¼ö°¡ Ç×»ó °°Àº Ãâ·ÂÀ» ¹ß»ý½Ã۴°¡?" ±×·¯¹Ç·Î C ³ª ÀÚ¹Ù¿¡¼­ Çß´ø °Í°ú´Â »ý°¢À» ´Ù¸£°Ô ÇØ¾ßÇÕ´Ï´Ù. ¸¸¾à x ¶ó´Â °ªÀÌ ÀÖ´Ù¸é, À̸¦ ·¹Áö½ºÅͳª ¸Þ¸ð¸®°°Àº °ÍÀ¸·Î »ý°¢Çؼ­´Â ¾ÈµË´Ï´Ù. x ´Â ´ÜÁö À̸§ÀÏ»ÓÀÔ´Ï´Ù. ¸¶Ä¡ ÀÌ Ã¥ÀÇ ÀúÀÚÀÇ À̸§ÀÌ "Hal" ÀÎ °Íó·³ º¯ÇÏÁö ¾Ê´Â ¹«¾ð°¡ÀÔ´Ï´Ù. ±×·¯¹Ç·Î ´ÙÀ½ C ÄÚµå¿Í °°ÀÌ ³ªÅ¸³»´Â °ÍÀº ÇϽºÄÌ¿¡¼­´Â ºÒ°¡´ÉÇÕ´Ï´Ù.
int x = 5;
x = x + 1;
x = x + 1 ¿Í °°ÀÌ x °¡ ¿¹Àü¿¡ °¡Á³´ø °ªÀ» ¾ø¾Ö°í »õ·Î¿î °ªÀ¸·Î ´ëüÇÏ´Â °ÍÀ» ÆÄ±«Àû °»½ÅÀ̶ó°í ºÎ¸¨´Ï´Ù. ÇϽºÄÌ¿¡¼­´Â ÆÄ±«Àû °»½Å ÀÌ ¾ø½À´Ï´Ù. ÇϽºÄÌ¿¡¼­´Â ÆÄ±«Àû °»½ÅÀ» Çã¿ëÇÏÁö ¾Ê¾Ò±â ¶§¹®¿¡, Äڵ带 ÀÌÇØÇϱⰡ ¸Å¿ì ½±½À´Ï´Ù. (Á¤¸»?) ¿ì¸®°¡ 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 °¡ Á¤¼öÇüó·³ º¸À̴µ¥ ¿Ö °á°ú°ªÀÌ ½Ç¼öÇüÀ¸·Î ³ª¿À´ÂÁö ÀǾÆÇØÇÒ °ÍÀÔ´Ï´Ù. ÀÌ·± ÇϽºÄÌÀÇ type class´Â µÚ¿¡¼­ ´Ù·ç°Ú½À´Ï´Ù.)

3.2 Æ©ÇÃ


ÇϳªÀÇ °ª ¸»°íµµ ¿©·¯ °³ÀÇ °ªÀ» Æ©Ç÷ΠǥÇöÇÒ ¼ö ÀÖ½À´Ï´Ù. ÀÌ´Â ¼Ò°ýÈ£·Î µÑ·¯½Î°í ½°Ç¥·Î ±¸ºÐÇÏ¸é µË´Ï´Ù.
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 ¿¡¼­ÀÇ ¹è¿­ÀÌ ¾Æ´Ñ, ¸µÅ©µå ¸®½ºÆ®¿¡ ´õ °¡±õ½À´Ï´Ù.

Æ©Çðú ¸®½ºÆ®ÀÇ ¶Ç ´Ù¸¥ Á¡Àº, ¸®½ºÆ®¿¡´Â °°Àº Á¾·ùÀÇ ¿ä¼Òµé¸¸ µé¾î°¥ ¼ö ÀÖ´Ù´Â °ÍÀÔ´Ï´Ù. Á¤¼ö¿Í ¹®ÀÚ¿­À» ÇϳªÀÇ ¸®½ºÆ®¿¡ ³ÖÀ¸·Á°í ÇÏ¸é ¿¡·¯¸Þ½ÃÁö¸¦ Ãâ·ÂÇÕ´Ï´Ù. ¶ÇÇÑ ¸®½ºÆ® ³»¿¡´Â ¸®½ºÆ®³ª Æ©ÇÃÀÌ ¿Ã ¼ö ÀÖ½À´Ï´Ù.
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> length (tail [1,2,3,4,10])
4
´Ù½Ã Çѹø ¸»ÇÏÁö¸¸ ÇϽºÄÌÀº ¹«ÇÑ ±æÀÌÀÇ ¸®½ºÆ®¸¦ ´Ù·ê ¼öµµ ÀÖ½À´Ï´Ù.
Prelude> let ones=1:ones
Prelude> take 5 ones
[1,1,1,1,1]
¹°·Ð ´ÙÀ½°ú °°ÀÌ ¹«ÇÑ ±æÀÌÀÇ ¸®½ºÆ®¸¦ Ãâ·ÂÇÏ·ÁÇÑ´Ù¸é ¹«ÇÑ·çÇÁ¸¦ µ¹°Ô µË´Ï´Ù.
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 ¶ó´Â ³»ÀåÇÔ¼ö´Â ¹®ÀÚ ÀÔ·ÂÀ» ¹Þ¾Æ¼­ ´ë¹®ÀÚ·Î ¹Ù²ãÁִµ¥, À̸¦ ÀÌ¿ëÇÏ¸é ¹®ÀÚ¿­ Àüü¸¦ ´ë¹®ÀÚ·Î ¹Ù²Ü ¼ö ÀÖ½À´Ï´Ù. (´Ù¸¸, Hugs ¿¡¼­´Â 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 ´Â ¸ðµâÀ̸§Àε¥, ÀÌ´Â ÆÄÀÏÀ̸§°ú °°¾Æ¾ßÇÕ´Ï´Ù. ÆÄÀÏÀ» ÀúÀåÇßÀ¸¸é ´ÙÀ½°ú °°ÀÌ ÀÎÅÍÇÁ¸®ÅÍ·Î ºÒ·¯¿Ã ¼ö ÀÖ½À´Ï´Ù.
% 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 ÀÇ Å°¿öµå µÚ¿¡´Â { °¡ »ðÀԵȴÙ. ±× ´ÙÀ½ ¸í·É¹®ÀÌ ´ÙÀ½ ÁÙ¿¡¿À¸é, µé¿©¾²±â ±íÀÌ´Â ´õ ±í¾îÁ®¾ßÇÑ´Ù. ´ÙÀ½ ¸í·É¹®ÀÌ °°Àº ÁÙ¿¡ ¿Â´Ù¸é ±× ½ÃÀÛÀ§Ä¡°¡ ±â¾ïµÈ´Ù.
  • (2) (1)ÀÇ °æ¿ì°¡ ¾Æ´Ï¸é¼­ µé¿©¾²±â°¡ ±í¾îÁö¸é ÀÌÀü ¸í·É¹®ÀÌ °è¼Ó À̾îÁö´Â °ÍÀ» ³ªÅ¸³½´Ù.
  • (3) µé¿©¾²±â°¡ °°À¸¸é ÀÌÀü ¸í·É¹®ÀÌ ³¡³ª°í »õ·Î¿î ¸í·É¹®ÀÌ ½ÃÀÛµÊÀ» ³ªÅ¸³½´Ù. ÀÌÀü ¸í·É¹® ³¡¿¡´Â ; °¡ ºÙ´Â´Ù.
  • (4) ´ÙÀ½ ÁÙÀÌ µé¿©¾²±âÀÇ ±íÀ̰¡ ¾è¾ÆÁö¸é } °¡ »ðÀԵȴÙ.

±ÔÄ¢ (1) À» ÀÌ¿ëÇÏ¸é ´ÙÀ½°ú °°ÀÌ ¾µ ¼öµµ ÀÖ½À´Ï´Ù.
f x = 
  case x of 0 -> 1
            1 -> 5
            2 -> 2
            _ -> -1
±ÔÄ¢ (2) ¸¦ ÀÌ¿ëÇÏ¿© ´ÙÀ½°ú °°ÀÌ ¹Ù²ã¾µ ¼öµµ ÀÖ½À´Ï´Ù.
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 }
ÀÌ °æ¿ì¿¡´Â µé¿©¾²±â´Â ¹«½ÃµË´Ï´Ù. ±×·¯¹Ç·Î ´ÙÀ½°ú °°Àº Äڵ尡 °¡´ÉÇÕ´Ï´Ù.
fx=
   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 ¹ÙÀεù


ÀÌÂ÷ÇÔ¼öÀÇ ±ÙÀ» ±¸Çϱâ À§ÇÑ ÇÁ·Î±×·¥À» ÀÛ¼ºÇغ¾½Ã´Ù. 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 ÀÎÅÍ·¢Æ¼ºê


ÀÔÃâ·ÂÀ» ó¸®Çϱâ À§Çؼ­ ¸ð³ªµå¶ó´Â °³³äÀÌ »ç¿ëµÇÁö¸¸ À̴ éÅÍ 5¿¡¼­ ´Ù·ç±â·Î ÇϰڽÀ´Ï´Ù. ¿©±â¼­´Â ÀÎÅÍ·¢Æ¼ºêÇÑ ÇÔ¼ö¸¦ ¸¸µé±â À§Çؼ­ »ç¿ëµÇ´Â °ÍÀÌ 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 Àº ¼ø¼öÇÑ ÇÔ¼ö°¡ ¾Æ´Ï°í ºÎ¼öÈ¿°ú°¡ ÀÖ´Â action À̱⠶§¹®¿¡ <- ¿¬»êÀÚ°¡ »ç¿ëµÇ¾ßÇÕ´Ï´Ù. ±×·¡¼­ "getLine À̶ó´Â action À» ¼öÇàÇÏ°í ±× °á°ú¸¦ name ¿¡ ÀúÀåÇ϶ó" ´Â ¶æÀÌ µË´Ï´Ù. ¿©±â¼­, action Àº ºÎ¼öÈ¿°ú¸¦ °¡Áö´Â ¸í·É¹®À̶ó°í »ý°¢ÇÏ°í ³Ñ¾î°©½Ã´Ù.

±×·¯¸é ´ÙÀ½°ú °°ÀÌ ¼ýÀÚ¸ÂÃ߱⠰ÔÀÓÀÎ "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 ´Â ¸®½ºÆ®¸¦ ¹ÝȯÇÏ´Â action À̱⠶§¹®¿¡ ¿¡·¯°¡ ¹ß»ýÇÕ´Ï´Ù. ±×·¯¹Ç·Î ´ÙÀ½°ú °°ÀÌ ¸í½ÃÀûÀ¸·Î <- ¸¦ »ç¿ëÇÏ¿© ÀÛ¼ºÇؾßÇÕ´Ï´Ù.
askForWords = do
  putStrLn "Please enter a word:"
  word <- getLine
  if word == ""
    then return []
    else do
      rest <- askForWords
      return (word : rest)

4 ŸÀÔ


ÇϽºÄÌÀº Á¤Àû ŸÀÔÀÔ´Ï´Ù. À̰ÍÀÇ Àǹ̴Â, ÇϽºÄÌ¿¡´Â ¸ðµç Ç¥Çö¿¡´Â ŸÀÔÀÌ ¹èÁ¤µÈ´Ù´Â °ÍÀÔ´Ï´Ù. ¿¹¸¦ µé¸é, '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
Prelude> :t 5 :: Double
5 :: Double
5¶ó´Â °ªÀº Á¤¼öÇü ¶Ç´Â ½Ç¼öÇüÀ¸·Î ÁöÁ¤ÇÒ ¼ö ÀÖ´Ù´Â °ÍÀ» ¹ß°ßÇÒ ¼ö ÀÖ½À´Ï´Ù. ±×·³, ÇüÀ» ÁöÁ¤ÇÏÁö ¾ÊÀ¸¸é ¾î¶² °á°ú°¡ ³ª¿À´ÂÁö »ìÆìº¾½Ã´Ù.
Prelude> :t 5
5 :: Num a => a
ÀÌ¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ ³»¿ëÀº 4.3 ¿¡¼­ »ìÆìº¸±â·Î ÇÏ°í ³Ñ¾î°©½Ã´Ù.

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 ÇÔ¼ö´Â ´ÙÇüÀû ŸÀÔ Î±; ¡æ α; ¸¦ »ç¿ëÇϱ⠶§¹®ÀÔ´Ï´Ù. ÀÌ·Î ÀÎÇØ ÀÓÀÇÀÇ Å¸ÀÔÀ» ´Ù·ê ¼ö ÀÖ½À´Ï´Ù.
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 ¶ó´Â ŸÀÔ Å¬·¡½º¿Í °áÇÕÇÕ´Ï´Ù. ¸¸¾à, ¥á °¡ ŸÀÔ Å¬·¡½º¿¡ Á¤ÀǵÅÀÖ´Ù¸é, ¥á ´Â ±× ŸÀÔŬ·¡½ºÀÇ ÀνºÅϽº¶ó°í ¸»ÇÒ ¼ö ÀÖ½À´Ï´Ù. ¿¹¸¦µé¸é, Int ´Â Eq ÀÇ ÀνºÅϽºÀÔ´Ï´Ù. ÀÌ·¸°Ô ÇÔ¼ö¸¦ Á¤ÀÇÇÏ¸é ¸ðµç ŸÀÔ¿¡ ´ëÇØ Á¤ÀÇÇÒ Çʿ䰡 ¾ø½À´Ï´Ù.

4.3.3 Num Ŭ·¡½º


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

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

¥ë ´Â ¶÷´Ù Ãß»óÀ̶ó°í ºÎ¸£¸ç, ¶÷´Ù´Â ÇϳªÀÇ ÀÎÀÚ¸¸À» °¡Áú ¼ö ÀÖ½À´Ï´Ù. ±×·¯¹Ç·Î µÎ°³ÀÇ ÀÎÀÚ¸¦ ¹Þ´Â ÇÔ¼ö´Â ´ÙÀ½°ú °°½À´Ï´Ù. ¥ë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 ŸÀÔ


IO ÇÔ¼öµéÀº ¾î¶² ŸÀÔÀ» °¡Á³´ÂÁö »ìÆìº¾½Ã´Ù.
Prelude> :t putStrLn
putStrLn :: String -> IO ()
Prelude> :t readFile
readFile :: FilePath -> IO String

»ç½Ç À̵éÀº ÇÔ¼ö°¡ ¾Æ´Ï¶ó (ºÎ¼öÈ¿°ú°¡ ÀÖ´Â) action ÀÔ´Ï´Ù. ÀÌ·± Â÷ÀÌ·Î ÀÎÇØ action°ú ÇÔ¼ö¸¦ °áÇÕÇÒ ¼ö ÀÖ´Â ¹æ¹ýÀº do ±¸¹® »ÓÀÔ´Ï´Ù. ¸¸¾à ¾î¶² ÆÄÀϷκÎÅÍ ¹®ÀÚ¿­À» ¹Þ¾Æ¼­, ¹®ÀÚ¿­À» ¼ýÀÚ¸¦ ¹Ù²Ù´Â ÇÔ¼ö f ¸¦ ÀÌ¿ëÇÏ¿© ¼ýÀÚ·Î ¹Ù²Ù°í, À̸¦ È­¸é¿¡ Ãâ·ÂÇϱâ À§Çؼ­´Â ´ÙÀ½°ú °°ÀÌ ÇØ¾ßÇÕ´Ï´Ù.
main = do
  s <- readFile "somefile"
  let i = f s
  putStrLn (show i)
¿©±â¼­ <- ±¸¹®Àº IO action À¸·ÎºÎÅÍ ¹®ÀÚ¿­À» ¹Þ´Â´Ù´Â ¶æÀ̸ç, ±× ÀÌÈÄ¿¡ f ÇÔ¼ö¸¦ »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù. ¹Ý¸é¿¡ f °¡ action ÀÌ ¾Æ´Ñ ÇÔ¼öÀ̱⠶§¹®¿¡ 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À̶ó´Â Ç¥ÁØÇÔ¼ö´Â Fractional Ŭ·¡½ºÀÇ Å¸ÀÔÀ» Real Ŭ·¡½ºÀÇ Å¸ÀÔÀ¸·Î ¹Ù²ãÁÝ´Ï´Ù.
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] °¡ µË´Ï´Ù. map ÇÔ¼öÀÇ Å¸ÀÔÀº (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
¸¸¾à À§¿Í °°ÀÌ ÀÛ¼ºÇß´Ù¸é, Á¶°ÇÀ» ¸¸Á·ÇÏ´Â ¿ä¼Ò°¡ Çϳªµµ ¾ø´Â °æ¿ì´Â ¿¡·¯°¡ ¹ß»ýµË´Ï´Ù. ±×·¯¹Ç·Î Á¶°ÇÀ» ¸¸Á·ÇÏ´Â ¿ä¼Ò°¡ ¾ø´Â °æ¿ì´Â ¿¹¿Ü󸮸¦ ÇØ¾ßÇÕ´Ï´Ù. 10.1 ¿¡¼­ ¹è¿ï ¿¡·¯¹ß»ýÀ» »ç¿ëÇÒ ¼öµµ ÀÖÁö¸¸, ±×·¸°Ô ÇÏ¸é ¿¡·¯¸¦ ´Ù·ç±â°¡ ¾î·Æ´Ù´Â ¹®Á¦Á¡ÀÌ ÀÖ½À´Ï´Ù. ÇϽºÄÌÀº Á¤ÀûŸÀÔ ½Ã½ºÅÛÀ̱⠶§¹®¿¡, ¾î¶² ÇÔ¼ö°¡ ¹ÝȯÇÏ´Â °ªÀº ÇϳªÀÇ Å¸ÀÔÀ» °¡Áö°í ÀÖ¾î¾ß ÇÕ´Ï´Ù. ±×·¯¹Ç·Î ´ÙÀ½°ú °°ÀÌ »õ·Î¿î µ¥ÀÌÅÍŸÀÔÀÌ ÇÊ¿äÇÕ´Ï´Ù. ¿©±â¼­ 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 ŸÀÔ


¸¶Áö¸·À¸·Î À¯¿ëÇÑ Å¸ÀÔÀº ¹Ù·Î Unit ŸÀÔÀÔ´Ï´Ù.
data () = ()
ÀÌ Å¸ÀÔÀÌ °¡Áú ¼ö ÀÖ´Â À¯ÀÏÇÑ °ªÀº () ÀÔ´Ï´Ù. ÀÌ´Â C ³ª Java ¿¡¼­ÀÇ void ¿Í ±Ùº»ÀûÀ¸·Î °°½À´Ï´Ù. éÅÍ 5 ¿¡¼­ IO ¸¦ ´Ù·ê ¶§ À¯¿ëÇÏ°Ô »ç¿ëµË´Ï´Ù.


5 ±âº» ÀÔÃâ·Â


±âº» ÀÔÃâ·ÂÇÔ¼ö¿¡´Â ´ÙÀ½°ú °°ÀÌ ÃÖ¼ÒÇÑ ³× Á¾·ù°¡ ÀÖ½À´Ï´Ù. ¼ø¼öÇÑ ÇÔ¼ö´Â ¾Æ´Ï¹Ç·Î ÀÏ´Ü operation À̶ó°í ÇϰڽÀ´Ï´Ù.

  • È­¸é¿¡ ¹®ÀÚ¿­À» Ãâ·ÂÇÔ
  • Űº¸µå·ÎºÎÅÍ ¹®ÀÚ¿­À» ÀԷ¹ÞÀ½
  • ÆÄÀÏ¿¡ µ¥ÀÌÅ͸¦ ¾¸
  • ÆÄÀϷκÎÅÍ µ¥ÀÌÅ͸¦ Àоî¿È

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

5.1 RealWorld


À̵é operationÀÌ ÇÔ¼ö°¡ ¾Æ´Ñ ÀÌÀ¯´Â ½Ç¼¼°è¿Í »óÈ£ÀÛ¿ëÇϱ⠶§¹®ÀÔ´Ï´Ù. RealWorld ¶ó´Â ŸÀÔÀÌ ÀÖ´Ù°í »ý°¢Çϰí, ´ÙÀ½°ú °°ÀÌ Á¤ÀÇÇØº¾½Ã´Ù.
printAString :: RealWorld -> String -> RealWorld
readAString :: RealWorld -> (RealWorld, String)
ÀÌ·¸°Ô RealWorld ¸¦ ÇϳªÀÇ °ªÀ¸·Î »ý°¢Çϸé, 3.8 ¿¡¼­ ´Ù·ð´ø Name.hs ¸¦ ´ÙÀ½°ú °°ÀÌ ¹Ù²ã¼­ »ý°¢ÇÒ ¼ö ÀÖ½À´Ï´Ù. RealWorld ÀÇ »óŸ¦ main ÇÔ¼öÀÇ ÀÎÀÚ·Î ¹Þ´Â °ÍÀÔ´Ï´Ù.
main rW =
  let rW¡¯ = printAString rW "Please enter your name: "
      (rW¡¯¡¯,name) = readAString rW¡¯
  in printAString rW¡¯¡¯
          ("Hello, " ++ name ++ ", how are you?")
ÀÌ´Â Àб⵵ ¾î·Á¿ï »Ó¸¸ ¾Æ´Ï¶ó ¿¡·¯µµ ¹ß»ýÇÕ´Ï´Ù.

5.2 Action


IO¸¦ ´Ù·ç±â À§ÇØ Phil Wadler °¡ »ý°¢Çس½ °ÍÀº `¸ð³ªµå' ÀÔ´Ï´Ù. ÀÔÃâ·ÂÀ» ´ã´çÇÏ´Â operation À» ÇÔ¼ö·Î ¸¸µé¼ö´Â ¾ø½À´Ï´Ù. ´ë½Å¿¡ action À̶ó´Â À̸§À» ºÙ¿´½À´Ï´Ù. °Ô´Ù°¡ »õ·Î¿î ŸÀÔµµ ¸¸µé¾ú½À´Ï´Ù. ¸ÕÀú putStrLn ÀÇ Å¸ÀÔÀ» »ìÆìº¸¸é,
putStrLn :: String -> IO ()
¿¹»ó´ë·Î ÀÎÀÚ´Â String ¸¦ ¹Þ½À´Ï´Ù. ¹Ýȯ°ªÀº IO() ¶ó´Â ŸÀÔÀÔ´Ï´Ù. IO ´Â putStrLn°¡ action À̶ó´Â °ÍÀ» ³ªÅ¸³À´Ï´Ù. ±×¸®°í ÀÌ action ÀÌ °è»êµÇ¸é, ±× °á°ú°ªÀº () ¶ó´Â ŸÀÔÀ» °®½À´Ï´Ù. getLine ÀÇ Å¸ÀÔÀº ÁüÀÛÇÑ´ë·Î ´ÙÀ½°ú °°½À´Ï´Ù.
getLine :: IO String
¾Õ¿¡¼­ ¹è¿î ´ë·Î do ±¸¹® (´õ ÀÚ¼¼ÇÑ °ÍÀº éÅÍ 9¿¡¼­ ´Ù·ì´Ï´Ù.) À» »ç¿ëÇÏ¸é ¿©·¯ action À» »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù.
main = do
  hSetBuffering stdin LineBuffering
  putStrLn "Please enter your name: "
  name <- getLine
  putStrLn ("Hello, " ++ name ++ ", how are you?")
do ±¸¹®³»¿¡¼­ if/then/else ¿Í case/of ±¸¹®À» »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù.

¿¹¸¦ µé¾î ¼ýÀÚ ¸ÂÃ߱⠰ÔÀÓÀ» »ý°¢Çغ¾½Ã´Ù.
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 ´Â °°Àº ŸÀÔÀ̾î¾ß ÇÕ´Ï´Ù.

±×·³ ¡°then¡± branch ¸¦ »ìÆìº¾½Ã´Ù.
do putStrLn "Too low!"
   doGuessing num
ù¹øÂ° ÁÙÀº 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 ...
À̹ø¿¡´Â 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 ()
  -- we don¡¯t expect to get here unless guess == num
  if (read guess < num)
    then do print "Too low!";
            doGuessing
    else do print "Too high!";
            doGuessing
±×·¯³ª ÀÌ´Â ¿øÇϴ´ë·Î µ¿ÀÛÇÏÁö ¾Ê½À´Ï´Ù. (read guess) == num ÀÎ °æ¿ì¿¡´Â "You win!" À̶ó´Â ¹®ÀÚ¿­ÀÌ Ãâ·ÂµÇÁö¸¸ ÇÁ·Î±×·¥ÀÌ Á¾·áÇÏÁö ¾Ê°í, if ¹®À» ½ÇÇàÇÕ´Ï´Ù. Á¶°Ç¹®ÀÌ ÂüÀÌ ¾Æ´Ï±â ¶§¹®¿¡ "Too high!" ¶ó´Â ¹®ÀÚ¿­ÀÌ Ãâ·ÂµÇ°í ÇÁ·Î±×·¥Àº °è¼Ó µ¹¾Æ°©´Ï´Ù. ¹Ý¸é¿¡ (read guess) == num ÀÌ ¾Æ´Ñ °æ¿ì¿¡´Â case ¹®ÀÇ °è»ê°á°ú´Â LT À̳ª GT °¡ µÇ´Âµ¥ ÀÌ´Â case ¹®¿¡ ¾øÀ¸¹Ç·Î ¿¹¿Ü¸¦ ¹ß»ýÇϰí ÇÁ·Î±×·¥Àº Á¾·áµË´Ï´Ù.

5.3 IO ¶óÀ̺귯¸®


IO ¶óÀ̺귯¸®´Â 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 °ú °°½À´Ï´Ù. ÀÌ·± °ÍÀ» ŸÀÔ µ¿ÀǾî¶ó°í Çϴµ¥ 8.1 ¿¡¼­ ´õ ¸¹Àº ŸÀÔ µ¿ÀǾ º¼ ¼ö ÀÖ½À´Ï´Ù.)

bracket ÇÔ¼ö´Â action À» ¾ÈÀüÇÏ°Ô ¼öÇàÇϱâ À§Çؼ­ »ç¿ëµË´Ï´Ù. bracket ÇÔ¼ö´Â ¼¼ °³ÀÇ ÀÎÀÚ°¡ ÇÊ¿äÇÕ´Ï´Ù. ù¹øÂ° ÀÎÀÚ°¡ °¡Àå ¸ÕÀú ¼öÇàµË´Ï´Ù. µÎ¹øÂ° ÀÎÀÚ´Â, ¿¡·¯°¡ ÀÖ´ø ¾ø´ø °¡Àå ³ªÁß¿¡ ¼öÇàµË´Ï´Ù. ¼¼¹øÂ° ÀÎÀÚ´Â Áß°£¿¡ ¼öÇàµÇ´Âµ¥, ÀÌ´Â ¿¡·¯°¡ ¹ß»ýÇÒ ¼öµµ ÀÖ´Â ½ÇÇ๮ÀÌ ¿À°Ô µË´Ï´Ù. ¿¹¸¦µé¾î ÆÄÀÏ¿¡ ¹®ÀÚ Çϳª¸¦ ÀúÀåÇÏ´Â ÇÔ¼ö¸¦ ¸¸µé ¼ö ÀÖ½À´Ï´Ù.
writeChar :: FilePath -> Char -> IO ()
writeChar fp c =
    bracket
      (openFile fp ReadMode)
      hClose
      (\h -> hPutChar h c)

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


À̹ø¿¡´Â ÆÄÀÏÀ» Àд ÇÁ·Î±×·¥À» ÀÛ¼ºÇغ¾½Ã´Ù. ¿¡·¯Ã³¸®°¡ ¾ÈµÈ ¹Ì¿Ï¼º ÇÁ·Î±×·¥ÀÌÁö¸¸, IO ¸¦ ¾î¶»°Ô »ç¿ëÇÏ´ÂÁö ¹è¿ï¼ö ÀÖ´Â ÁÁÀº ¿¹Á¦°¡ µÉ °ÍÀÔ´Ï´Ù. ´ÙÀ½ Äڵ带 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)
¿¹¿Ü󸮿¡ °üÇÑ ´õ ÀÚ¼¼ÇÑ ³»¿ëÀº 10.1¿¡¼­ ´Ù·ê °ÍÀÔ´Ï´Ù.

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·Î ¹ø¿ªµÇÁö ¾Ê½À´Ï´Ù.)

¿ì¸®´Â ¾Õ¿¡¼­ °ýÈ£¸¦ »ç¿ëÇϸé ÁßÀ§¿¬»êÀÚ¸¦ ÇÔ¼öó·³ »ç¿ëÇÒ ¼ö ÀÖ´Ù°í ¹è¿ü½À´Ï´Ù.
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 ±¸¹®À» »ç¿ëÇØº¾½Ã´Ù. µé¿©¾²±â ¹®Á¦´Â éÅÍ 7.11 ¿¡¼­ ÀÚ¼¼È÷ ´Ù·ç°Ú½À´Ï´Ù.
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)
ÀÌ µÎ °¡Áö ½ºÅ¸ÀÏÀ» ¼¯¾î¼­ »ç¿ëÇÏÁö ¾Ê±â¸¦ °­·ÂÈ÷ ±ÇÇÕ´Ï´Ù.
fx=
  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
À̸¦ eta reduction À̶ó°í ÇÕ´Ï´Ù.

¾î¶»°Ô ÀÌ·± ÀÏÀÌ °¡´ÉÇÑÁö »ý°¢Çغ¾½Ã´Ù. 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
eta reduction À» ÀÌ¿ëÇÏ¸é ´ÙÀ½°ú °°½À´Ï´Ù.
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
eta reduction ¿¡ ÀÇÇØ ´ÙÀ½°ú °°°í,
fstGt0 = filter (\ (a,b) -> a>0)
fst ÇÔ¼ö¸¦ ÀÌ¿ëÇÏ¸é ´ÙÀ½°ú °°½À´Ï´Ù.
fstGt0 = filter (\x -> fst x > 0)
¿¬»êÀÚÀÇ ºÎºÐÀû¿ë°ú ÇÔ¼öÇÕ¼ºÀ» ÀÌ¿ëÇÏ¸é ´ÙÀ½°ú °°°í,
fstGt0 = filter (\x -> ((>0) . fst) x)
¸¶Áö¸·À¸·Î eta reduction À» »ç¿ëÇÏ¸é ´ÙÀ½°ú °°½À´Ï´Ù.
fstGt0 = filter ((>0).fst)
ÀÌ·¸°Ô eta reduction À» Ȱ¿ëÇÏ¿©, ÇÔ¼ö¸¦ Á¤ÀÇÇÏ´Â ½ºÅ¸ÀÏÀ» 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 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 ÇÔ¼ö¿¡ Àû¿ëÇØº¾´Ï´Ù. ¸ÕÀú Red ¿Í x °¡ ¸ÅÄ¡µÇ´ÂÁö »ìÇÌ´Ï´Ù. Eq Color ÀÇ Á¤ÀÇ¿¡ ÀÇÇØ¼­ ÀÌ ¸ÅÄ¡´Â ½ÇÆÐÇÏ°Ô µË´Ï´Ù. ¿Ö³Ä¸é Yellow ´Â Red °¡ ¾Æ´Ï±â ¶§¹®ÀÔ´Ï´Ù. colorToRGB ÇÔ¼öÀÇ Á¤ÀÇ¿¡¼­ À̹ø¿¡´Â Orange ¿Í x °¡ ¸ÅÄ¡µÇ´ÂÁö »ìÇÌ´Ï´Ù. ÀÌ ¸ÅÄ¡µµ ¿ª½Ã ½ÇÆÐÀÔ´Ï´Ù. ±×·¯¸é ´ÙÀ½¿¡ Yellow ¿Í x °¡ ¸ÅÄ¡µÇ´ÂÁö »ìÇÇ°Ô µÇ°í, ¸ÅÄ¡´Â ¼º°øÇÕ´Ï´Ù. ±×·¯¹Ç·Î ÇÔ¼ö¿¡ Á¤Àǵȴë·Î (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 ÀÎ °ªÀÌ ÀÖ´Ù¸é Maximally Bright ¶ó°í ÇØº¾½Ã´Ù. ±×·¯¸é ´ÙÀ½°ú °°ÀÌ 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"
±×·¯¹Ç·Î 7.4 ¿¡¼­ÀÇ isBright ÇÔ¼ö´Â ´ÙÀ½°ú °°ÀÌ ¹Ù²Ü ¼ö ÀÖ½À´Ï´Ù.
isBright2 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 Class ¸¦ »ìÆìº¸¸é,
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¡¯

6.6.5 ÆÄ»ýµÈ Ŭ·¡½º


Eq, Ord, Read ±×¸®°í Show ¿Í °°ÀÌ ÀÚ¸íÇÑ Å¬·¡½ºµéÀÇ ¼±¾ðÀº ÀÚµ¿È­µÉ ¼ö ÀÖ½À´Ï´Ù. (±×¸®°í ±×·¡¾ß¸¸ ÇÕ´Ï´Ù.) ÀÌ´Â deriving Ű¿öµå¸¦ ÅëÇØ °¡´ÉÇÕ´Ï´Ù.
data Color
    = Red
    | ...
    | Custom Int Int Int -- R G B components
    deriving (Eq, Ord, Show, Read)

data Maybe a = Nothing
             | Just a
             deriving (Eq, Ord, Show, Read)

ÀÌ·¸°Ô ÆÄ»ý½Ãų ¼ö Àִ Ŭ·¡½º¿¡´Â 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
...
°Ô´Ù°¡ update ¸Þ¼Òµåµµ »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù. ´ÙÀ½ Äڵ带 ¸ÕÀú »ìÆìº¾½Ã´Ù.
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
ÀϹÝÀûÀ¸·Î µ¥ÀÌÅÍŸÀÔ y ÀÇ Çʵå x ÀÇ °ªÀ» z ·Î ¹Ù²Ù°í ½Í´Ù¸é, y{x=z} ¿Í °°ÀÌ ¾²¸é µË´Ï´Ù. ¿©·¯ °³¸¦ ¹Ù²Ù±â À§Çؼ­´Â y{x=z, a=b, c=d} ¿Í °°ÀÌ ÇÒ ¼öµµ ÀÖ½À´Ï´Ù. ´ÙÀ½°ú °°ÀÌ ÆÐÅϸÅĪ¿¡ ÀÀ¿ëÇÒ ¼öµµ ÀÖ½À´Ï´Ù.
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]
À̸¦ ÀÌ¿ëÇÏ¿© ¹®ÀÚ¿­¿¡¼­ ´ë¹®ÀÚ¸¸À» °ñ¶ó ¼Ò¹®ÀÚ·Î º¯È¯ÇÑ ¸®½ºÆ®¸¦ ¹ÝȯÇÏ´Â ÇÔ¼ö¸¦ ÀÛ¼ºÇغ¾½Ã´Ù.
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)ÀÔ´Ï´Ù. ¿Ö³ÄÇϸé ÇÔ¼öÀÇ ¼ø¼öÇÔÀ» À¯ÁöÇϱâ À§Çؼ­, »õ·Î¿î ¹è¿­À» ¸¸µé ¶§ ¿ø·¡ÀÇ ¹è¿­À» ÆÄ±«ÇÏÁö ¾Ê°í º¹»çÇÏ¿© ¸¸µé±â ¶§¹®ÀÔ´Ï´Ù. ±×·¯¹Ç·Î ¹è¿­º¸´Ù ºü¸£°Ô °»½ÅÇÒ ¼ö ÀÖ´Â ÀڷᱸÁ¶¸¦ ¿øÇÑ´Ù¸é FiniteMaps ¸¦ »ç¿ëÇØ¾ßÇÕ´Ï´Ù.
bounds : ¹è¿­ÀÇ Å©±â¸¦ ¹Ýȯ
indices : ¹è¿­ÀÇ ¸ðµç À妽º¸¦ ¿ä¼Ò·Î ÇÏ´Â ¸®½ºÆ®¸¦ ¹Ýȯ
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 Finate Map


FiniteMap À̶ó´Â µ¥ÀÌÅͱ¸Á¶´Â FiniteMap (¶Ç´Â Data.FiniteMap) À̶ó´Â ¸ðµâÀ» ºÒ·¯¿ÈÀ¸·Î½á »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù.

À̰ÍÀº balanced trees ¸¦ ±¸ÇöÇÑ °ÍÀε¥, ¸®½ºÆ®¿Í ¹è¿­°ú ºñ±³¸¦ ÇØº¸¸é ´ÙÀ½°ú °°½À´Ï´Ù.

            ¸®½ºÆ®   ¹è¿­     FiniteMap
»ðÀÔ       O(1)   O(n)   O(log n)
°»½Å       O(n)   O(n)   O(log n)
»èÁ¦       O(n)   O(n)   O(log n)
ã±â       O(n)   O(1)   O(log n)
map     O(n)   O(n)   O(n log n)

±âº»ÀûÀÎ ÇÔ¼ö¿Í ±× ŸÀÔÀº ´ÙÀ½°ú °°½À´Ï´Ù.
emptyFM   :: FiniteMap key elt
addToFM   :: FiniteMap key elt -> key -> elt ->
               FiniteMap key elt
delFromFM :: FiniteMap key elt -> key ->
               FiniteMap key elt
elemFM    :: key -> FiniteMap key elt -> Bool
lookupFM :: FiniteMap key elt ->  key -> Maybe elt
key ÀÇ Å¸ÀÔÀº Ord Ŭ·¡½ºÀÇ ÀνºÅϽº¿©¾ß ÇÕ´Ï´Ù.
Prelude> :m FiniteMap
FiniteMap> let fm = listToFM [(¡¯a¡¯,5),(¡¯b¡¯,10),(¡¯c¡¯,1),(¡¯d¡¯,2)]
FiniteMap> let myFM = addToFM fm ¡¯e¡¯ 6
FiniteMap> fmToList fm
[(¡¯a¡¯,5),(¡¯b¡¯,10),(¡¯c¡¯,1),(¡¯d¡¯,2)]
FiniteMap> fmToList myFM
[(¡¯a¡¯,5),(¡¯b¡¯,10),(¡¯c¡¯,1),(¡¯d¡¯,2),(¡¯e¡¯,6)]
FiniteMap> lookupFM myFM ¡¯e¡¯
Just 6
FiniteMap> lookupFM fm ¡¯e¡¯
Nothing

7 ºÎ·Ï

7.1 ºÎ·Ï D.


ÀÚÁÖ »ç¿ëÇÏ´Â »ê¼úÇü

Type Class Description
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


Ŭ·¡½º °ü°è

Class Derived
Real Num, Ord
Integral Real, Enum
Fractional Num
Floating Fractional
RealFrac Real, Fractional
RealFloat RealFrac, Floating


7.2 ºÎ·Ï E. 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  : 7.6.3 ¿¡¼­ ¼³¸íÇÔ

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, or : and =  foldr (&&) True
          or =  foldr (||) False
all, any : any p =  or . map p
           all p =  and . map p
elem, notElem  : ¸®½ºÆ®¿¡ ¾î¶² ¿ä¼ÒÀÇ °ªÀÌ Á¸ÀçÇÏ´ÂÁö ¾Ë·ÁÁØ´Ù. notElemÀº elem ÀÇ ¹Ý´ë
sum, product  : ¸®½ºÆ®ÀÇ ÇÕ°ú °ö
maximum, minimum  : 
zip, unzip : zip ÇÔ¼ö´Â µÎ °³ÀÇ ¸®½ºÆ®¸¦ ¹Þ¾Æ¼­ Æä¾îÀÇ ¸®½ºÆ®·Î ¸¸µê
zip3, unzip3
zipWith, zipWith3

7.3 ºÎ·Ï F. I/O °ü·Ã µ¥ÀÌÅÍŸÀÔ ¹× ÇÔ¼ö

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



sponsored by andamiro
sponsored by cdnetworks
sponsored by HP

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2007-12-18 13:33:58
Processing time 1.0317 sec