問題タブ [tacit-programming]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
j - Jコードを読むための最良の戦略
私はここ数ヶ月Jを使用していますが、なじみのないコードを読むこと(たとえば、自分で書いたものではないこと)は、特に暗黙の中で、言語の最も難しい側面の1つであることがわかりました。しばらくして、私はこの戦略を思いつきました:
1)コードセグメントをWord文書にコピーします
2)(1)から各演算子を取り出し、垂直方向に読み取れるように別々の行に配置します
3)各演算子を語彙ページの口頭での説明に置き換えます
4)J構文から英語の文法への大まかな翻訳を行う
5)翻訳を使用して、概念的に関連するコンポーネントを識別し、それらを改行で区切ります
6)(5)の各コンポーネントが何をすることになっているのかを、わかりやすい英語の散文で説明します。
7)(6)に基づいて、プログラム全体が実行することになっていることの説明を書きます。
8)(1)のコードが(7)の設計コンセプトを表していると言える理由を説明してください。
このプロセスから多くのことを学びますが、特に誰かがこれまでに出会ったことのない概念を使用してプログラムを設計した場合は、かなり困難で時間がかかることがわかります。だから私は疑問に思います:Jコミュニティの他の人々はあいまいなコードを理解するための好きな方法を持っていますか?もしそうなら、これらの方法の長所と短所は何ですか?
編集:
分解する必要がある種類のコードの例は次のとおりです。
私はこれを自分で書いたので、数値入力を受け取り、それを3進配列として再解釈し、結果を2進数の数値の表現として解釈します。(例:binconv 5 =(3 ^ 1)+ 2 *(3 ^ 0)-> 1 2->(2 ^ 1)+ 2 *(2 ^ 0)= 4.)しかし、これがそれが行うことであると理解することは、重要な演習になるでしょう。
lambda - コンビネータ/ポイントフリープログラミング言語におけるコンビネータの役割
高階コンビネータ(または関数プロデューサー)は、連結および暗黙のプログラミングでどのような正確な役割を果たしますか?
スタックを直接操作するのではなく、連結プログラミング言語を実装する別の方法はありますか?
言及されたコンビネータとSchonfinkelのコンビネータ論理の間の関係はどのくらい緊密ですか?
algorithm - J: バブルソート暗黙実装における自己参照
私は J の初心者なので、この言語を使用して簡単なタスクを解決することにしました。特に、バブルソート アルゴリズムの実装です。関数型言語でこの種の問題を解決するのは慣用的ではないことを私は知っています.Cのような命令型言語では、宣言型言語で変更されたリストを構築するのではなく、配列要素の転置を使用して自然に解決されるためです。ただし、これは私が書いたコードです:
ステートメントの構造は次のとおりです。
それを配列に適用しましょう:
私を混乱させるのは$:
、最も外側の括弧内のステートメントを参照することです。ヘルプは次のように述べています。
$:
それを含む最長の動詞を示します。
別の本(~ 300 KiB) には次 のように書かれています。
上記のフレーズのプラスや 時間を表す+ や * などの記号は動詞と呼ばれ、機能を表します。J 句に複数の動詞が含まれる場合があります。その場合、単純な英語の文のように、 を左から右に読むことで構成され ます。
4+6%2
4
6
2
()
最も外側の sを省略してコード スニペットを書き直してみましょう。
結果は同じです。なぜこれが機能するのか、なぜ only が最長の動詞として扱われるのか、式全体ではなく、 だけではないのか、説明でき((<./@(2&{.)), $:@((>./@(2&{.)),2&}.)) ^: (1<#)
ません$:
でし((<./@(2&{.)), $:@((>./@(2&{.)),2&}.)) ^: (1<#) ^: #
た(<./@(2&{.)), $:@((>./@(2&{.)),2&}.)
。動詞としての文 (最初のスニペット)。おそらく、1 つの接続詞によって制限される動詞の長さには、何らかの制限があります。((<./@(2&{.)), $:@((>./@(2&{.)),2&}.)) ^: (1<#)
#
次のコードを見てください (ここから):
factorial
within 式は、関数全体、つまり(* factorial@<:) ^: (1&<)
.
この例に従って、代わりに関数名を使用しました$:
:
関数全体を参照することを期待bubblesort
していましたが、結果が正しいため、そうではないようです。
また、他の実装がある場合は、少しリファクタリングしたものでも見てみたいと思います。
ありがとう。
f# - Tacit programming style using F#
It's not a practically important issue, but I'd like to see an example of tacit programming in F# where my point-free functions can have multiple arguments (not in form of a list or tuple).
And secondly, how such functions can manipulate a complex data structure. I'm trying it out in F# Interactive, but have no success yet.
I tried, for instance:
Is that right way?
And:
j - Jでリストをフィルタリングする方法は?
私は現在、魅力的なJプログラミング言語を学んでいますが、私が理解できていないことの1つは、リストをフィルタリングする方法です。
任意のリストが3 2 2 7 7 2 9
あり、2を削除したいが、他はすべて変更しないと仮定します。つまり、結果はになります3 7 7 9
。一体どうやってこれを行うのですか?
j - Jのリストで動作するようにモナド関数を定義するにはどうすればよいですか?
次の J 式があるとします。
これは、3 で割り切れる 1 から 1000 までの数字の数を数えます。
次のように、これに対してモナド関数を定義するとしましょう。
これは、単一の引数でうまく機能します。
リストを渡すと、長さエラーが発生します。
これで、長さエラーが発生する理由が完全にわかりました。モナド1 2 3
の引数をリストに置き換えると、次のようになります。y
J について何か知っていれば、長さのエラーが発生する理由は明らかです。ですから、その説明は必要ありません。
リストを渡すとリストが返されるように関数を定義したい。
(a) リストを取得してリストを返すようにこの関数を再定義するか、(b) 副詞やその他の手法を使用して、再定義せずに関数をそのままリストで機能させるにはどうすればよいですか?
tacit-programming - J でのユーザー定義動詞のランクの設定
J の数値のデジタル合計を計算する関数を次に示します。
b.
この動詞のランクを照会するために使用すると_ 1 _
、無限、つまり無限が得られます。( は 2 項ではないので、2 項のケースは無視できdigitalSum
ます。)
で報告されているように、この動詞の単項ランクを 0 にしたいと思いb.
ます。これを行うために私が知っている唯一の方法は、「シム」を使用することです。
これはうまく機能しますが、これが唯一の方法なのか、それとも他に何か不足しているのか知りたいです。
明確化
このように定義された動詞のランクを変更する方法を発見しました:
"0
宣言後の に注意してください3 : 0
。任意の副詞または接続詞を入れることができ、動詞全体に適用されます。かなりクールなもの!
tacit-programming - J でのボックス配列構造の抽象化
私はしばらくの間、リストをスキャンし、要素の連続したコピーを別々の連結されたボックスに入れることになっている J 関数に取り組んできました。私の努力は機能まで私を連れて行きました
(<;. 2) ((2&(~:/\)),1:)
連続するリスト エントリの不等式をテストし、ブール値のリストを返し、数値 1 が現れるたびに終了するボックスにリストを分割します。アプリケーションの例を次に示します。
これらすべてのブール値を入力引数の対応する値に置き換えることができれば、タスクは終了します。次のようなことができるミステリー関数を探していました
理想的な状況では、によって生成された入れ子パターンを抽象的に表現し、(<;. 2) ((2&(~:/\)),1:)
それを元の入力リストに適用する方法がいくつかあります。(つまり、「このボックス化された配列は、深さ 1 でボックス化された最初の要素、深さ 1 でボックス化された 2 番目の要素、深さ 1 で一緒にボックス化された 3 番目、4 番目、および 5 番目の要素、...、そこのボックス化されていないリストを取得します。同じようにボックスに入れます。") ;.
、S:
、L:
、をいじってその動作を生成しようL.
と&.
しましたが、うまくいきませんでした。これを実現するために、私が見逃しているある種の演算子または原則はありますか? 問題全体を考えすぎていたとしても驚かないでしょうが、アイデアが不足しています。
編集:
現時点で、私が持っている唯一の実用的な解決策はこれです:
これは、リストのランレングス エンコーディングを生成し、ボックスを削除せずにエンコーディングを元に戻す 2 段階のプロセスです。もともとJとHaskellを使って99問を連立で解こうと思ってやっているので、12問を先に解いて9問を解けばいいのか、という感じです。
tacit-programming - リスト内の各アトムに異なる動詞を交互に適用する動詞をJで定義するにはどうすればよいですか?
Jで次の名前を定義したと想像してください。
これは次のようになります。
このリストのリストの各リストに適用されるランク1の単動詞を作成したいと思います。リスト内の各代替アイテムに2倍(+:
)または1()を追加します。>:
この動詞を最初の行に適用すると、が得られ2 3 6 5 10
ます。
各アイテムと交互になるブール値のリストを取得するのはかなり簡単です。たとえば、0 1 $~{:$ m
を与え0 1 0 1 0
ます。と思った、ああ!+:
`の後にいくつかの式を続けるようなものを使用します>: @.
が、それを完全に機能させることはできませんでした。
助言がありますか?
アップデート
以下は機能しているように見えますが、おそらくJプロによってよりエレガントなものにリファクタリングすることができます。
tacit-programming - Jでローランド素数列を慣用的に生成するにはどうすればよいですか?
ローランド素数列に慣れていない場合は、ここで調べることができます。次のように、このシーケンスの最初のn項を生成するために、J で醜い手続き型単項動詞を作成しました。
これは完全に機能し、実際にシーケンスの最初のn項を生成します。( n項とは、最初のn 個 の異なる素数を意味します。)
の出力は次のrowland 20
とおりです。
私の質問は、これをより慣用的な J でどのように書くことができるかということです。手がかりはありませんが、次の関数を作成して、必要な手順の 1 つである、数字のリスト内の連続する数字の違いを見つけました。これは、おそらく私よりも経験豊富な J プログラマーによってリファクタリングされる可能性がありますが、次のとおりです。