기능함수 JS를 작성하는 바보 안내서(2부)

본고에서 나는 함수식 프로그래밍의 핵심 개념을 소개했다.그 문장에서 우리는 곧 순함수를 소홀히 했다.본문에서 나는 함수를 더욱 상세하게 토론하려고 한다.
만약 함수 프로그래밍을 하는 데 절대적으로 필요한 것이 있다면, 그것은 함수에 대한 좋은 이해이다.(이름에서 추정할 수 있을 것 같습니다. * 함수 * al 프로그래밍)

함수는 무엇입니까?


만약 네가 어떤 유형의 프로그래머라면, 너는 이미 함수에 익숙해졌을 것이다.하지만, 나는 여전히 당신들에게 함수가 무엇인지 물어볼 것입니다.
나는 몇몇 JS 직원들이 함수가 무엇인지 알고 있다고 말하는 것을 들었다.
function doSomething(x) {
  return x + 42;
}
바로 이거예요👆) 사정아니면 이거
const addTwo = function (x) {
  return x + 2;
}
아니면 진정으로 똑똑한 사람이 생각하는 것이 바로

const addOne = x => x + 1
네, 이 모든 것이 기능입니다.
그러나 이것들은 모두 함수의 예이다.내가 너에게 고려하고 싶은 것은,

What is a function? What does it do?


컴퓨터 과학의 세계는 수학의 세계와 얽혀 있다.함수는 우리가 수학 세계에서 빌려 쓰는 많은 것 중의 하나다.
그러나 수학은 매우 추상적이다.따라서 수학에서 함수의 정의를 찾으면 다중을 발견할 수 있다.내가 좋아하는 건,

A function is a relation between 2 sets


아니면 그렇게 추상적이지 않은 컴퓨터 과학 용어로.

A function is a mapping between an input and an output


그래서 우리는 함수는 입력을 받아들이고 출력을 되돌려주는 것이라고 말할 수 있다.
현재 하나의 사물은 함수로 간주되기 전에 반드시 몇 가지 규칙을 따라야 한다. 가장 중요한 규칙은 다음과 같다.
  • 여러 입력을 단일 출력에 매핑할 수 있음
  •   // for a function fx,
      fx(1) // => true
      fx(-1) // => true
    
  • 동일한 입력은 여러 출력에 매핑할 수 없습니다.
  • 이것은 불확실성을 초래하기 때문에 컴퓨터 과학과 수학에서 모두 취할 수 없는 것이다.
      fx(1) // it should not be true once and false the next second.
    
    지금 생각하겠지만,

    What about functions that don't return anything.


    나는 (이 토론의 목적에도 관심이 없다) 다른 언어에서의 행동을 모르지만, JS에서는 네가 원하든 원하지 않든 너의 함수는 항상 뭔가를 되돌려준다.
    만약 네가 정말 무엇을 갚았다면, 그것은 매우 좋다.
    그러나 없는 경우 JS가 반환합니다undefined.
    그래서 당신의 함수는 아무것도 돌아오지 않습니다. 실제로는 일부 입력에서 undefined 까지의 반사입니다.그러나 더 중요한 것은 당신이 다른 곳에서 이런 함수의 결과를 얻을 수 있다는 것이다. 아마도 이 함수는 결과를 그 작용역 이외의 변수로 미루었을 것이다.
    이런 상황에서 이것은 불순한 기능과 그로 인한 부작용이다.너는 아마 이렇게 하는 것을 피해야 할 것이다.
    하지만 생각할지도 모르지만,

    What about functions that don't take an input.


    몇 가지 방식 중 하나가 있는데,
  • 만약 입력이 없는 상황에서 함수를 호출하면 함수는 항상 가치 있는 내용을 되돌려준다.
    함수는 빈 집합 (없음) 에서 값으로 매핑됩니다.
    함수

  • 우리가 토론한 바와 같이, 당신의 함수는 어떤 입력도 받아들이지 않고, 어떤 내용도 되돌려주지 않습니다(또는undefined.
  • 그것은 쓸모없는 것이지만 일종의 기능이다.
  • 그 출력은 유용하지만, 그 출력은 반환값으로 사용할 수 없습니다. 그 출력은 (순수한) 함수가 아닙니다. 부작용이 발생할 수 있기 때문에 피해야 합니다.
  • 이제 우리는 함수가 무엇인지 알게 되었지, 그렇지?이것이 바로 함수에 관한 모든 지식입니까?
    아니오, 사랑하는 독자님.너는 터널에 들어가 함수를 배울 수 있다.하지만 우리를 위해 JS에서 FP를 배웁니다.우리는 상술한 규칙을 따르는 특수한 유형의 함수를 토론하고 재미있는 일을 할 수 있다.

    귀속 함수


    너는 계승이 무엇인지 아니?
    이것은 네가 수학에서 표현한 것이다. 숫자 뒤에 느낌표가 하나 있다. 예를 들어 5!.
    얘는 뭐 해요?이것은 재미있는 수학으로 우리가 지금 토론하지 않으려는 많은 일에 매우 유용하다.중요한 것은 코드의 계승을 얻기 위해 숫자 뒤꿈치와 느낌표만 사용해서는 안 된다는 것이다.우리는 스스로 이 기능을 개발해야 한다.
    다행히도 계승은 매우 직관적이다.곱셈에 관해서는 단지 두 가지 규칙이 있으니, 너는 그것들로 임의의 곱셈을 얻을 수 있다.
  • 0의 계승은 1이다.
    또는0! = 1
  • 숫자 X의 곱셈은 X 곱셈 (X-1) 의 곱셈입니다.
  • 또는n! = n ✕ (n-1)!예:5! = 5 * 4!만약 우리가 3의 계승을 찾고 싶다면, 그것은 이렇게 될 것이다.
    3! = 3 * 2!
    2! = 2 * 1!
    1! = 1 * 0!
    0! = 1
    
    Simplifying,
    3! = 3 * 2 * 1 * 1
    
    만약 우리가 함수에서 이런 행위를 실현하고 그것을 호출하고 싶다면fac.어떻게 할 거예요?
    순환과if-else 문장을 고려하고 있을 수도 있습니다.그러나 매우 간단한 방법이 있다. 우리는 계승의 규칙을 한 글자씩 코드로 번역할 수 있는데 그것이 작용할 것이다.
    일이 이렇다
    function fac (n) {
      if (n === 0) return 1 // this is our rule number 1 being satisfied.
      return n * fac(n-1) // rule number 2 being satisfied
    }
    
    그렇습니다!이것은 매우 간단하고 기능이 강한 계승 실현이다.
    그럼, 그것은 어떻게 일합니까?
    이것은 귀속의 한 예이다.어떤 일을 하거나 결과를 얻기 위해 자신을 호출하는 함수
    세계의 모든 (내포) 귀속 중에는 항상 적어도 두 개의 논리적 사례가 있다.
  • 함수는 자신의 기본 상황을 호출하지 않는다(따라서 귀속은 무한 나선이 아니다).
  • 함수는 자신의 귀속 상황을 호출한다.
  • 위의 예에서
    두 번째 줄은 우리의 기본 상황이다.네가 이미 알아차렸듯이, 이것은 통상적으로 계산하기 쉽거나 이미 알고 있는 것들이다.
    #3 줄은 우리의 귀속 상황으로 통상적으로 우리가 중복 행위를 방치하는 곳이다.
    경고 한마디로

    While JavaScript is usually a good enough language for exploring functional concepts, this is one of the places where functional and JS doesn't necessarily agree.

    A recursion is usually fine for simple algorithms that don't need too many recursive calls in JS. But, if your algorithms does a recursive call way too many times, its either not gonna perform well or going to crash because of a stack overflow.

    In future, We might discuss techniques such as memoization to get over this kind of limitations or to make our code more performant than a naive recursion.


    고급 함수


    앞에서 토론한 바와 같이 우리는 바로 주제를 향해 나아가자...함수는 입력에서 출력까지의 맵입니다.
    고급 함수는 비치는 함수이고,
  • 기능(입력)에서 출력까지
  • 입력에서 기능까지
  • 기능(입력)에서 기능(출력)
  • 이걸 다 흡수하는 데 시간이 좀 걸려.만약 한 함수가 이 세 가지 일 중 하나를 한다면, 그것은 고급 함수이다.
    몇 가지 예를 들자.
    function propSatisfies(prop, pred, obj) {
      let val = obj[prop]
      return pred(val)
    }
    
    let data = {
      age: 21
    }
    
    function isAdult (age) {
      return age >= 18
    }
    
    propSatisfies('age', isAdult, data) //=> true
    
    위의 예에서
    우리의 함수propSatisfies는 3개의 인자(입력)를 포함한다.prop: 문자열(속성 이름)pred: 입력을 받아들여true 또는false로 되돌아오는 함수obj: prop 속성의 대상을 대조pred 검사합니다.
    우리 함수는 값 true 또는 false 을 되돌려줍니다.
    마지막 줄에서 우리는 세 개의 값 호출 propSatisfies 함수를 사용한다.prop => 'age' pred => isAdult obj => data isAdult는 간단한 함수로 나이를 받아들이고 true 또는 false (즉 술어) 로 되돌아간다.이것은 고급 함수가 아니다'age' 문자열이므로 고급 함수가 아닙니다.obj는 고급 함수가 아니라 대상이다.
    그렇다면 어느 것이 고급 함수입니까?propSatisfies왜?함수 isAdult 를 값 true 또는 false 에 매핑하기 때문입니다.
    우리 또 다른 고급 함수를 봅시다.
    function add(a) {
      return function (b) {
        return a + b;
      }
    }
    
    let addOne = add(1) //=> this returns a function
    let addTen = add(10) //=> this too returns a function
    
    addTen(1) //=> returns 11
    
    이 예에서add는 하나의 매개 변수 a (숫자) 를 받아들이는 함수입니다.
    우리의 함수는 다른 함수로 되돌아간다.add, 이것은 하나의 함수를 되돌려주기 때문에 고급 함수입니다.
    우리의 add 함수는 또 다른 재미있는 FP 개념을 채택하여 폐쇄라고 부른다. 우리는 다른 날에 우리의 함수와 폐쇄가 어떻게 작동하는지 토론할 것이다.토론에 편리하도록 add 는 다른 함수로 되돌아가기 때문에 고급 함수임을 이해해 주십시오.
    이 두 가지 임무를 완성하는 최종 함수를 보고 함수를 받아들이고 함수를 되돌려줍니다.
    function combine(outer, inner) {
      return function (arg) {
        return outer(inner(arg))
      }
    }
    
    function double (num) {
      return 2 * num
    }
    
    function square (num) {
      return num * num
    }
    
    let dSquare = combine(square, double) //=> a function that doubles and then squares a number
    
    이 예에서combine 두 개의 매개 변수outerinner를 받아들인다. 이 두 매개 변수는 모두 함수여야 한다.우리는 이미 그것이 고급 함수라는 것을 보았다combine는 내부와 외부의 기능을 결합한 함수를 되돌려준다.다시 한 번, 그것은 고급 함수입니다. (함수를 되돌려주기 때문입니다.)
    combine withsquaredouble를 매개 변수로 호출할 때, 이 함수는 매개 변수 arg 를 받아들이고, inner 호출 arg 을 사용하여 값을 되돌려주고, outer 호출된 반환 값 호출 inner 을 사용합니다.본질적으로 이 두 가지 기능의 결합.그래서 dSquare는 현재 하나의 함수로 숫자를 정할 때 먼저 그것을 배로 한 다음에 제곱을 한 다음에 이 연산의 결과를 되돌려준다.
    뒤의 글에서 우리는 기본적으로 combine이지만 더욱 유연하고 강한 함수를 토론할 것이다.(진정으로 궁금한 사람에게는 찾아보세요compose.

    오늘은 여기까지입니다, 여러분.


    평화롭다✌️

    좋은 웹페이지 즐겨찾기