Skip to content

Instantly share code, notes, and snippets.

@atomita
Last active September 12, 2019 01:17
Show Gist options
  • Save atomita/503748059a1462e973ed159f60d7db2f to your computer and use it in GitHub Desktop.
Save atomita/503748059a1462e973ed159f60d7db2f to your computer and use it in GitHub Desktop.

まずは整形と階乗を計算する関数factorialに分離

const factorial = (
  a => {
    return (
      b => a(c => b(b)(c))
    )(
      b => a(c => b(b)(c))
    )
  }
)(
  f => n => n === 0 ? 1 : n * f(n - 1)
)

factorial(4)

fを受け取る関数に命名

function createRecursion (f) {
  return n => n === 0 ? 1 : n * f(n - 1)
}

const factorial = (
  a => {
    return (
      b => a(c => b(b)(c))
    )(
      b => a(c => b(b)(c))
    )
  }
)(
  createRecursion
)

factorial(4)

createRecursionが渡されているところの変数名変更

function createRecursion (f) {
  return n => n === 0 ? 1 : n * f(n - 1)
}

const factorial = (
  _createRecursion => {
    return (
      b => _createRecursion(c => b(b)(c))
    )(
      b => _createRecursion(c => b(b)(c))
    )
  }
)(
  createRecursion
)

factorial(4)

b => _createRecursion(c => b(b)(c))のところ命名
2つあるので_つけて区別(念の為

function createRecursion (f) {
  return n => n === 0 ? 1 : n * f(n - 1)
}

const factorial = (
  _createRecursion => {
    return (
      warapCreateRecursion => {
        return _createRecursion(c => {
          return warapCreateRecursion(warapCreateRecursion)(c)
        })
      }
    )(
      _warapCreateRecursion => {
        return _createRecursion(c => {
          return _warapCreateRecursion(_warapCreateRecursion)(c)
        })
      }
    )
  }
)(
  createRecursion
)
  
factorial(4)

上で命名したとこを共通にして分離してみる

function createRecursion (f) {
  return n => n === 0 ? 1 : n * f(n - 1)
}

function wrappingCreateRecursion(_createRecursion) {
  return warapCreateRecursion => {
    return _createRecursion(c => {
      return warapCreateRecursion(warapCreateRecursion)(c)
    })
  }
}

const factorial = (
  _createRecursion => {
    return (
      wrappingCreateRecursion(_createRecursion)
    )(
      wrappingCreateRecursion(_createRecursion)
    )
  }
)(
  createRecursion
)

factorial(4)

_createRecursionがなくても大丈夫そうなのでなくしてみる

function createRecursion (f) {
  return n => n === 0 ? 1 : n * f(n - 1)
}

function wrappingCreateRecursion(warapCreateRecursion) {
  return createRecursion(c => {
    return warapCreateRecursion(warapCreateRecursion)(c)
  })
}

const factorial = wrappingCreateRecursion(
  wrappingCreateRecursion
)

factorial(4)

yCombinatorとしてwrappingCreateRecursionを内包するようにしてみる

function createRecursion (f) {
  return n => n === 0 ? 1 : n * f(n - 1)
}

function yCombinator(_createRecursion) {
  function wrappingCreateRecursion(warapCreateRecursion) {
    return _createRecursion((...args) => {
      return warapCreateRecursion(warapCreateRecursion)(...args)
    })
  }
  return (
    wrappingCreateRecursion
  )(
    wrappingCreateRecursion
  )
}

const factorial = yCombinator(createRecursion)

factorial(4)

wrappingCreateRecursionの引数はなくても大丈夫みたい

function createRecursion (f) {
  return n => n === 0 ? 1 : n * f(n - 1)
}

function yCombinator(_createRecursion) {
  function wrappingCreateRecursion() {
    return _createRecursion((...args) => {
      return wrappingCreateRecursion()(...args)
    })
  }
  return wrappingCreateRecursion()
}

const factorial = yCombinator(createRecursion)

factorial(4)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment