๐ Functional Programming Conference LiftIO 2021
๐ ์ฐ์๋ ์ฐ์ฐ์ผ๋ก ๊พธ๋ ค์ง ๊ฐ๋ฐํ์ ํจ์ํ Scala ํ์ฉ๊ธฐโ
Github Repoโ
package purecoincidence
object HigherLevel extends App {
def factA(n: Int): Int = {
var r = 1
for {
i <- 1 to n
} r *= i
r
}
def factB(n: Int): Int =
if (n <= 1) 1
else n * factB(n - 1)
def factC(n: Int): Int =
(1 to n).product
println((
factA(5),
factB(5),
factC(5)
)) // => (120,120,120)
}
FP ํน์งโ
- ๊ธฐ๊ณ ์ค์ฌ ๊ด์ ๊ณผ ์ฌ๋ ์ค์ฌ ๊ด์ ์ ์ฐจ์ด
- ์์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ํจ์๋ฅผ ํฉ์ฑํด ํฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ฝ๋ค.
- ์ํ๋ ๋ถ์ํจ๊ณผ์์ด ์์ ํจ์์ ์ ๋ ฅ๊ณผ ์ถ๋ ฅ๋ง์ ๋ค๋ฃฌ๋ค๋ฉด, ๊ทธ๋งํผ ์ถ๋ก ์ด๋ ํ ์คํธ๊ฐ ์ฝ๋ค.
- ์๊ฐ๊ณผ ์ํ๋ฅผ ๊ณ ๋ คํ์ง ์์๋ ๋๋ค.
- ๋ฉํฐ์ค๋ ๋ ์ฒ๋ฆฌ๊ฐ ํจ์ฌ ์ฌ์์ง๋ค.
๊ณ ์ฐจํจ์โ
- ์ด๋ค ํจ์๊ฐ, ๋ค๋ฅธ ํจ์๋ฅผ ์ธ์๋ก ๋ฐ๊ฑฐ๋, ํธ์ถ ๊ฒฐ๊ณผ๋ก ๋ณดํต์ ๊ฐ์ด ์๋ ํจ์๋ฅผ ๋ฐํํ๊ฑฐ๋, ๋๋, ๊ทธ ๋ ๋ค๋ฅผ ํ๋ค.
- ํจ์๋ฅผ ํ๋ฒํ ๊ฐ์ผ๋ก ์ทจ๊ธํ ์ ์์ด์ผ ๊ฐ๋ฅ.
package purecoincidence
object HigherOrderFunction {
def multiple(n: Int): Int => Int =
x => x * n
def pow(r: Int): Int => Int =
x => List.fill(r)(x).product
val triple: Int => Int = multiple(3)
val square: Int => Int = pow(2)
def main(args: Array[String]) =
println((
List(1, 2, 3, 4).map(triple compose square),
List(1, 2, 3, 4).map(square).map(triple)
)) // => List(3, 12, 27, 48), ...
}
์์ ํจ์โ
๊ฐ์ ์ธ์๋ฅผ ๋๊ฒจ ํธ์ถํ๋ฉด, ์ธ์ ๋ ๊ฒฐ๊ณผ๊ฐ์ด ๊ฐ๊ฒ ๋์จ๋ค.
ํจ์๋ฅผ ํธ์ถํด๋, ๋ณ๋์ ๋ถ์ ํจ๊ณผ๊ฐ ๋ฐ์ํ์ง ์๋๋ค.
- Impure
// Impure ํ๋ค.
package purecoincidence
object Impurity extends App {
var current: Int = 0
def impure(n: Int): Int = {
current += n
current
}
val i = impure(2)
println((
i + i,
impure(2) + i,
impure(2) + impure(2)
)) // (4,6,14)
}
- pure
package purecoincidence
object Purity extends App {
def pure(a: Int, b: Int): Int =
2*a*a + 3*b // 2a^2 + 3b
val p = pure(2, 3) // => 17
println((
p + p,
pure(2, 3) + p,
pure(2, 3) + pure(2, 3),
)) // => (34,34,34)
}
package purecoincidence
object PurelyLong extends App {
def pure(a: Int, b: Int): Int =
2*a*a + 3*b // 2a^2 + 3b
def expressionA(a: Int, b: Int): Int =
4*a*a + pure(a, b) + 6*b
def expressionB(a: Int, b: Int): Int =
3 * pure(a, b)
println((
expressionA(3, 4),
expressionB(3, 4)
)) // => (90,90)
}
(๋ชจ๋ ธ์ด๋)monoidโ
- empty, combine
- ๊ฒฐํฉ๋ฒ์น, ํญ๋ฑ์
์ต์ ๋ชจ๋๋โ
- pure, flatMap
- ์ต์ ๋ชจ๋๋ - ๊ฐ ์ ๋ฌด, ์๋ฌ ์ ๋ฌด๋ฅผ ๋ค๋ฃจ๊ธฐ ๋ฌด์์ด ํธํ๊ฐ.