CNCマシンの解読

高レベルのCNC工作機械解読関数は、他の関数を操作する関数であり、パラメーターとして、または関数を返すことによって使用できます。簡単に言うと、高次関数は、関数をパラメーターとして取るか、関数を出力として返す関数です。
たとえば、Array.prototype.map、Array.prototype.filter、Array.prototype.reduceは、いくつかの高次関数です。
他のJSシリーズの記事へようこそ
JS基本概要(1)-データタイプ
JS基本概要(2)-プロトタイプとプロトタイプチェーン
JS基本概要(3)-スコープとクロージャ
JS基本概要(4)-これポイントアンドコール/適用/バインド
JS基本概要(5)-JS実行メカニズムとEventLoopd
テールコールおよびテール再帰
テールコール(テールコール)は、関数型プログラミングの重要な概念です。それ自体は非常に単純で、1つの文で明確に説明できます。つまり、関数の最後のステップは別の関数を呼び出すことです。
function g(x){
console.log(x)
}
function f(x){
return g(x)
}
console.log(f(1))
//上記のコードでは、関数fの最後のステップは関数gを呼び出すことです。これが最後の呼び出しです。
コードをコピーする上記のコードで、関数fの最後のステップは、末尾呼び出しである関数gを呼び出すことです。最後の操作である限り、末尾呼び出しは関数の最後にある必要はありません。
NCマシンの復号化関数は、それ自体を再帰と呼びます。テールがそれ自体を呼び出す場合、テール再帰と呼ばれます。何千ものコールフレームを同時に保存する必要があり、スタックオーバーフローエラーが発生しやすいため、再帰はメモリを大量に消費します。ただし、チームの最後の再帰では、呼び出しフレームが1つしかないため、スタックオーバーフローエラーは発生しません。
function factorial(n){
if(n === 1){
return 1
}
return n * factorial(n-1)
}
コードをコピーする上記のコードは、nの階乗を計算する階乗関数です。複雑度はO(n)で、末尾呼び出しとして書き換えると、1つの呼び出しレコードのみが保持され、複雑度はO(1)になります。
function factor(n、total){
if(n === 1){
return total
}
return factor(n-1、n * total)
}
コードのコピーフィボナッチ数列は、末尾呼び出しにも使用できます。
function Fibonacci(n){
if(n <= 1){
return 1
}
return Fibonacci(n-1)+ Fibonacci(n-2)
}
//末尾再帰
関数Fibona(n、ac1 = 1、ac2 = 1){
if(n <= 1){
return ac2
}
return Fibona(n-1、ac2、ac1 + ac2)
}
コードをコピーする
カリー化関数数学とコンピューターサイエンスでは、カリー化は複数のパラメーターを使用する関数を1つのパラメーターを使用するシリーズに変換する関数です機能テクノロジー。いわゆるカリー化とは、パラメーターの多い関数をパラメーターの少ない関数に変換するプロセスです。

//通常の関数
関数fn(a、b、c、d、e){
console.log(a、b、c、d、e)
}
//生成された
カレー関数let _fn = curry(fn )

_fn(1、2、3、4、5)//印刷:1,2,3,4,5
_fn(1)(2)(3、4、5)//印刷:1,2,3,4 、5
_fn(1、2)(3、4)(5)//印刷:1,2,3,4,5
_fn(1)(2)(3)(4)(5)//印刷:1 、2,3,4,5
コードをコピーする
カリー化された関数の実現//合計関数カリー
f1 = curry(add、1、2、3)
console.log( 'Complex version'、f1()) // 6

//カレーを実行
let f2 = curry(add、1、2)for the summation function
console.log( 'complex version'、f2(3))// 6

//合計関数に対してカレー
let を実行f3 = curry(add)
console.log( 'complex version'、f3(1、2、3))// 6

//カリー関数の複合バージョンは、次のように複数回呼び出すことができます:
console.log( 'complex version'、f3(1)(2)(3))// 6
console.log( 'complex version'、f3(1、2 )(3))// 6
console.log( 'Complex version'、f3(1)(2、3))// 6

//複雑なバージョン(無制限の数のパラメーターを渡すことができ、渡されたパラメーターの総数が
関数の仮パラメーターの総数を下回らない場合に実行されますfunction curry(fn){
// Closure
//キャッシュ分割関数fn
let args = Array.prototype.slice.call(arguments、1)を除くすべてのパラメーターは
function(){
//キャッシュされた古いパラメーターを新しい入力パラメーターに接続します(つまり、すべての入力パラメーターを最初に保存しますが、実行しません)
let newArgs = args.concat(Array.from(arguments))
if(newArgs.length <fn.length){
//累積されたパラメーターの総数がfnパラメーターの総数より少ない
//再帰的に渡されますfnと蓄積されたパラメータ
がcurry.callを返す(this、fn、…newArgs)
} else {
// call
return fn.apply(this、newArgs)
}
}
} カリー化の
コピーコードの使用法
カリーは実際には単純化するため答えられる質問は複雑ですが、同時に、関数を使用するときの自由度が高くなります。ここでの関数パラメーターの無料処理は、カレーの中核です。カレーは、本質的に汎用性を減らし、適用性を向上させます。例を見てみましょう:
私たちの仕事では、電話番号の確認、メールボックスの確認、ID番号の確認、パスワードの確認など、定期的なテストに合格する必要があるさまざまな要件に遭遇します。このとき、2つのパラメーターを受け取る一般的な関数checkByRegExpをカプセル化します。 、
チェックされる通常のオブジェクトとチェックされる文字列関数checkByRegExp(regExp、string){
return regExp.text(string)
}

checkByRegExp(/ ^ 1 \ d {10} KaTeX解析エラー:未定義の制御シーケンス:位置46の\ w:eckByRegExp(/ ^(\ ̲w̲)+(\。\ w +)* @(\ w)… /、 ' [email protected] ')//メールボックス
コピーコードを検証するには、検証するたびに正規の文字列を入力し、次に同じタイプのデータを検証する必要があります。同じ正規を複数回書き込む必要があります。我々際に使用されている、とcheckByRegExp機能自体はツールの機能は、任意の意味がありません。この点にあるので、我々はcheckByRegExp機能は、コードの書き込み簡素化コードの可読性を向上させるための支援パッケージをカレーできる。非効率的な
//カリー化
let _check = curry(checkByRegExp)
//ツール番号を生成して電話番号を検証する
let checkCellPhone = _check(/ ^ 1 \ d {10} KaTeX解析エラー:未定義の制御シーケンス:\ wの位置45:…il = _check(/ ^(\ ̲w̲)+(\。\ w +)* @(\ w)… /)

checkCellPhone( '18642838455')//電話番号を確認
checkCellPhone( '13109840560')//電話番号を確認
checkCellPhone( '13204061212')//電話番号を確認


カリー化関数パラメーター長の関数カリー化の実装では、fn.lengthは関数パラメーターの数を表すために使用されます。fn.lengthは関数のすべてのパラメーターの数を表しますか?そうではない。
関数の長さプロパティは仮パラメーターの数を取得しますが、仮パラメーターの数には残りのパラメーターの数は含まれず、デフォルト値を持つ最初のパラメーターの前のパラメーターの数のみが含まれます。
((a、b、c)=> {})。長さ
// 3

((a、b、c = 3)=> {})。length
// 2

((a、b = 2、c)=> {})。length
// 1

((a = 1、b、c)=> {})。length
// 0

((…args)=> {})。length
// 0

FN =一定(引数...)=> {
にconsole.log(args.length)
}
FN(1,2 ,. 3)
// 3つの
コピー機能コード構成
COMPOSE結合機能を連続して実行されるサブルーチン、関数の出力であります結果は、別の関数の入力パラメーターです。最初の関数が実行を開始すると、それは推定され、ドミノのように実行されます。
const Hello ${name}
Greeting = name => const toUpper = str => str.toUpperCase()

toUpper(greeting( 'Onion'))//
構成関数のHELLO ONION コピーコード特性

composeは関数をパラメーターとして受け入れ、右から左に実行し
型関数fn()のすべてのパラメーターを右端の関数に返します

composeの実装
var compose = function(…args){
var len = args.length // args関数の
数var count = len-1
var result
return function func(…args1){
// args1パラメータenumeration of func function
引数=結果は.call [カウント](この、args1)
IF(カウント> 0){
カウント-
戻りfunc.call(ヌル、結果)//結果に関数の結果を返す
} {他
//初期カウント状態に戻す
カウント= len-1
return result
}
}
}
例のコードをコピーしますvargreeting =
(name)=> Hello ${name}
var toUpper = str => str.toUpperCase()
var fn = compose(toUpper、グリーティング)
console.log(fn( 'jack '))
コードをコピーするwebpackがcomposeメソッドを選択し、ローダーは右から左に順に実行され、各ローダーは関数であるため、誰もが知っているCNCマシンの解読におけるローダーの実行順序は右から左です。
ルール:[
{test:/.css$/、use:['style-loader'、 'css-loader']}
]
上記のようにコードをコピーします。webpackはスタイルローダーとcss-loaderを使用し、css-を使用しますローダーは.cssファイルをロードし、スタイルローダーは内部スタイルをHTMLページに挿入します。
webpackの構成コードは次のとおり
です。const compose =(…fns)=> {
return fns.reduce(
(prevFn、nextFn)=> {
return value => nextFn(prevFn(value))
}、
value => value

}

元の記事を28件公開 Likes0 訪問数907

おすすめ

転載: blog.csdn.net/srhgsr/article/details/105544512