JiwonDev

์•„์ฃผ ๋ฉ‹์ง„ ํ•˜์Šค์ผˆ์„ ๊ฐ™์ด ๋ฐฐ์›Œ๋ณด์ž #1

by JiwonDev

Hello Haskell!

์ˆœ์ˆ˜ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์ •์ˆ˜, ํ•จ์ˆ˜ํ˜•์˜ ๋Œ€๊ฐ€์ธ ๋…ผ๋ฆฌํ•™์ž Haskell Curry์˜ ์ด๋ฆ„์„ ๋นŒ๋ฆฐ ๋ฉ‹์ง„ ์–ธ์–ด์ž…๋‹ˆ๋‹ค.

์‹ฌ์ง€์–ด ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์šฉ์–ด ์ค‘์— Currying์ด๋ผ๋Š” ํ‘œํ˜„์ด ์žˆ์ฃ . ์ด๊ฑฐ ์ € ์‚ฌ๋žŒ ์ด๋ฆ„์—์„œ ๊ฐ€์ ธ์˜จ ์šฉ์–ด์ž…๋‹ˆ๋‹ค.

 

Haskell Curry

C์–ธ์–ด์™€ ๋น„์Šทํ•œ ์„ ์ƒ์—์„œ 1990๋…„๋„์— ์ถœ๋ฐœํ•˜์˜€์ง€๋งŒ ๊ฐ€๋” ๋ณด๋ฉด ์ด๋ฏธ ๋งํ•ด์„œ ํ•˜์Šค์ผˆ ๊ฐœ๋ฐœ์ž๋“ค์ด ๋‹ค ์—†์–ด์ง„ ๊ฒƒ์ด ์•„๋‹๊นŒ ์˜์‹ฌ๋˜๋Š” ๊ฑฐ๋ถ์ด๊ธ‰ ์—…๋ฐ์ดํŠธ ์†๋„์™€ ๋ฉ”์ธ ์ฝ”๋“œ ์ž‘์„ฑ๋ถ€ํ„ฐ ์–ด๋ ค์šด ์ •์‹ ๋‚˜๊ฐ„ ๋Ÿฌ๋‹ ์ปค๋ธŒ๋Š” ์–ธ์ œ๋‚˜ ๊ฐœ๋ฐœ ์–ธ์–ด ์ ์œ ์œจ ์ˆœ์œ„ ์ตœํ•˜์œ„๊ถŒ์„ ์•ž๋‹คํˆฌ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์˜์™ธ๋กœ ๋งค๋‹ˆ์•„์ธต์ด ๋‘ํ„ฐ์šฐ๋ฉฐ 2020๋…„๋„๊นŒ์ง€ ๊พธ์ค€ํžˆ ์—…๋ฐ์ดํŠธ๋ฅผ ํ•ด์ฃผ๊ณ  ์žˆ์ฃ .

์•„๋ฌดํŠผ ์•„์ฃผ ๋ฉ‹์ง„ ์–ธ์–ด์ž…๋‹ˆ๋‹ค.

 

์ตœ๊ทผ ๋“ค์–ด์„œ Side-Effect ( ์™ธ๋ถ€ ํ™˜๊ฒฝ์— ๋”ฐ๋ผ ๊ฒฐ๊ณผ๊ฐ’์ด ๋‹ฌ๋ผ์ง€๋Š” ๊ฒฝ์šฐ )์˜ ์ œ๊ฑฐ์™€ ๋ฉ”๋ชจ๋ฆฌ์™€ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋™์ž‘์„ ๋…ผ๋ฆฌ์ ์œผ๋กœ ์ ์–ด ํ•จ์ˆ˜์˜ ์žฌ์‚ฌ์šฉ์„ฑ๊ณผ ๊ฐ€๋…์„ฑ์„ ๋†’์ด๋Š” ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์‚ฌ์šฉ์ด ๋งŽ์ด ๋Š˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋Œ€๋ถ€๋ถ„์˜ ๋ชจ๋˜ํ•œ ์–ธ์–ด๋“ค์€ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์ง€์›ํ•ด์ฃผ๊ณ  ์žˆ์ฃ . ๊ทธ๋ž˜๋„ ํ•˜์Šค์ผˆ์€ ์•ˆ์”๋‹ˆ๋‹ค.

 

ํ•˜์ง€๋งŒ ์ง€๊ธˆ ์ด ๊ธ€์„ ์ฝ๊ณ  ์žˆ๋‹ค๋Š” ๊ฑด ์–ด์ฐŒ๋˜์—ˆ๊ฑด ํ•˜์Šค์ผˆ์„ ๋ฐฐ์šฐ๊ณ  ์‹ถ๋‹ค๋Š” ๋งˆ์Œ์ด ์žˆ๋‹ค๋Š” ๊ฑฐ๊ฒ ์ฃ .

ํ•จ๊ป˜ ํ•˜์Šค์ผˆ์— ๋Œ€ํ•ด ์•Œ์•„๋ด…์‹œ๋‹ค.

 

Haskell 3์ค„ ์š”์•ฝ

  • ์ง€์—ฐ๋œ ๊ณ„์‚ฐ ํ‰๊ฐ€(lazy evaluation), ์ˆœ์ˆ˜ํ•œ ํ•จ์ˆ˜ํ˜•(functional), ์ •์  ํƒ€์ž… ์ง€์ • (statically typed) ์–ธ์–ด
  • ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์—ฐ๊ตฌ์— ํ•„์š”ํ•œ ๊ณตํ†ต ์–ธ์–ด ์—ญํ• ์„ ํ•˜๊ธฐ ์œ„ํ•ด ์ข‹์€ ์•„์ด๋””์–ด๋ฅผ ๋ชจ์•„์„œ ๋งŒ๋“  ์–ธ์–ด
  • ํ•˜์ง€๋งŒ ๊ฐœ๋…๋งŒ ๊ฐ–๋‹ค์“ฐ์ง€ ์•„๋ฌด๋„ ํ•˜์Šค์ผˆ์„ ์ง์ ‘ ์“ฐ์ง€๋Š” ์•Š๋Š”๋‹ค๊ณ  ํ•œ๋‹ค.

 

ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด๋ž€?

  • ์ˆœ์ˆ˜ํ•จ์ˆ˜, ์™ธ๋ถ€ ํ™˜๊ฒฝ(side effect)์— ์˜ํ•ด ์ถœ๋ ฅ์ด ๋ฐ”๋€Œ๋Š” ์ผ์ด ์—†์Œ. ํ•จ์ˆ˜์˜ ์ถœ๋ ฅ ๊ฐ’์€ ์˜ค๋กœ์ง€ ์ž…๋ ฅ ๊ฐ’์—๋งŒ ์˜ํ–ฅ ๋ฐ›์Œ.
  • ํ•จ์ˆ˜๊ฐ€ 1๊ธ‰ ๊ฐ์ฒด(first class)๋กœ ์ทจ๊ธ‰ ๋ฐ›์Œ. ์‰ฝ๊ฒŒ ๋งํ•ด ํ•จ์ˆ˜ ์ž์ฒด๋ฅผ ๋ณ€์ˆ˜์— ์ €์žฅํ•˜๊ฑฐ๋‚˜ ๋ฐ˜ํ™˜/์ „๋‹ฌ ํ•  ์ˆ˜ ์žˆ์Œ.
  • ๋ช…๋ น์„ ์‹คํ–‰ํ•œ๋‹ค๋Š” ๊ฐœ๋…๋ณด๋‹ค๋Š” ์‹(expresison)์„ ์ •์˜ํ•˜๊ณ  ๊ทธ ์‹์˜ ๊ฐ’์„ (eval) ๊ตฌํ•˜๋Š” ๊ฐœ๋…์œผ๋กœ ์ฝ”๋“œ ๊ตฌ์„ฑ.

 

ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์˜ˆ์ œ

ํ˜„์žฌ ํ•จ์ˆ˜ํ˜•์„ ๊ฐ€์žฅ ์ž˜ ํ™œ์šฉํ•˜๊ณ ์žˆ๋Š” ๋Œ€ํ‘œ์ ์ธ ์–ธ์–ด๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ๊ธฐ์กด์˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹๊ณผ ํ•จ์ˆ˜ํ˜•์ด ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅธ์ง€ ๋น„๊ตํ•ด๋ณด์ž.

 

์ผ๋ฐ˜์ ์ธ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ
// ์ „ํ†ต์ ์ธ ๋ช…๋ นํ˜•(C์–ธ์–ด) ๋ฐฉ์‹์œผ๋กœ, ๋ณ€์ˆ˜๋กœ ๋ฉ”๋ชจ๋ฆฌ์— ์ ‘๊ทผํ•˜๊ณ  ์ฝ”๋“œ๋ฅผ ํ•œ์ค„์”ฉ ์‹คํ–‰ํ•œ๋‹ค.

// names = [ ๋ฐ์ดํ„ฐ1, ๋ฐ์ดํ„ฐ2 ... ]
const result = [];
 
for (let i = 0; i < names.length; i += 1) {
  const name = names[i];
  const spaceName = name.replace(/(_|-)/, " ");
  const splitName = spaceName.split(" ");
 
  for (let j = 0; j < splitName.length; j += 1) {
    let partName = splitName[j];
    partName = partName.charAt(0).toUpperCase() + partName.slice(1);
    splitName[j] = partName;
  }
 
  result.push(splitName.join(' '))
}
 
result.sort();

 

ํ•จ์ˆ˜ํ˜• ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ
// ํ•จ์ˆ˜๋ฅผ 1๊ธ‰ ๊ฐ์ฒด(first-class citizen)๋กœ ์ทจ๊ธ‰ํ•œ๋‹ค. ์‰ฝ๊ฒŒ๋งํ•ด ๋ณ€์ˆ˜์ฒ˜๋Ÿผ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•˜๊ณ  ์ฃผ๊ณ  ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.
// ๋ถ€์ˆ˜ํšจ๊ณผ(side-effect)๋ฅผ ์—†์• ๊ธฐ ์œ„ํ•ด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ฝ๋Š” ๊ฒƒ ์ด์™ธ์— ์ง์ ‘ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š๋Š”๋‹ค.

// names = [ ๋ฐ์ดํ„ฐ1, ๋ฐ์ดํ„ฐ2 ... ]
const replaceSpace = (str) => {
  return str.replace(/(_|-)/, ' ');
}
 
const startCase = (str) => {
  return str.charAt(0).toUpperCase() + str.slice(1);
}
 
const changePartStartCase = (str) => {
  return str.split(' ').map(startCase).join(' ')
}
 
names // names ๊ฐ์ฒด๋ฅผ ์ฝ์–ด๋“ค์ธ๋‹ค. ์ง์ ‘ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š๋Š”๋‹ค.
.map(name => replaceSpace(name)) // ๋ฏธ๋ฆฌ ์ •์˜ํ•ด๋‘” ํ•จ์ˆ˜๋ฅผ ์ ์šฉ์‹œํ‚จ๋‹ค.
.map(name => changePartStartCase(name))
.sort() 
// map()์€ ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ์ฝ์–ด๋“ค์—ฌ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ ๋‹ค.
// ์ฆ‰ ์—ฌ๊ธฐ์—์žˆ๋Š” sort()๋Š” names๋ฅผ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š๋Š”๋‹ค.

 

 

์ˆœ์ˆ˜ํ•จ์ˆ˜๋ž€

ํ•˜์Šค์ผˆ ์‹์€ ์ˆœ์ˆ˜ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ์— ํ•ญ์ƒ ์ฐธ์กฐ ํˆฌ๋ช…(referentially transparent)ํ•˜๋‹ค.

๋ง์ด ์ƒ๋‹นํžˆ ์–ด๋ ค์šด๋ฐ, ์ด๋ฅผ ํ’€์–ด์„œ ๋งํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • ๊ฐ’์˜ ์ƒํƒœ ๋ณ€๊ฒฝ(mutation)์ด ์—†๋‹ค. ๋ชจ๋“  ๋ณ€์ˆ˜, ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋Š” ์ดˆ๊ธฐํ™” ์ดํ›„ ๋ถˆ๋ณ€(immutable)ํ•œ ๊ฐ’์ด๋‹ค.
  • ํ•จ์ˆ˜์— ์˜ํ–ฅ์„ ์ฃผ๋Š” ์™ธ๋ถ€ํ™˜๊ฒฝ(side effect)์ด ์—†๋‹ค.
    (๋ฉ”๋ชจ๋ฆฌ ๊ฐ’์„ ์ง์ ‘ ์ˆ˜์ •ํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ „์—ญ๋ณ€์ˆ˜๋ฅผ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ ๋ฉ”๋ชจ๋ฆฌ I/O๋“ฑ์„ ๋ฐœ์ƒ ์‹œํ‚ค์ง€ ์•Š๋Š”๋‹ค.)
  • ์ฆ‰, ๊ฐ™์€ ํ•จ์ˆ˜์— ๊ฐ™์€ ์ธ์ž๋ฅผ ์ „๋‹ฌํ•˜๋ฉด ์–ธ์ œ๋‚˜ ๊ฐ™์€ ๊ฒฐ๊ณผ ๊ฐ’์„ ๋ณด์žฅ๋ฐ›๋Š” ์ˆœ์ˆ˜ํ•œ ํ•จ์ˆ˜ ๊ทธ ์ž์ฒด์ด๋‹ค.

 

 

์ง€์—ฐ ๊ณ„์‚ฐ ํ‰๊ฐ€ (Lazy Evaluation)

ํ”„๋กœ๊ทธ๋žจ์—์„œ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰ ๋  ๋•Œ, ๊ฐ’์„ ํ‰๊ฐ€(eval)ํ•˜๋Š” ๋ฐฉ๋ฒ•์—๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.

ํ•˜์Šค์ผˆ์—์„œ๋Š” Lazyํ•˜๊ฒŒ ํ•จ์ˆ˜๋ฅผ ํ‰๊ฐ€ํ•œ๋‹ค. ์‰ฝ๊ฒŒ ๋งํ•ด ํ•จ์ˆ˜์˜ ๊ฐ’์ด ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— ๋ฏธ๋ฆฌ ๊ณ„์‚ฐํ•˜์ง€ ์•Š๋Š”๋‹ค.

์ œ๊ณฑ ํ•จ์ˆ˜ square์„ ์‹คํ–‰์‹œ์ผœ ๊ฐ’์„ ์–ป๋Š” ๊ณผ์ •์„ ์‚ดํŽด๋ณด์ž.

#strict - ์‹์ด ๋‚˜์˜ฌ ๋•Œ ๋งˆ๋‹ค ๋ฐ”๋กœ ๊ฐ’์„ ๊ณ„์‚ฐํ•˜๋Š” ๋ฐฉ๋ฒ•
 square(3 + 4)
 square(7)
 7 * 7
 49
 
#Lazy - ์ตœ๋Œ€ํ•œ ๋Šฆ์ถ”๋‹ค๊ฐ€ ๋‚˜์ค‘์— ๊ณ„์‚ฐํ•˜๋Š” ๋ฐฉ๋ฒ•
 square(3 + 4)
 (3 + 4) * (3 + 4)
 7 * (3 + 4)
 7 * 7
 49

Lazyํ•˜๊ฒŒ ๊ฐ’์„ ํ‰๊ฐ€ํ•˜๋ฉด

  • ๊ณ„์‚ฐํ•  ๋•Œ ํ•„์š”ํ•œ ์ถ”๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๊ณ 
  • ์—ฌ๋Ÿฌ ํ•จ์ˆ˜๋ฅผ ์‰ฝ๊ฒŒ ํ•ฉ์น˜๊ณ  ๋…ผ๋ฆฌ์ ์œผ๋กœ ์‹์„ ํ‘œํ˜„(ex ๊ฐฏ์ˆ˜๊ฐ€ ๋ฌดํ•œ์ธ ๋ฆฌ์ŠคํŠธ ์ ‘๊ทผ) ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ
  • ํ”„๋กœ๊ทธ๋žจ์—์„œ ํŠน์ • ๊ธฐ๋Šฅ์„ ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์‰ฝ๊ฒŒ ๋ถ„๋ฆฌํ•  ์ˆ˜ ์žˆ๊ณ  ์‹คํ–‰ ๋„์ค‘ ์˜ค๋ฅ˜์˜ ์ƒํƒœ๋ฅผ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋‹ค

ํ•˜์ง€๋งŒ ํ”„๋กœ๊ทธ๋žจ์˜ ์‹œ๊ฐ„/๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ ํŒจํ„ด์„ ํŒŒ์•…ํ•˜๊ธฐ ์–ด๋ ค์›Œ์ง€๊ณ , ๋ฏธ๋ฃจ๊ณ  ๋ฏธ๋ฃจ๋‹ค๊ฐ€ ๋งˆ์ง€๋ง‰์— ๊ณ„์‚ฐ ๊ณผ์ •์—์„œ ๋ชจ๋“  ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ์‹œ์Šคํ…œ์— ํฐ ๋ถ€๋‹ด์„ ์ค„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค.

๋ธ”๋กœ๊ทธ์˜ ์ •๋ณด

JiwonDev

JiwonDev

ํ™œ๋™ํ•˜๊ธฐ