Functional Programming How?

scala 2015. 7. 18. 11:27

<FP 기법>

1. carry Over  :  tail recursive 처럼 결과값을 계속 넘기는 방식. (carry Over: 그냥 영어임.)  

2. predicate : 함수는 f()로 표현. Boolean을 리턴하는 함수는 predicate 이라고 부름.
       (이것도 scala에선 그냥 영어임. java엔 Predicate존재) 

=> p()를 이용해  함수 input  param들을 필터처럼 거를 수 있음

 

 

<FP기법 예제 - 1.carryOver>


object Main{

  def total(list: List[Int]) = { //기존 sum함수
    var sum = 0
    for (i <- list) { sum += i }
    sum
  }

  def totalFP(list:List[Int]) = { //부분합을 계속 넘기면서 합을 해나가는 방식.  foldLeft함수가 첫번째 param으로 carryOver로 계속 받아 주면서 iterate를 제공.
    list.foldLeft(0) { (carryOver,v) => carryOver + v }
  }

  def main(args:Array[String]) = {
    println(totalFP(List(1,2,3,4,5)))
  }
}

 

 

<FP기법 예제 - 2.Predicate>

def totalFP(list:List[Int] , p:Int => Boolean) = {
list.foldLeft(0) { (carryOver,v) => if (p(v)) carryOver + v else carryOver }
}

def main(args:Array[String]) = {
println(totalFP(List(1,2,3,4,5),{ v => v % 2 == 0 })) //짝수인 2,4 만 적용되서 합이 6 이 나옴.
}

추가적으로 v => v > 4 같은 predicate은 _ > 4 로 표시 가능

 

 

그리고 아래 3가지들이 scala에서 좀 특별하다.

trait -  java의 Interface와 비슷하지만, class특성도 지님.

   <trait특성 >

     - extends 로도 with 로도 사용가능하다. 심지어는 구현body가 존재해도 된다.

     - with의 경우에는 여러가지 trait가 사용가능하며, with A, with B의 경우 B가 먼저 적용된다.

     - override abstract라는 키워드를 사용하여 기존 def를 추상화하여 사용할 수도 있다.

     - Class 가 아니고 인스턴스에도 사용가능 : with Friends

 

xml - xml이 1등급 고객임. "" 필요없음

actor - thread + 큐 : 수천개의 actor를 만들어도 된다


자세한 건 여기클릭: hillarious indian guy

 

 

Posted by yongary
,