Kotlin (17) 함수 식 프로 그래 밍 < 1 >

2655 단어
앞에서 말 했 듯 이 함수 식 프로 그래 밍 은 협의 와 광의 두 가지 측면 으로 나 뉘 는데 협의 함수 식 프로 그래 밍 은 매우 엄격 한 기준 을 가지 고 순 함수 프로 그래 밍 만 통 해 부작용 이 있 을 수 없고 모든 데이터 구 조 는 바 꿀 수 없다.
넓 은 의미 의 함수 식 프로 그래 밍 은 모두 순수 함 수 를 강조 하지 않 는 다.일반적인 함수 식 언어 특성:
  • 함 수 는 일등 공민
  • 편리 한 폐쇄 문법
  • 재 귀적 구조 목록
  • 코 리 화 함수
  • 타성 구 치
  • 모드 매 칭
  • 꼬리 순환 최적화
  • 강력 한 범 형 능력, 고급 유형 (정적 유형의 함수 식 언어 지원)
  • 포함
  • Typeclass
  • 유형 유도.Kotlin 은 위의 대부분의 기능 을 지원 합 니 다.

  • 순 함수 와 인용 투명 성
    sealed class Format
    data class Print(val text: String) : Format()
    object Newline : Format()
    val string = listOf(Print("Hello"),
        Newline, Print("Kotlin"))
    fun unsafeInterpreter(str:List){
        str.forEach {
            when(it){
                is Print -> print(it.text)
                is Newline -> println()
            }
        }
    }
    

    부작용 도입
    1. 테스트 가능성 이 부족 하 다.변경 되면 print 가 아 닌 데이터 베 이 스 를 쓰 는 방법 을 추가 하고 테스트 할 때 번 거 로 울 수 있 습 니 다.
    2. 조합 하여 재 활용 하기 어렵다.내부 에 문자열 형식 전환 논리 가 혼합 되 어 있 습 니 다. 인쇄 작업 이 아니 라 데이터 베이스 작업 이 라면 문자열 변환 기능 으로 사용 할 수 없습니다.
    조금 만 바 꾸 고 예 를 들 어 설명 하 세 요.
    fun stringInterpreter(str:List)
            = str.fold(""){fullText,s ->
        when(s){
            is Print -> fullText + s.text
            is Newline ->fullText + "
    " } }

    함수 가 문자열 결 과 를 되 돌려 줍 니 다. 테스트 든 재 활용 이 든 모두 향상 되 었 습 니 다. 하나의 표현 식 은 프로그램 에서 결과 에 영향 을 주지 않 고 등가 의 값 으로 바 꿀 수 있 습 니 다.
    하나의 함수 가 인용 투명 성 을 갖 추고 내부 행 위 는 외부 상 태 를 바 꾸 지 않 습 니 다.
    수학 속 의 등식 추리 와 비슷 하 다.
    인용 투명 은 가 변 적 이지 않다 는 것 이 아니 라 부분 적 으로 가 변 적 이 며 전체 호출 은 블랙 박스 이 며 결 과 는 일치 합 니 다.
    fun foo(x:Int):Int{
        var y = 0
        y = y + x
        return y
    }
    

    foo 는 순수 함수 f (x) - > y 를 갖 추고 있 습 니 다.
    부작용 은 일정한 추상 적 인 개념 에서 부작용 이 절대 없 는 것 이 아니 라 순 함수 라 도 메모 리 를 사용 하여 cpu 를 점용 합 니 다.
    순 함수 가 한계 가 있 는 random 랜 덤 함수 결과 가 일치 하지 않 는 것 은 모두 다 릅 니 다. 순 함수 가 아 닙 니 다.
    대체 모델 과 타성 값 구하 기
    잘못된 예 StackOverflow 오류 순환
    fun f1(x:Int,y:Int) = x
    fun f2(x:Int):Int = f2(x)
    
  • 응용 순서 와 정규 순서
  • kotlin 에 서 는 f2 (2) 에 대해 먼저 값 을 구하 기 때문에 사 순환 을 초래 할 수 있 습 니 다. 그러나 Hashell 과 같은 오래된 순 함수 언어 는 f1 (1, y) 을 먼저 호출 합 니 다. y 가 사용 되 지 않 기 때문에 f2 (2) 에 값 을 구하 지 않 습 니 다.
  • 타성 구 치 를 시 뮬 레이 션 해 보 세 요. 예 를 들 어 println 을 대상 으로 그 는 비 순 함수 입 니 다. 그 를 'lazy'
  • 로 개조 합 니 다.
    fun lazyPrintln(msg:String) = { println(msg)}
    

    우리 가 lazy Println ("I am IO operation") 을 실행 할 때 그 는 실행 가능 한 println 만 되 돌려 주 는 것 은 타성 이 고 대체 할 수 있 습 니 다.

    좋은 웹페이지 즐겨찾기