Yet Another Haskell Tutorial
|
Yet Another Haskell Tutorial ¿ä¾àº»
[edit]
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 ¿¡ ÀÖ½À´Ï´Ù.
[edit]
1.2 Ãâó ¶¿À¸®Áö³Î ¿µ¹®¹öÀüÀº ´ÙÀ½ ÁÖ¼Ò¿¡¼ ¹ÞÀ» ¼ö ÀÖ½À´Ï´Ù.
¿Â¶óÀÎ ¹öÀüÀº ´ÙÀ½ ÁÖ¼Ò¿¡¼ º¼ ¼ö ÀÖ½À´Ï´Ù.
ÇϽºÄÌ¿¡ °üÇÑ ´õ ¸¹Àº ¹®¼´Â ´ÙÀ½ ÁÖ¼Ò¿¡¼ º¼ ¼ö ÀÖ½À´Ï´Ù.
ÇϽºÄÌ98ÀÇ ¶óÀ̺귯¸®
GHCÀÇ ¶óÀ̺귯¸®
[edit]
1.3 ¾Ë¸² ¶º» ¹®¼´Â Yet Another Haskell Tutorial ÀÇ ¿ä¾àÆÇÀ¸·Î,
¿ÏÀüÇÑ ³»¿ëÀ» º¸±â À§Çؼ´Â ¿À¸®Áö³Î ¿µ¹®ÆÇÀ» º¸½Ã±â ¹Ù¶ø´Ï´Ù.
[edit]
2.1 ÀÎÅÍÇÁ¸®ÅÍ¿Í ÄÄÆÄÀÏ·¯ ¶ÇϽºÄÌ Äڵ带 ½ÇÇàÇϱâ À§ÇÑ Àß ¾Ë·ÁÁø ÇÁ·Î±×·¥ÀÌ µÎ °¡Áö°¡ ÀÖ½À´Ï´Ù. ù¹øÂ°·Î Hugs ´Â http://haskell.org/hugs ¿¡¼ ¹ÞÀ» ¼ö ÀÖÀ¸¸ç, ÀÎÅÍ·¢Æ¼ºê ¸ðµå·Î¸¸ µ¿ÀÛÇÕ´Ï´Ù. GHC ´Â http://haskell.org/ghc ¿¡¼ ¹ÞÀ» ¼ö ÀÖÀ¸¸ç, ÀÎÅÍ·¢Æ¼ºê ¸ðµå·Îµµ µ¿ÀÛÇϰí, Äڵ带 ÄÄÆÄÀÏ ÇÒ ¼öµµ ÀÖ½À´Ï´Ù. GHC ´Â »ç½Ç»ó(de facto) Ç¥Áر¸ÇöÀ¸·Î ¿©°ÜÁý´Ï´Ù.
ÆíÁý±â´Â Emacs/XEmacs ÀÇ haskell-mode ¸¦ ÃßõÇÕ´Ï´Ù.
[edit]
2.2 Ç¥±â¹ý ¶ÀÎÅÍ·¢Æ¼ºê ¸ðµå¿¡¼ ½ÇÇàÇÏ´Â ÄÚµå´Â ´ÙÀ½°ú °°ÀÌ "¸ðµâ¸í>" À¸·Î ½ÃÀÛÇÕ´Ï´Ù.
Prelude> print "Hello, world"±×·¸Áö ¾Ê´Ù¸é ÆÄÀÏ·Î ÀÛ¼ºµÇ´Â ÄÚµåÀÔ´Ï´Ù. [edit]
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 ·Î ´ëüÇÒ ¼ö ÀÖ½À´Ï´Ù. (`ÂüÁ¶Àû Åõ¸í¼º'ÀÇ Á¤ÀÇ´Â »ç¶÷¸¶´Ù °ßÇØ°¡ ´Ù¸¦ ¼ö ÀÖ½À´Ï´Ù.) [edit]
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´Â µÚ¿¡¼ ´Ù·ç°Ú½À´Ï´Ù.) [edit]
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") °ú °°ÀÌ ¸»ÀÔ´Ï´Ù. [edit]
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 [edit]
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 [edit]
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 ] ¸¦ ³ªÅ¸³À´Ï´Ù.
[edit]
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 [edit]
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)¸¦ ³ªÅ¸³»¸ç ¾î¶°ÇÑ °ª°úµµ ¸ÅÄ¡µË´Ï´Ù.
ÇϽºÄÌÀº ÆÄÀ̽ã°ú À¯»çÇϰԵµ µé¿©¾²±â°¡ Áß¿äÇÕ´Ï´Ù. À̸¦ ·¹À̾ƿô ½Ã½ºÅÛÀ̶ó°í ºÎ¸£´Âµ¥, ´ÙÀ½°ú °°Àº ±ÔÄ¢À» »ý°¢ÇսôÙ.
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 []}
[edit]
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)
[edit]
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" [edit]
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
[edit]
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 xsfilter ÇÔ¼öµµ ÀçÀÛ¼ºÇغ¾½Ã´Ù.
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 [edit]
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)
[edit]
4 ŸÀÔ ¶ÇϽºÄÌÀº Á¤Àû ŸÀÔÀÔ´Ï´Ù. À̰ÍÀÇ Àǹ̴Â, ÇϽºÄÌ¿¡´Â ¸ðµç Ç¥Çö¿¡´Â ŸÀÔÀÌ ¹èÁ¤µÈ´Ù´Â °ÍÀÔ´Ï´Ù. ¿¹¸¦ µé¸é, 'a' ÀÇ Å¸ÀÔÀº Char ÀÔ´Ï´Ù. ÇÔ¼öÀÇ ÀÎÀÚ¿¡µµ ŸÀÔÀÌ ÇÊ¿äÇÕ´Ï´Ù. ¸¸¾à ´Ù¸¥ ŸÀÔÀ» ÀÎÀÚ·Î ³Ö°Ô µÇ¸é ÄÄÆÄÀÏ ¿¡·¯°¡ ¹ß»ýÇÕ´Ï´Ù. ÀÌ·± Ư¡À¸·Î ÀÎÇØ ¸¹Àº ¹ö±×¸¦ ÁÙÀÏ ¼ö ÀÖ½À´Ï´Ù. °Ô´Ù°¡ ÇϽºÄÌÀº ŸÀÔÃß·Ð ½Ã½ºÅÛÀ» »ç¿ëÇÕ´Ï´Ù. ÀÌ´Â ¸ðµç Ç¥ÇöÀÇ Å¸ÀÔÀ» ÁöÁ¤ÇØÁÙ Çʿ䰡 ¾ø´Ù´Â ¸»ÀÔ´Ï´Ù. C ¿¡¼´Â º¯¼ö¸¦ ¼±¾ðÇÒ ¶§ int, char, .. °°Àº ÇüÀ» ÁöÁ¤ÇؾßÇßÁö¸¸, ÇϽºÄÌ¿¡¼´Â ŸÀÔÀ» ¹®¸Æ¿¡¼ Ãß·ÐÇÏ°Ô µË´Ï´Ù. ¶ÇÇÑ Å¸ÀÔÀ» ¸í½ÃÀûÀ¸·Î ÁöÁ¤ÇÏ´Â °Íµµ °¡´ÉÇÕ´Ï´Ù. ÀÌ °æ¿ì¿¡´Â µð¹ö±ëÇϴµ¥ µµ¿òÀ» ÁÙ °ÍÀÔ´Ï´Ù.
Hugs ¿Í GHCi ¿¡¼´Â :t ¸í·É¾î·Î ŸÀÔÀ» ¾Ë¾Æ³¾ ¼ö ÀÖ½À´Ï´Ù.
Prelude> :t ¡¯c¡¯ ¡¯c¡¯ :: CharÀ̸¦ ÅëÇØ ¡¯c¡¯ ´Â Char ŸÀÔÀ̶ó´Â °ÍÀ» ¾Ë ¼ö ÀÖ½À´Ï´Ù. [edit]
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 :: Double5¶ó´Â °ªÀº Á¤¼öÇü ¶Ç´Â ½Ç¼öÇüÀ¸·Î ÁöÁ¤ÇÒ ¼ö ÀÖ´Ù´Â °ÍÀ» ¹ß°ßÇÒ ¼ö ÀÖ½À´Ï´Ù. ±×·³, ÇüÀ» ÁöÁ¤ÇÏÁö ¾ÊÀ¸¸é ¾î¶² °á°ú°¡ ³ª¿À´ÂÁö »ìÆìº¾½Ã´Ù. Prelude> :t 5 5 :: Num a => aÀÌ¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ ³»¿ëÀº 4.3 ¿¡¼ »ìÆìº¸±â·Î ÇÏ°í ³Ñ¾î°©½Ã´Ù. [edit]
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 °ªÀ» ¹ÝȯÇÕ´Ï´Ù. [edit]
4.3.1 ŸÀÔ Å¬·¡½ºÀÇ Çʿ伺 ¶¸¹Àº ¾ð¾î¿¡¼´Â ¿À¹ö·ÎµùÀ̶ó´Â ½Ã½ºÅÛÀÌ ÀÖ½À´Ï´Ù. Áï, ÇÔ¼öÀÇ ÀÎÀÚ°¡ ´Ù¸£¸é ÇÔ¼öÀÇ µ¿ÀÛÀÌ ´Þ¶óÁý´Ï´Ù. ¿¹¸¦ µé¾î µÎ °´Ã¼¸¦ ºñ±³ÇÏ´Â equal ÇÔ¼ö°¡ ÀÖ´Ù°í Çϸé, Á¤¼ö¸¦ ºñ±³Çϱâ À§ÇÑ ¹æ¹ý°ú, ½Ç¼ö¸¦ ºñ±³Çϱâ À§ÇÑ µ¿ÀÛ, ¹®ÀÚ¸¦ ºñ±³Çϱâ À§ÇÑ µ¿ÀÛ, ¹®ÀÚ¿À» ºñ±³ÇÏ´Â µ¿ÀÛ ¸ðµÎ ´Ù¸¨´Ï´Ù. ÀϹÝÀûÀ¸·Î ¿ì¸®°¡ ŸÀÔ ¥á ÀÎ µÎ °³¸¦ ºñ±³ÇÏ°í ½ÍÀ» ¶§, ¥á-compare À» »ç¿ëÇÑ´Ù°í ÇսôÙ. ÀÌ ¶§ ¥á ¸¦ ŸÀÔº¯¼ö¶ó°í ÇÕ´Ï´Ù.
±×·¯³ª ºÒÇàÇϰԵµ Á¤Àû ŸÀÔ ½Ã½ºÅÛ¿¡¼´Â ¸î°¡Áö ¹®Á¦°¡ ÀÖ½À´Ï´Ù. ŸÀÔ È®Àαâ´Â ¾î¶² ŸÀÔ¿¡ ¾î¶² µ¿ÀÛÀÌ ÇÊ¿ä·Î ÇÏ´ÂÁö ¾ËÁö ¸øÇÕ´Ï´Ù. ÀÌ·± ¹®Á¦¸¦ Ç®±â À§ÇÑ ¸¹Àº ¹æ¹ýµéÀÌ Àִµ¥, (¾à°£ °úÁ¤Çؼ ¸»Çϸé, º°·Î ¸¹Áö´Â ¾Ê½À´Ï´Ù.) ÇϽºÄÌ¿¡¼ ÀÌ·± ¹®Á¦¸¦ ÇØ°áÇÏ´Â ¹æ½ÄÀº ŸÀÔ Å¬·¡½ºÀÔ´Ï´Ù.
[edit]
4.3.2 equality Å×½ºÆ® ¶== ¶ó´Â ÇÔ¼ö(¶Ç´Â ¿¬»êÀÚ, ÇϽºÄÌ¿¡¼´Â ¿¬»êÀÚ°¡ °ð ÇÔ¼öÀÌ´Ù)°¡ µÎ °ªÀ» ºñ±³ÇÏ´Â °æ¿ì¸¦ »ìÆìº¾½Ã´Ù. ¿ì¼± µÎ °ªÀº ŸÀÔÀÌ °°¾Æ¾ß Çϰí, (À̸¦ ¥á ¶ó°í ÇÏÀÚ.) ¹Ýȯ ŸÀÔÀº Bool ÀÔ´Ï´Ù. ±×¸®°í == ÇÔ¼ö¸¦ Eq ¶ó´Â ŸÀÔ Å¬·¡½º¿Í °áÇÕÇÕ´Ï´Ù. ¸¸¾à, ¥á °¡ ŸÀÔ Å¬·¡½º¿¡ Á¤ÀǵÅÀÖ´Ù¸é, ¥á ´Â ±× ŸÀÔŬ·¡½ºÀÇ ÀνºÅϽº¶ó°í ¸»ÇÒ ¼ö ÀÖ½À´Ï´Ù. ¿¹¸¦µé¸é, Int ´Â Eq ÀÇ ÀνºÅϽºÀÔ´Ï´Ù. ÀÌ·¸°Ô ÇÔ¼ö¸¦ Á¤ÀÇÇÏ¸é ¸ðµç ŸÀÔ¿¡ ´ëÇØ Á¤ÀÇÇÒ Çʿ䰡 ¾ø½À´Ï´Ù.
[edit]
4.3.3 Num Ŭ·¡½º ¶ÇϽºÄÌ¿¡¼ == ¿Í °°ÀÌ ¿¬»êÀÚ¸¦ ¿À¹ö·ÎµùÇÒ ¶§, ¼ýÀÚ »ó¼ö (1, 2, 3, ..) µéµµ ¿À¹ö·ÎµåÇÕ´Ï´Ù. ¼ýÀÚ 5¿Í °°Àº °æ¿ì´Â Num Ŭ·¡½º·Î Á¤Àǵǰí, Num Ŭ·¡½ºÀÇ ÀνºÅϽº¿¡´Â ±âº» ¼ýÀÚ Å¸ÀÔÀÎ (Int, Double) °¡ Á¤ÀǵǾîÀÖ½À´Ï´Ù. ±×·¯¹Ç·Î ¼ýÀÚ 5´Â ÄÄÆÄÀÏ·¯°¡ º¼¶§, Á¤¼öÇüÀ¸·Î º¼ ¼öµµ ÀÖ°í, ½Ç¼öÇüÀ¸·Î º¼ ¼öµµ ÀÖ°Ô µË´Ï´Ù. ÀÌÁ¦ ´õ ±íÀº ³íÀÇ´Â 8.4¿¡¼ ´Ù·ç°Ú½À´Ï´Ù.
[edit]
4.3.4 Show Ŭ·¡½º ¶Show Ŭ·¡½ºÀÇ show ÇÔ¼ö¸¦ »ç¿ëÇÏ¸é ¹®ÀÚ¿ÀÌ ¾Æ´Ñ °ÍÀ» ¹®ÀÚ¿·Î º¯È¯ÇÒ ¼ö ÀÖ½À´Ï´Ù.
Prelude> show 5 "5" Prelude> show ¡¯a¡¯ "¡¯a¡¯" Prelude> show "Hello World" "\"Hello World\""¹®ÀÚ´Â ÀÛÀº µû¿ÈÇ¥·Î µÑ·¯½Î°í, ¹®ÀÚ¿Àº Å« µû¿ÈÇ¥·Î µÑ·¯½Î°Ô µË´Ï´Ù. ¸¶Áö¸· ÁÙ¿¡ ¿ª½½·¡½¬°¡ Àִµ¥, ÀÌ´Â ÀÎÅÍÇÁ¸®ÅÍ¿¡¼ Ư¼ö¹®ÀÚ¸¦ Ãâ·ÂÇϱâ À§ÇÑ °ÍÀÔ´Ï´Ù. ½ÇÁ¦ ¹®ÀÚ¿Àº ¿ª½½·¡½¬¸¦ Æ÷ÇÔÇÏÁö ¾Ê½À´Ï´Ù. [edit]
4.4 ÇÔ¼ö ŸÀÔ ¶1 À̳ª 'c' °ú °°Àº °ªµéÀº ŸÀÔÀ» °¡Áö°í ÀÖ´Ù°í Çß½À´Ï´Ù. ±×·±µ¥ ÇϽºÄÌ¿¡¼´Â ÇÔ¼öµµ ¿ª½Ã ŸÀÔÀ» °¡Áø °ªÀÔ´Ï´Ù.
[edit]
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 [edit]
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] [edit]
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 ¶ó°í ¾µ ¼ö´Â ¾ø½À´Ï´Ù. [edit]
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 [edit]
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 °¡ µË´Ï´Ù.
[edit]
4.5 µ¥ÀÌÅÍ Å¸ÀÔ ¶Æ©Çðú ¸®½ºÆ®µµ ÈǸ¢ÇÑ µ¥ÀÌÅÍ ±¸Á¶ÀÌÁö¸¸, ÀڽŸ¸ÀÇ µ¥ÀÌÅÍ ±¸Á¶¸¦ Á¤ÀÇÇÏ°í ½ÍÀ» ¶§µµ ÀÖ½À´Ï´Ù. ÀÌ·± µ¥ÀÌÅÍ Å¸ÀÔÀº data ±¸¹®À» ÀÌ¿ëÇÏ¿© Á¤ÀÇÇÒ ¼ö ÀÖ½À´Ï´Ù.
[edit]
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 [edit]
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 ŸÀÔÀÌ µÉ ¼ö ÀÖ½À´Ï´Ù.
[edit]
4.5.3 Àç±ÍÀû µ¥ÀÌÅÍŸÀÔ ¶´ÙÀ½°ú °°ÀÌ ¸®½ºÆ®¸¦ Á¤ÀÇÇϱâ À§Çؼ Àç±ÍÀû µ¥ÀÌÅÍŸÀÔÀ» »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù. Àç±ÍÀû µ¥ÀÌÅÍŸÀÔÀ̶õ, Á¤ÀÇ¿¡ ÀÚ±â ÀÚ½ÅÀ» Æ÷ÇÔÇÏ´Â °ÍÀ» ¸»ÇÕ´Ï´Ù.
data List a = Nil
| Cons a (List a)
ÀÌ List ´Â ÇϽºÄÌ¿¡ ³»ÀåµÈ ¸®½ºÆ®¿Í °ÅÀÇ °°½À´Ï´Ù. length ¿¡ ÇØ´çµÇ´Â ÇÔ¼öµµ ¸¸µé¾îº¸¸é ´ÙÀ½°ú °°½À´Ï´Ù.
listLength Nil = 0 listLength (Cons x xs) = 1 + listLength xs [edit]
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 [edit]
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) [edit]
4.5.6 Unit ŸÀÔ ¶¸¶Áö¸·À¸·Î À¯¿ëÇÑ Å¸ÀÔÀº ¹Ù·Î Unit ŸÀÔÀÔ´Ï´Ù.
data () = ()ÀÌ Å¸ÀÔÀÌ °¡Áú ¼ö ÀÖ´Â À¯ÀÏÇÑ °ªÀº () ÀÔ´Ï´Ù. ÀÌ´Â C ³ª Java ¿¡¼ÀÇ void ¿Í ±Ùº»ÀûÀ¸·Î °°½À´Ï´Ù. éÅÍ 5 ¿¡¼ IO ¸¦ ´Ù·ê ¶§ À¯¿ëÇÏ°Ô »ç¿ëµË´Ï´Ù. [edit]
5 ±âº» ÀÔÃâ·Â ¶±âº» ÀÔÃâ·ÂÇÔ¼ö¿¡´Â ´ÙÀ½°ú °°ÀÌ ÃÖ¼ÒÇÑ ³× Á¾·ù°¡ ÀÖ½À´Ï´Ù. ¼ø¼öÇÑ ÇÔ¼ö´Â ¾Æ´Ï¹Ç·Î ÀÏ´Ü operation À̶ó°í ÇϰڽÀ´Ï´Ù.
[edit]
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?")
ÀÌ´Â Àб⵵ ¾î·Á¿ï »Ó¸¸ ¾Æ´Ï¶ó ¿¡·¯µµ ¹ß»ýÇÕ´Ï´Ù.
[edit]
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 ¹®¿¡ ¾øÀ¸¹Ç·Î ¿¹¿Ü¸¦ ¹ß»ýÇϰí ÇÁ·Î±×·¥Àº Á¾·áµË´Ï´Ù.
[edit]
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)
[edit]
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¿¡¼ ´Ù·ê °ÍÀÔ´Ï´Ù.
[edit]
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] [edit]
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+2f 5 ÀÇ °ªÀº 7ÀÌ ¾Æ´Ï°í 6ÀÔ´Ï´Ù. ±»ÀÌ ÀÌÀ¯¸¦ ¼³¸íÇÏÀÚ¸é let ±¸¹®¿¡¼ where ´Â º¸ÀÌÁö ¾Ê±â ¶§¹®Àε¥, Á¦¹ß ºÎŹÀε¥ ÀÌ·± ½ÄÀ¸·Î ¼¯Àº ±¸¹®Àº »ç¿ëÇÏÁö ¾Ê±â¸¦ ¹Ù¶ø´Ï´Ù. let/in °ú where ÀÇ ¼±ÅÃÀº °³ÀÎÀÇ ±âÈ£¿¡ ´Þ¸° ¹®Á¦ÀÌÁö¸¸, °³ÀÎÀûÀÎ »ý°¢À¸·Î´Â where°¡ ´õ ¸¹ÀÌ ¾²ÀÌ´Â °Í °°½À´Ï´Ù.
[edit]
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) seta 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) leta 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 [edit]
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 _ = Falser,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 -- À߸øµÈ ÇÔ¼öÁ¤ÀÇ [edit]
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
[edit]
6.6 ÀνºÅϽº ¼±¾ð ¶¾î¶² ŸÀÔÀ» ŸÀÔ Å¬·¡½ºÀÇ ÀνºÅϽº·Î ¸¸µé±â À§Çؼ´Â, ÀνºÅϽº ¼±¾ðÀÌ ÇÊ¿äÇÕ´Ï´Ù.
´ë´Ù¼öÀÇ Å¬·¡½º¿¡´Â "ÃÖ¼ÒÇÑÀÇ ¿ÏÀüÇÑ Á¤ÀÇ"°¡ Á¦°øµË´Ï´Ù. ¸»±×´ë·Î Ŭ·¡½ºÀÇ Á¤ÀÇ¿¡ ÇÊ¿äÇÑ ÃÖ¼ÒÇÑÀÇ ±¸ÇöµÇ¾ßÇÒ ÇÔ¼öµéÀ» ÀǹÌÇÕ´Ï´Ù.
[edit]
6.6.1 Eq Ŭ·¡½º ¶Eq Ŭ·¡½ºÀÇ ¸â¹ö (Áï, ÇÔ¼ö) ¿¡´Â 2°³°¡ ÀÖ½À´Ï´Ù.
(==) :: Eq a => a -> a -> Bool (/=) :: Eq a => a -> a -> BoolEq Ŭ·¡½ºÀÇ ¿ÏÀüÇÑ Á¤ÀǸ¦ À§Çؼ´Â ÃÖ¼ÒÇÑ À§ÀÇ µÎ ÇÔ¼ö Áß Çϳª°¡ Á¤ÀǵžßÇÕ´Ï´Ù. À̸¦ Á¤ÀÇÇϱâ À§Çؼ´Â ÀνºÅϽº ¼±¾ðÀÌ ÇÊ¿äÇÕ´Ï´Ù. ¼³¸íÀ» À§ÇØ ´Ù½Ã 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 ¶ó´Â Ű¿öµå°¡ ÇÊ¿äÇÕ´Ï´Ù.
[edit]
6.6.2 Show Ŭ·¡½º ¶Show Ŭ·¡½º´Â ¾î¶² °ªÀ» ¹®ÀÚ¿·Î ¹Ù²Ù±â À§ÇØ »ç¿ëµË´Ï´Ù. ÀÌ Å¬·¡½ºÀÇ ¸â¹ö´Â ¼¼ °³°¡ ÀÖ½À´Ï´Ù.
show :: Show a => a -> String showsPrec :: Show a => Int -> a -> String -> String showList :: Show a => [a] -> String -> StringShow Ŭ·¡½ºÀÇ ÃÖ¼ÒÇÑÀÇ ¿ÏÀüÇÑ Á¤ÀǸ¦ À§Çؼ´Â, 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
[edit]
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 GTOrd Ŭ·¡½ºÀÇ ÀνºÅϽº·Î ¼±¾ðÇϱâ À§Çؼ´Â ¸ÕÀú 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 -> aRead Ŭ·¡½º´Â Show Ŭ·¡½ºÀÇ ¹Ý´ë¿ªÇÒÀ» ÇÕ´Ï´Ù. readsPrec :: Read a => Int -> String -> [(a, String)] readList :: String -> [([a], String)]ÃÖ¼ÒÇÑÀÇ ¿ÏÀüÇÑ Á¤ÀǸ¦ À§Çؼ´Â, readsPrec ÀÌ Á¤ÀÇµÅ¾ß ÇÕ´Ï´Ù. [edit]
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¡¯
[edit]
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.
[edit]
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 }
¹°·Ð, µÎ ¹øÂ° ¹æ¹ýÀÌ ÈξÀ ÀÌÇØÇϱⰡ ½±½À´Ï´Ù.
[edit]
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)] [edit]
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)] [edit]
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 [edit]
7.1 ºÎ·Ï D. ¶ÀÚÁÖ »ç¿ëÇÏ´Â »ê¼úÇü
Ŭ·¡½º °ü°è
[edit]
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
[edit]
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 |
People who take cat naps don't usually sleep in a cat's cradle. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||








