背景、状況
12歳、学生です。
現在Kotlinを初め、今までは別にC#を使っていました。
私の現状ですがC#ではラムダ式が読めず、KotlinやC#でもラムダ式を使わずコードを書きました。
三か月後に読めるコードを書いているか試してみております。まだ結果はでていません。
なので、その間に知識や技術などを皆様に教えてもらいたいです。
テーマ、知りたいこと
すでにつまづいておりますが、僕の場合は将来的にはラムダ式を理解すること。
あとは、皆様が感じるプログラミングで転んでしまった事、実際にあったつまづいた部分を教えてください。
その部分を気を付けつつ、皆様の後を追いかけたいと思っております。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答4件
#1
総合スコア10995
投稿2025/06/30 11:51
皆様が感じるプログラミングで転んでしまった事、実際にあったつまづいた部分を教えてください。
そうですねぇ。無限ループを作ってしまったり、他で既に使用している変数を使ってしまったりでしょうか(ループ処理で使う 変数 i とか)。あとは配列使えば良いのにループ処理にしてしまってものすごく処理速度が遅くなってしまったりですね。
#2
総合スコア92
投稿2025/06/30 14:28
編集2025/06/30 15:08別にラムダ式って難しくはないんだけどねぇ・・・・・・。
だから問題としては「とある言語が採用してる構文」が読みやすいか否か、しかねぇんだよな。
あと、元々ラムダ式ってのは、数学の一分野から出てきたんで、プログラミング言語みたいに「型」がない。
よって、C#みたいな静的型付け言語の場合、記述情報が多すぎて「見づらい」って事はあり得ると思うよ。
いきなり余談だけど、ラムダ式って元々、アロンゾ・チャーチって人が考え出したのね。
で、話によると、彼が考え出した関数、ラムダ式ってのは元々キャレット(^)を使って表現したかったらしい。
つまりこうだ。
^x
本当はxの上に帽子のようにキャレットを乗せたかったらしいんだけど、まぁ、最初にこう書いてみた、と。
後にこれが
λx
となる。ギリシャ文字のλ(ラムダ)をキャレットの代わりに使ってから「ラムダ式」と呼ばれるようになったわけ。
めでたくラムダ式の登場、だ。
最初にラムダ式を導入した言語はLispって言語だ。
例えば引数xとyを足したい、って場合はこう書く。
Lisp
1(lambda (x y) (+ x y))
Lispは前置記法なんで足し算を+ x y
と表記するんだけど、それはさておき。
直接Lispの影響を受けた、あるいはかなり強い影響下にある言語だとこのlambda
って表現をそのまま導入してるんだ。
Python
1lambda x, y: x + y
Ruby
1lambda {|x, y| x + y}
とかな。
ところが、最初に見た通り、「関数として見た場合には意味がある」んだけど、一方、ラムダ(λ)と言う表記自体には全く意味がないんだ。
特にプログラミング言語だとlambda
と言う表記は長すぎる。
よって、基本的に、後発の言語でラムダ式を持つ言語は「如何にしてlambda
と言う伝統的表記法を抹殺するか」ってのがある種デザインの主題になるわけ。
JavaScript
1(x, y) => x + y;
当然、Kotlinもそういう観点には立つ。
Kotlin
1{x: Int, y: Int -> x + y}
一方、Lisp、Python、Ruby、JavaScriptは動的型付け言語だ。言い換えると明示的に型を指定しなくていい。
反面、Kotlinは変数の型を明示しないとならない。よって情報量が多くなり、記述量が増える。
多分その辺がKotlinのラムダ式の「読みづらさ」の一旦を担ってるんじゃないか。
ここでちと、1 + 2
を考えよう。
いや、僕はKotlinを使うのはホント初めてなんだけど、フツーに考えれば、1 + 2
はKotlinインタプリタでも次のように記述すれば簡単に書ける事が分かる。
Kotlin
1>>> 1 + 2 2res0: kotlin.Int = 3
しかしながら、明らかに無駄ではあるんだけど、Kotlinでは次のようにして記述可能だ。
Kotlin
1>>> {x: Int, y: Int -> x + y}(1, 2) 2res1: kotlin.Int = 3
「こう書くのが可能だ」と言う事を肝に銘じよう。
これは何も突飛な書き方ではなく、関数の実行形式、つまり関数(引数0, 引数1, ....)
と言う形式に従ってる事を把握しよう。
つまり、ラムダ式は「関数」と言うデータ形式を生成している。これを「関数はファーストクラスオブジェクトである」と表現する。
また、オブジェクト指向に慣れてる人向けには、ラムダ式は「関数型」と言うオブジェクトを生成するコンストラクタだと言った方が分かりやすいかもしんない。
いずれにせよ、ラムダ式自体についてはこれが全てだ。
だから問題は、ラムダ式を多用する形式、高階関数の使い方がよく分かってないって事の方がデカいんじゃないか。
高階関数は大雑把に言うと次の2つの形式の関数を指す。
- 関数を引数に取る関数
- 関数を返す関数
例えば「関数を引数に取る関数」の場合、ラムダ式を引数に取れる、って事だ。
逆に、「関数を返す関数」だとラムダ式を返り値として使う事が出来る。
後者では、有名な問題としてはポール・グレアムって人が出したアキュムレータの問題がある。Kotlinでは次のように書くだろう。
Kotlin
1fun foo(n: Int): (Int) -> Int { 2 var m: Int = n 3 return {i: Int -> m += i 4 m} 5}
ただ、こういう風に高階関数を「自作する」前に、まずは言語組み込みの高階関数を使う事に慣れよう。
Kotlin組み込みの高階関数を使う練習をする、って事は必然的にラムダ式の書き方を学ぶ、っちゅーこっちゃ。
とは言っても基本的には、代表的な高階関数ってKotlinだと3つくらいしかないんだ。
まずはこれらを練習しよう。
三か月後に読めるコードを書いているか試してみております。
読めるかどうか、ってのは「書く練習が伴って」初めてハッキリするんだよ。
日本語だろうと英語だろうと、「書かないと」読解力は上がらない。「読んでるだけじゃダメ」なんだ。国語でも作文があるのは、日本語の読解力に密接な関係があるから、だ。「ある言い回し」は使う練習をしないと自在に書けるようにはならないし、読めるようにならない。
上の例だとフィルタリングは簡単だろう。map
とreduce
はリスト相手の繰り返し処理の強力な代替手段だ。map
はリストの各要素に同一の計算を施し、reduce
はリストの各要素に計算を施しつつ単一の値(データ)を得る。
この2つを練習しまくろう。特に、一般的には、reduce
が苦手な人が多いんだけど、これを使いこなせれば見える世界が変わる。
と言うわけで、3ヶ月くらいmap
とreduce
を練習しまくる事をオススメする。最近のモダンな言語だとこれら2つを搭載している言語が多いんで、練習問題はアッチコッチで見つかると思うよ。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#4
総合スコア12236
投稿2025/07/01 02:57
皆様が感じるプログラミングで転んでしまった事、実際にあったつまづいた部分を教えてください。
多分,求めている話とは方向性が違うだろうけど……
(うっかり自身の頭の悪さを忘れて)延々と考えすぎて進まなくなる→結果としてやらなくなる ,みたいなつまづき方(?)でわりと失敗しています.
(個人的な趣味なのであれば)プログラムのコードなんてものは後から好きなだけ書き換えることができる(なんなら最初から作り直したって良い).その程度の存在でしかない.書いたコードに過度に縛られる必要は無い.
……ハズなんだけど,何でかなぁ.何故かうっかり「事前に」(何かを)あーだこーだと頑張ろうとしてしまうんだな.
(まぁ実際にそれで頑張れるのならそれでもいいんだけど)
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。