公式
https://www.rust-lang.org/
https://blog.rust-lang.org/
https://github.com/rust-lang/rust
公式ドキュメント
https://www.rust-lang.org/learn
Web上の実行環境
https://play.rust-lang.org
※Rustを学びたい人はまず最初に公式のThe Bookを読むこと
https://doc.rust-lang.org/book/
※Rustを学ぶ際に犯しがちな12の過ち
https://dystroy.org/blog/how-not-to-learn-rust
※Rustのasyncについて知りたければ「async-book」は必読
https://rust-lang.github.io/async-book/
※次スレは原則>>980が立てること
前スレ
Rust part19
https://mevius.5ch.net/test/read.cgi/tech/1673926892/
ワッチョイスレ
プログラミング言語 Rust 4【ワッチョイ】
https://mevius.5ch.net/test/read.cgi/tech/1514107621/
Rust part20
■ このスレッドは過去ログ倉庫に格納されています
2023/03/03(金) 00:45:28.73ID:vTVY069B
797デフォルトの名無しさん
2023/07/22(土) 12:06:07.26ID:24bvSiNd >>792
>> 今まで色々資料読んだ範囲内だと感覚的には「Rustはメモリ管理に関しては言語内部的には頑張らない、外部環境で処理するか、可読性を犠牲にガチャガチャしろ」というスタンスで提供されてる感じはしてます
メモリ管理の階層の違いを理解できていなさそうだが
メモリアロケータの話ならばRustはC++と同様に交換自由でライブラリ選択可能
可読性を犠牲にガチャガチャする必要はなくRustでは#[global_allocator]で指定するだけで交換可能
>> 今まで色々資料読んだ範囲内だと感覚的には「Rustはメモリ管理に関しては言語内部的には頑張らない、外部環境で処理するか、可読性を犠牲にガチャガチャしろ」というスタンスで提供されてる感じはしてます
メモリ管理の階層の違いを理解できていなさそうだが
メモリアロケータの話ならばRustはC++と同様に交換自由でライブラリ選択可能
可読性を犠牲にガチャガチャする必要はなくRustでは#[global_allocator]で指定するだけで交換可能
798デフォルトの名無しさん
2023/07/22(土) 13:41:17.13ID:7Mz5wCRP 理解できてなかったらしい
もういいや
もういいや
799デフォルトの名無しさん
2023/07/22(土) 13:57:51.76ID:u4m8T/// >>792はC言語でたとえるとmallocを使ったメモリ管理とmallocの中のメモリ管理の違いをわかっていない初心者かな
800デフォルトの名無しさん
2023/07/22(土) 13:58:55.74ID:NWfMWzFP そうです
初心者でした
お騒がせして申し訳ありませんでした
初心者でした
お騒がせして申し訳ありませんでした
801デフォルトの名無しさん
2023/07/22(土) 14:25:05.31ID:AxAuiZIS802デフォルトの名無しさん
2023/07/22(土) 14:42:32.24ID:QLIAp4G5 >>801
そんなに単純じゃないよ。
確保しようとする大きさによって違う領域から割り当てるような実装も普通。
順序良く割り当てるわけではなく、
そのときの状況によって効率的になるように采配する。
仮に断片化を意図的に起こしてでも総合的に断片化の確率を減らすような
戦略を持っているのかもしれないし、
よほど深刻な場合を除いて使う側はアロケータの中なんぞ忘れておくのが吉。
そんなに単純じゃないよ。
確保しようとする大きさによって違う領域から割り当てるような実装も普通。
順序良く割り当てるわけではなく、
そのときの状況によって効率的になるように采配する。
仮に断片化を意図的に起こしてでも総合的に断片化の確率を減らすような
戦略を持っているのかもしれないし、
よほど深刻な場合を除いて使う側はアロケータの中なんぞ忘れておくのが吉。
803デフォルトの名無しさん
2023/07/22(土) 14:54:17.36ID:NWfMWzFP もちろん発生しますよ
どんな場合でも最高次数にうまくいく魔法のような戦略なんてありません
なのでケースバイケースで場合に応じて戦略を使い分けなければならない
しかしOSの実行環境なんかのアロケーターはプログラムの内部情報を何一つ持ってないから「開きメモリのリストを持っておいて最初に見つかったスキマにアサインする、足りなくなったらGC」以外に戦略の採りようがない、だから従来のプログラミング言語は自分でGCするわけです、少なくともコンパイラはコンパイルする時点でどれくらいの頻度でどれくらいのサイズのアロケーション要求が発生するかある程度情報が得られるからそれを利用してよりよい割り当て戦略をとれるチャンスがあるからです、なんならその情報をコンパイラに教えるnotificationをつけられるように設計する事もできる
しかしそれとて限界がある、だからRustはもうそれすらやらない、アロケーションは自分でやれ、そのためのツールはある程度は言語内部で用意する、ダメなら言語外部のツール使え、という「無理してやってもどうせ“最適”には程遠いからやらない」んでしょう
逆に言えばRustでプログラム組むとき、特にでかいデータの作成、廃棄を繰り返すような場合はプログラマはかなり練度が必要になるんでしょう
立ち位置としてそれくらいの事がこなせるユーザーをプログラマとして想定してるという事です
学習コストが高いんじゃなくてそもそもプログラマに要求されてる水準が高めなんですね
どんな場合でも最高次数にうまくいく魔法のような戦略なんてありません
なのでケースバイケースで場合に応じて戦略を使い分けなければならない
しかしOSの実行環境なんかのアロケーターはプログラムの内部情報を何一つ持ってないから「開きメモリのリストを持っておいて最初に見つかったスキマにアサインする、足りなくなったらGC」以外に戦略の採りようがない、だから従来のプログラミング言語は自分でGCするわけです、少なくともコンパイラはコンパイルする時点でどれくらいの頻度でどれくらいのサイズのアロケーション要求が発生するかある程度情報が得られるからそれを利用してよりよい割り当て戦略をとれるチャンスがあるからです、なんならその情報をコンパイラに教えるnotificationをつけられるように設計する事もできる
しかしそれとて限界がある、だからRustはもうそれすらやらない、アロケーションは自分でやれ、そのためのツールはある程度は言語内部で用意する、ダメなら言語外部のツール使え、という「無理してやってもどうせ“最適”には程遠いからやらない」んでしょう
逆に言えばRustでプログラム組むとき、特にでかいデータの作成、廃棄を繰り返すような場合はプログラマはかなり練度が必要になるんでしょう
立ち位置としてそれくらいの事がこなせるユーザーをプログラマとして想定してるという事です
学習コストが高いんじゃなくてそもそもプログラマに要求されてる水準が高めなんですね
804デフォルトの名無しさん
2023/07/22(土) 16:19:13.40ID:2BLjTz4O >>803
間違い多いな
まず一般的にGCはフラグメンテーションを解決しない
特にマークアンドスイープ方式のGCや参照カウント方式のGCはフラグメンテーションは放置で関与しない
Rustについての記述は間違いだらけでなんとも言いようがない
言語外部のツール使えとはトンデモすぎて何を言ってるのかもわからない
フラグメンテーションを起こし得るメモリアロケーターについてRustはC/C++と同じ立場で同じものを使う
C/C++/Rust共通の話として同じようにjemallocなど別のメモリアロケーターを使うことができる
Rustだけ特別な方法をとったり特別な性質をもったりはしておらずフラグメンテーションについてもC/C++と同じ
間違い多いな
まず一般的にGCはフラグメンテーションを解決しない
特にマークアンドスイープ方式のGCや参照カウント方式のGCはフラグメンテーションは放置で関与しない
Rustについての記述は間違いだらけでなんとも言いようがない
言語外部のツール使えとはトンデモすぎて何を言ってるのかもわからない
フラグメンテーションを起こし得るメモリアロケーターについてRustはC/C++と同じ立場で同じものを使う
C/C++/Rust共通の話として同じようにjemallocなど別のメモリアロケーターを使うことができる
Rustだけ特別な方法をとったり特別な性質をもったりはしておらずフラグメンテーションについてもC/C++と同じ
805デフォルトの名無しさん
2023/07/22(土) 16:41:16.06ID:NWfMWzFP 素人なものですいません
スレ汚しすいませんでした
スレ汚しすいませんでした
806デフォルトの名無しさん
2023/07/22(土) 17:02:30.53ID:NRmzieuj >まず一般的にGCはフラグメンテーションを解決しない
マーク&スウィープ方式は一般的にコンパクションもやってるぞ
マーク&スウィープ方式は一般的にコンパクションもやってるぞ
807デフォルトの名無しさん
2023/07/22(土) 17:07:41.36ID:2BLjTz4O808デフォルトの名無しさん
2023/07/22(土) 17:59:22.96ID:QLIAp4G5809デフォルトの名無しさん
2023/07/22(土) 18:05:22.75ID:YLqzZrt5 そういえば君らのメモリ管理の会話でLinkedListの使い道思い出したわ
Rustやその他の言語側じゃなくてOS側のメモリ管理にLinkedList使われてるわ
Rustやその他の言語側じゃなくてOS側のメモリ管理にLinkedList使われてるわ
810デフォルトの名無しさん
2023/07/22(土) 18:42:28.71ID:2BLjTz4O811デフォルトの名無しさん
2023/07/22(土) 19:01:55.55ID:TsQs+vXV812デフォルトの名無しさん
2023/07/22(土) 19:18:33.46ID:2BLjTz4O >>811
compactionをする前にマークアンドスイープGC自体は既に終わっていて独立した別の行為
実際にそれら言語では世代別GCが行われていていて新入り若手のオブジェクトはコピーGCを行なうが古いオブジェクトはマークアンドスイープのみで再配置しない方法が一般的
compactionをする前にマークアンドスイープGC自体は既に終わっていて独立した別の行為
実際にそれら言語では世代別GCが行われていていて新入り若手のオブジェクトはコピーGCを行なうが古いオブジェクトはマークアンドスイープのみで再配置しない方法が一般的
813デフォルトの名無しさん
2023/07/22(土) 19:31:27.25ID:nB6v7J6K 隔離スレ行けアスペジジー
814デフォルトの名無しさん
2023/07/22(土) 20:04:44.58ID:2BLjTz4O 再配置はデータコピーとそこへのポインタ全て書き換えでコストが大きすぎるから可能な限り避けるのが正しい
世代別GCで若手オブジェクトだけに限ってコピーGCの対象にするのも若手の大半は一時的利用でコピーしなくて済むため
Rustではそんなコストをかけないだけでなくヒープ確保解放のコストすら減らすことと一石二鳥で解決する方法も取られている
例えばbumpalo crateはまとまった領域を持って追記していくだけで個別の解放コストゼロ(=何もしない)と個別の確保コストも最小(=追記のみor足りないとまとまったお代わり)のアリーナアロケータ
つまり未使用領域の再利用をしないことで管理不要となり最高速になるとともにまとめて一気に最高速で返す
具体的にはサーバーまたはバッチ処理で各対象固有データのみそこから確保してその対象を終える時に破棄
これはフラグメンテーションを防ぐのに非常に効果的な方法
世代別GCで若手オブジェクトだけに限ってコピーGCの対象にするのも若手の大半は一時的利用でコピーしなくて済むため
Rustではそんなコストをかけないだけでなくヒープ確保解放のコストすら減らすことと一石二鳥で解決する方法も取られている
例えばbumpalo crateはまとまった領域を持って追記していくだけで個別の解放コストゼロ(=何もしない)と個別の確保コストも最小(=追記のみor足りないとまとまったお代わり)のアリーナアロケータ
つまり未使用領域の再利用をしないことで管理不要となり最高速になるとともにまとめて一気に最高速で返す
具体的にはサーバーまたはバッチ処理で各対象固有データのみそこから確保してその対象を終える時に破棄
これはフラグメンテーションを防ぐのに非常に効果的な方法
815デフォルトの名無しさん
2023/07/22(土) 21:33:49.24ID:kHWj4RWJ まーた複オジが知ったかぶりして無知晒してるw
初心者かなww
初心者かなww
816デフォルトの名無しさん
2023/07/22(土) 22:04:25.70ID:kdu4dn9d Rust使うくらいならJavaかC#で良いのでは?
817デフォルトの名無しさん
2023/07/22(土) 22:08:51.83ID:wR/xGD2g RustとC#だとどっちがいいの?
818デフォルトの名無しさん
2023/07/23(日) 02:44:41.28ID:lmJrnSr9 >>814
GCのないRustが速いわけだ
GCのないRustが速いわけだ
819デフォルトの名無しさん
2023/07/23(日) 11:09:10.60ID:kMNWXVHy >>814
C/C++でも同じアルゴリズムのアロケータあるで
C/C++でも同じアルゴリズムのアロケータあるで
820デフォルトの名無しさん
2023/07/23(日) 11:10:16.97ID:dOw1chPf >>816
🤮
🤮
821デフォルトの名無しさん
2023/07/25(火) 06:32:45.09ID:7X7HwnNv >>819
言語に関係なくそこへ行き着くんだよな
もちろん通常はフラグメンテーションなんか気にせずに普通にコードを書けばよく
稼働時間の長いプロセスでフラグメンテーションが実際に起きた時の解決策の一つ
言語に関係なくそこへ行き着くんだよな
もちろん通常はフラグメンテーションなんか気にせずに普通にコードを書けばよく
稼働時間の長いプロセスでフラグメンテーションが実際に起きた時の解決策の一つ
822デフォルトの名無しさん
2023/07/27(木) 13:16:19.02ID:/bGsBsBb play-rustのコードのコピペのやり方教えて下さい
具体的にはお題スレの
https://play.rust-lang.org/?version=stable&mode=release&edition=2021&gist=f627f3a5de4a0c467f015a8b1527c141
のコードコピペする方法がわかりません
よろしくお願いします
具体的にはお題スレの
https://play.rust-lang.org/?version=stable&mode=release&edition=2021&gist=f627f3a5de4a0c467f015a8b1527c141
のコードコピペする方法がわかりません
よろしくお願いします
823デフォルトの名無しさん
2023/07/27(木) 14:04:04.46ID:90/I2Z5n rustは型推論をしてくれると聞いたのですけど、結果どういう型になったか調べる方法はありますか?
Haskellのghciの:tに当たるやつです
例えはghci内で
prelude> let f n = sum [ x^n | x<- [1..5] ]
として
prelude> :t f
とすれば
( Num a, Integral b ) => b -> a
のように返してくれます
rustでコンパイラの型推論の結果どういう型に決定したのか調べる方法はありますか?
Haskellのghciの:tに当たるやつです
例えはghci内で
prelude> let f n = sum [ x^n | x<- [1..5] ]
として
prelude> :t f
とすれば
( Num a, Integral b ) => b -> a
のように返してくれます
rustでコンパイラの型推論の結果どういう型に決定したのか調べる方法はありますか?
824デフォルトの名無しさん
2023/07/27(木) 14:28:57.60ID:p+3LvAw4 >>823
LSP 対応のエディタ (VSCode など) を使ってるならそのへんにカーソルを合わせるだけで型は見れるよ。
LSP 対応のエディタ (VSCode など) を使ってるならそのへんにカーソルを合わせるだけで型は見れるよ。
825デフォルトの名無しさん
2023/07/27(木) 21:59:53.82ID:x4QyUuiY >>823
安直な方法としては関数の戻り型なら -> i32と嘘の型宣言を指定すれば型不一致で正しい具体型をコンパイルエラーに表示してくれる
プログラムで表示したいならこれ
fn get_type<T>(_: T) -> &'static str {
std::any::type_name::<T>()
}
安直な方法としては関数の戻り型なら -> i32と嘘の型宣言を指定すれば型不一致で正しい具体型をコンパイルエラーに表示してくれる
プログラムで表示したいならこれ
fn get_type<T>(_: T) -> &'static str {
std::any::type_name::<T>()
}
826デフォルトの名無しさん
2023/07/27(木) 23:11:30.70ID:sTDTKxns827デフォルトの名無しさん
2023/07/27(木) 23:12:33.60ID:paov2RlH rustの型推論って曖昧なことを許容したっけ?
すべて一意にならないとならないと思ってたけど
すべて一意にならないとならないと思ってたけど
828デフォルトの名無しさん
2023/07/28(金) 19:39:32.86ID:4cjf/6GX >>827
正しい
ジェネリックであってもパラメタは各々で必ず一意に静的に確定せねばならず
impl Traitで型宣言しても各々で一意に具体的な型に静的に確定する
特にそれが関数の引数ならば生成コードは単相化される
ただしdyn Traitはそれらが静的ではなく実行時のオブジェクト生成毎に個別に一意の具体的な型に確定する点で異なる
コンパイル時の静的な生成コードは複数の型で共有となるためvtableを持って対処している
正しい
ジェネリックであってもパラメタは各々で必ず一意に静的に確定せねばならず
impl Traitで型宣言しても各々で一意に具体的な型に静的に確定する
特にそれが関数の引数ならば生成コードは単相化される
ただしdyn Traitはそれらが静的ではなく実行時のオブジェクト生成毎に個別に一意の具体的な型に確定する点で異なる
コンパイル時の静的な生成コードは複数の型で共有となるためvtableを持って対処している
829デフォルトの名無しさん
2023/07/29(土) 16:54:29.41ID:Nh9kevR9 なるほど
Rustは最終的にコンパイルが終わって型が完全に推論が終わって単相型が決定した状態でしかわからないのかな
当然get_typeで得られるstrは推論終わって単相型が割り当てられた後の型しかわからないんやな
Rustは最終的にコンパイルが終わって型が完全に推論が終わって単相型が決定した状態でしかわからないのかな
当然get_typeで得られるstrは推論終わって単相型が割り当てられた後の型しかわからないんやな
830デフォルトの名無しさん
2023/07/29(土) 18:53:43.03ID:nTghkNr5 コードを書いた時点で型は決まるし書いた人は型を把握できる
ジェネリックな関数だとしても型パラメタ以外の部分は確定している
その関数を呼び出す側が最後のピースとして型パラメタを指定して完全確定する
ジェネリックな関数だとしても型パラメタ以外の部分は確定している
その関数を呼び出す側が最後のピースとして型パラメタを指定して完全確定する
831デフォルトの名無しさん
2023/07/29(土) 19:01:27.37ID:mkN3FcGi そうなんよねぇ
ML型型理論ならexpression毎に最も一般的な型が決まる
Haskellは型を指定しない場合自動的にその最も一般的な型を確定させてghciとかで調べられる
今のところ上がってる方法ではRustではそれに該当する方法はなさそう
ML型型理論ならexpression毎に最も一般的な型が決まる
Haskellは型を指定しない場合自動的にその最も一般的な型を確定させてghciとかで調べられる
今のところ上がってる方法ではRustではそれに該当する方法はなさそう
832デフォルトの名無しさん
2023/07/29(土) 19:02:57.30ID:mkN3FcGi イヤまだvscideとかのやつは試してないな
これならできるんかな?
これならできるんかな?
833デフォルトの名無しさん
2023/07/29(土) 20:36:12.76ID:JeVM9tS2 こいつダメだわ
ある意味複オジ2世
ある意味複オジ2世
834デフォルトの名無しさん
2023/07/29(土) 21:40:33.16ID:EPaDIYai >>829
> Rustは最終的にコンパイルが終わって型が完全に推論が終わって単相型が決定した状態でしかわからないのかな
いやもうrustは変数宣言時に定義した型の変更を許さないのよ(基本的に)
だから型推論は変数宣言時のものを利用したり、関数の場合は返値、手打ちの数字の場合はデフォルトの型に決め打ちされて型推論されるわけ
いちいち型を調べる必要がない
ジェネリックに関しても基本的に場合分け
> Rustは最終的にコンパイルが終わって型が完全に推論が終わって単相型が決定した状態でしかわからないのかな
いやもうrustは変数宣言時に定義した型の変更を許さないのよ(基本的に)
だから型推論は変数宣言時のものを利用したり、関数の場合は返値、手打ちの数字の場合はデフォルトの型に決め打ちされて型推論されるわけ
いちいち型を調べる必要がない
ジェネリックに関しても基本的に場合分け
835デフォルトの名無しさん
2023/07/29(土) 21:44:15.48ID:EPaDIYai pythonとかjavascriptとか勝手に型を変更する(ような振る舞いをする→変更するとは言ってない)
言語なんてサイテーだと個人的には思う
言語なんてサイテーだと個人的には思う
836デフォルトの名無しさん
2023/07/29(土) 22:05:07.65ID:2dUASh9D837デフォルトの名無しさん
2023/07/29(土) 22:10:13.37ID:2dUASh9D ごめん、誤字った
rustの型システムはMLじゃないの?
いわゆる型の全体と命題論理の全体を一対一に対応させる
で、その命題論理の目モデルを探す事=単相型を決定する事がMLの型推論システムで、Rustもそれ採用してるんだと思ってるんだけど
で単相型が割り当てられる“命題”に対応してるものが多相型と呼ぶんだと教えてもらった事あるけど
rustの型システムはMLじゃないの?
いわゆる型の全体と命題論理の全体を一対一に対応させる
で、その命題論理の目モデルを探す事=単相型を決定する事がMLの型推論システムで、Rustもそれ採用してるんだと思ってるんだけど
で単相型が割り当てられる“命題”に対応してるものが多相型と呼ぶんだと教えてもらった事あるけど
838デフォルトの名無しさん
2023/07/29(土) 22:19:51.45ID:381IW7f/ も少し書くなら基本的にrustもhaskellも型システムは基本的な原理は同じじゃないのって話
それを説明する用語としてRust特定の説明の仕方をしてるのかもしれないけど説明の仕方や用語の使い方を変えたところでどっちもカリーハワード理論に基づく型システムじゃない?
それを説明する用語としてRust特定の説明の仕方をしてるのかもしれないけど説明の仕方や用語の使い方を変えたところでどっちもカリーハワード理論に基づく型システムじゃない?
839デフォルトの名無しさん
2023/07/29(土) 22:51:50.32ID:381IW7f/ もし同じならHaskellと同じく例えば
mysum [] = 0
mysum (a:as) = a + ( mysum as )
なら Haskell ならmysumの型は
( Num a ) => [ a ] -> a
と推論されます
RustでもML型システムである限り少なくとも内部的には同じような型が割り当てられてるはずだと思うんですけど
もちろんこれら推論された型を全部総合して実装時には特定の単相型が割り当てられます
この辺のメカニズムはHaskellもRustも同じじゃないんでしょうか?
mysum [] = 0
mysum (a:as) = a + ( mysum as )
なら Haskell ならmysumの型は
( Num a ) => [ a ] -> a
と推論されます
RustでもML型システムである限り少なくとも内部的には同じような型が割り当てられてるはずだと思うんですけど
もちろんこれら推論された型を全部総合して実装時には特定の単相型が割り当てられます
この辺のメカニズムはHaskellもRustも同じじゃないんでしょうか?
840デフォルトの名無しさん
2023/07/29(土) 23:06:20.41ID:MBm8IaU2 まずRustの数値リテラルはHaskellと違って多相な型を持たないです
841デフォルトの名無しさん
2023/07/29(土) 23:25:14.79ID:I6XWshKt >>839
分かってる気になっておかしなことを書く癖を直したほうがいいと思うが…
分かってる気になっておかしなことを書く癖を直したほうがいいと思うが…
842デフォルトの名無しさん
2023/07/29(土) 23:36:28.14ID:I6XWshKt 人間としての推論機構が間違っている
基礎を勉強してルールとしてそれを覚えてから
それを基に推論を行わないと意味がないと知るべき
基礎を勉強してルールとしてそれを覚えてから
それを基に推論を行わないと意味がないと知るべき
843デフォルトの名無しさん
2023/07/29(土) 23:51:52.56ID:nTghkNr5 >>831
最も一般的な型ではダメでRustは唯一に確定しなければならない
Rustは関数(メソッド)の引数も返り値も型宣言が必須だけど
そこでの型はジェネリックで型パラメータを持つものも多く
その型パラメータのトレイト境界などによる制約とそのトレイト実装をする型が複数あることから複数解も生じる
複数解がありうるならばコンパイルエラーとなり明示的な型指定を求められる
唯一の例外が数値リテラルの利用により数値型までは確定している時でそれが整数ならば自動的にi32型に解決される
最も一般的な型ではダメでRustは唯一に確定しなければならない
Rustは関数(メソッド)の引数も返り値も型宣言が必須だけど
そこでの型はジェネリックで型パラメータを持つものも多く
その型パラメータのトレイト境界などによる制約とそのトレイト実装をする型が複数あることから複数解も生じる
複数解がありうるならばコンパイルエラーとなり明示的な型指定を求められる
唯一の例外が数値リテラルの利用により数値型までは確定している時でそれが整数ならば自動的にi32型に解決される
844デフォルトの名無しさん
2023/07/30(日) 00:16:28.33ID:psEFm3Dt >>840
その説明はよくrustの解説本にあるけど多分字面通りの意味にとってはいけないんじゃないかと
だってプログラム全体を見なければ型なんか決められるはずない
ML型の型システムである限りHaskellのexpressionから定まる最も一般的な多相型持ってると思う、でなければML型型システムと呼べない
さっきあげたmysumなんかその典型、あのmusumはnum classに属するすべての型で使うことができる、もしこのような多相型を持たない理論ならすべての足し算を持つクラス全てにほとんど同じsumを定義させられることになる、それを避けられるのがML型システムの1番の売りなんだから
てか上の例のmysumに相当する書き方Rustでもできるんでしょ?
無理なん?
その説明はよくrustの解説本にあるけど多分字面通りの意味にとってはいけないんじゃないかと
だってプログラム全体を見なければ型なんか決められるはずない
ML型の型システムである限りHaskellのexpressionから定まる最も一般的な多相型持ってると思う、でなければML型型システムと呼べない
さっきあげたmysumなんかその典型、あのmusumはnum classに属するすべての型で使うことができる、もしこのような多相型を持たない理論ならすべての足し算を持つクラス全てにほとんど同じsumを定義させられることになる、それを避けられるのがML型システムの1番の売りなんだから
てか上の例のmysumに相当する書き方Rustでもできるんでしょ?
無理なん?
845デフォルトの名無しさん
2023/07/30(日) 00:18:56.60ID:psEFm3Dt ML型システムと呼べないは言い過ぎかな?
まぁ型宣言省略しても型推論してくれるならML型型システムと呼べなくはないけど、でも流石にさっきのmysumみたいな記述は許されてるんじゃないの?
まぁ型宣言省略しても型推論してくれるならML型型システムと呼べなくはないけど、でも流石にさっきのmysumみたいな記述は許されてるんじゃないの?
846デフォルトの名無しさん
2023/07/30(日) 00:19:43.44ID:dT6HJfPv ハスケル!
ハスケル!
ハスケル!
その毎度のハスケルおじさんに構うのは止めとけよ
Rubyおじさんと変わらないんだからさあ
自覚のない荒らしだよ
ハスケル!
ハスケル!
その毎度のハスケルおじさんに構うのは止めとけよ
Rubyおじさんと変わらないんだからさあ
自覚のない荒らしだよ
847デフォルトの名無しさん
2023/07/30(日) 00:19:47.09ID:psEFm3Dt848デフォルトの名無しさん
2023/07/30(日) 00:21:02.70ID:dT6HJfPv Haskellおじさんは自分の思いをここに書かないと死んじゃうの?
なんでRustをRustとして扱いたくないの?
なんでRustをRustとして扱いたくないの?
849デフォルトの名無しさん
2023/07/30(日) 00:21:05.69ID:psEFm3Dt850デフォルトの名無しさん
2023/07/30(日) 00:22:04.96ID:dT6HJfPv ハスケルおじさんは壁に向かってハスケルハスケル行ってればいいのに
851デフォルトの名無しさん
2023/07/30(日) 00:24:01.50ID:dT6HJfPv マクロしらんの?
852デフォルトの名無しさん
2023/07/30(日) 00:24:09.72ID:psEFm3Dt >>848
すでに習得した言語の対比して新しい言語に挑戦するのは当たり前やろ?
Haskellの型システム理解するのにどれだけの時間をかけて教科書を読み、論文を読み、プログラミングを組んでみたか、その資産を使いたいとおもうのがそんなに悪いんか?
黙っといてくれよ
すでに習得した言語の対比して新しい言語に挑戦するのは当たり前やろ?
Haskellの型システム理解するのにどれだけの時間をかけて教科書を読み、論文を読み、プログラミングを組んでみたか、その資産を使いたいとおもうのがそんなに悪いんか?
黙っといてくれよ
853デフォルトの名無しさん
2023/07/30(日) 00:24:40.66ID:dT6HJfPv854デフォルトの名無しさん
2023/07/30(日) 00:26:23.01ID:dT6HJfPv 論文読まないとプログラム言語が理解できないんだから困ったやつだろ
推論システムが変
推論システムが変
855デフォルトの名無しさん
2023/07/30(日) 00:29:41.31ID:dT6HJfPv まずは"真面目にRust学習"しろ
そして習得しろ
そして疑問を解決しろ
そして習得しろ
そして疑問を解決しろ
856デフォルトの名無しさん
2023/07/30(日) 00:32:06.97ID:psEFm3Dt >>854
すまんけどオレは論文なんか読まなくても理解できるような天才じゃないんだよ
君は論文なんぞ読まなくても何もかもわかる天才なのかもしれんけど世の中そんな天才ばかりじゃないんだよ
オレみたいに寝食忘れて努力に努力を重ねてやっと話しが分かる鈍才もいるんだよ
鈍才が悪あがきするの邪魔せんでくれ
すまんけどオレは論文なんか読まなくても理解できるような天才じゃないんだよ
君は論文なんぞ読まなくても何もかもわかる天才なのかもしれんけど世の中そんな天才ばかりじゃないんだよ
オレみたいに寝食忘れて努力に努力を重ねてやっと話しが分かる鈍才もいるんだよ
鈍才が悪あがきするの邪魔せんでくれ
857デフォルトの名無しさん
2023/07/30(日) 00:33:26.30ID:psEFm3Dt858デフォルトの名無しさん
2023/07/30(日) 02:16:35.97ID:ArPWIRVu 大先生3人に共通するのは
自分は分かってるという根拠のない思い込みと
何度指摘されても全く反省せず同じことを繰り返す傍迷惑な行動
自分は分かってるという根拠のない思い込みと
何度指摘されても全く反省せず同じことを繰り返す傍迷惑な行動
859デフォルトの名無しさん
2023/07/30(日) 02:39:34.14ID:g1ghpAt+ >>847
consセルを使った簡易なリスト操作表記をRustは言語仕様レベルではサポートしていない
だからそのHaskellのmysumをその表現のまま移植するのは本質的ではないため
意味だけを重視してリストをイテレータで表現し再帰定義している点を尊重すると
use std::ops::Add;
use num::Zero;
fn mysum<T>(mut iter: impl Iterator<Item = T>) -> T
where
T: Zero + Add<Output = T>,
{
match iter.next() {
Some(n) => n + mysum(iter),
None => T::zero(),
}
}
一例としてこのようにmysumはジェネリックに書ける
mysumに最低限必要なトレイト境界(Zero + Add)のみを課している
もちろんこの関数だけで以下のように機能して計算結果も合う
assert_eq!(15, mysum([1, 2, 3, 4, 5].into_iter()));
consセルを使った簡易なリスト操作表記をRustは言語仕様レベルではサポートしていない
だからそのHaskellのmysumをその表現のまま移植するのは本質的ではないため
意味だけを重視してリストをイテレータで表現し再帰定義している点を尊重すると
use std::ops::Add;
use num::Zero;
fn mysum<T>(mut iter: impl Iterator<Item = T>) -> T
where
T: Zero + Add<Output = T>,
{
match iter.next() {
Some(n) => n + mysum(iter),
None => T::zero(),
}
}
一例としてこのようにmysumはジェネリックに書ける
mysumに最低限必要なトレイト境界(Zero + Add)のみを課している
もちろんこの関数だけで以下のように機能して計算結果も合う
assert_eq!(15, mysum([1, 2, 3, 4, 5].into_iter()));
860デフォルトの名無しさん
2023/07/30(日) 02:43:03.72ID:g1ghpAt+ >>859のmysumでトレイト境界はZeroとAddさえ満たしていれば通常の数値でなくても構わないので
例えば以下のようなHoge型を定義して必要なトレイト境界(ZeroとAdd)を実装すると
#[derive(PartialEq, Debug)]
struct Hoge(usize);
impl Zero for Hoge {
fn zero() -> Self { Hoge(0) }
fn is_zero(&self) -> bool { self.0 == 0 }
}
impl Add for Hoge {
type Output = Self;
fn add(self, rhs: Self) -> Self {
Hoge((1 << (self.0.trailing_ones() + rhs.0.trailing_ones())) - 1)
}
}
先程と同じように「15 = 1 + 2 + 3 + 4 + 5」をHoge型で表現することで
Hogeについてもmysum()は以下のようにきちんと計算できていることがわかる
assert_eq!(Hoge(0b111111111111111), mysum([Hoge(0b1), Hoge(0b11), Hoge(0b111), Hoge(0b1111), Hoge(0b11111)].into_iter()));
Haskellに全く詳しくないので逆に質問というか教えてほしい
このHoge型をHaskellで定義(実装)するにはどのようなコードになるのか?
そしてこのHoge型に対してもHaskell版>>839のmysumで使えるようにするにはどうするのか?
たぶん型クラスNumの代わりに型クラスZeroとAddを指定するだけで済むのだろうけど
もしHaskellに型クラスZeroやAddがなければそれを定義する形になるのだろうか?
よろしくお願いします
例えば以下のようなHoge型を定義して必要なトレイト境界(ZeroとAdd)を実装すると
#[derive(PartialEq, Debug)]
struct Hoge(usize);
impl Zero for Hoge {
fn zero() -> Self { Hoge(0) }
fn is_zero(&self) -> bool { self.0 == 0 }
}
impl Add for Hoge {
type Output = Self;
fn add(self, rhs: Self) -> Self {
Hoge((1 << (self.0.trailing_ones() + rhs.0.trailing_ones())) - 1)
}
}
先程と同じように「15 = 1 + 2 + 3 + 4 + 5」をHoge型で表現することで
Hogeについてもmysum()は以下のようにきちんと計算できていることがわかる
assert_eq!(Hoge(0b111111111111111), mysum([Hoge(0b1), Hoge(0b11), Hoge(0b111), Hoge(0b1111), Hoge(0b11111)].into_iter()));
Haskellに全く詳しくないので逆に質問というか教えてほしい
このHoge型をHaskellで定義(実装)するにはどのようなコードになるのか?
そしてこのHoge型に対してもHaskell版>>839のmysumで使えるようにするにはどうするのか?
たぶん型クラスNumの代わりに型クラスZeroとAddを指定するだけで済むのだろうけど
もしHaskellに型クラスZeroやAddがなければそれを定義する形になるのだろうか?
よろしくお願いします
861デフォルトの名無しさん
2023/07/30(日) 10:57:59.43ID:TSIasAnA >>860
Haskellではこうなります
https://ideone.com/PKy694
mysum [] = 0
mysum ( a : as ) = a + ( mysum as )
hogePlus a 0 = a
hogePlus a b | even b = 2 * (hogePlus a ( div b 2 ) )
hogePlus a b = 1 + 2 * (hogePlus a ( div b 2 ) )
data Hoge = H Integer deriving Show
instance Num Hoge where
( H x ) + ( H y ) = H ( hogePlus x y )
fromInteger = H
main = do
print $ mysum [ 1..5 ]
print $ hogePlus 3 7
print $ mysum [ H 1, H 3, H 7, H 15, H 31 ]
Haskellではこうなります
https://ideone.com/PKy694
mysum [] = 0
mysum ( a : as ) = a + ( mysum as )
hogePlus a 0 = a
hogePlus a b | even b = 2 * (hogePlus a ( div b 2 ) )
hogePlus a b = 1 + 2 * (hogePlus a ( div b 2 ) )
data Hoge = H Integer deriving Show
instance Num Hoge where
( H x ) + ( H y ) = H ( hogePlus x y )
fromInteger = H
main = do
print $ mysum [ 1..5 ]
print $ hogePlus 3 7
print $ mysum [ H 1, H 3, H 7, H 15, H 31 ]
862デフォルトの名無しさん
2023/07/30(日) 10:58:19.77ID:TSIasAnA この例だとmysumの型は
mysum :: ( Num a ) => [ a ] -> a
と推論されます
すなわちmysumは
aがNum class に属する型aに対して[a]型の値に対してa型の値を返す関数の型
です
よってmysumをある型Hogeで利用するにはHogeにNumインスタンスを導入しなければなりません、すなわちRustでは
impl Num for Hoge { ... }
のように書く部分です( >> 860 のAdd,Zeroを実装してる部分に該当します)
本来はNumのminimal complete definition全部実装するべきでHaskell1990までは“定義が揃ってない”とおこられましたが。2010以降は必要な分だけ実装すれば良い、ただし実行時エラーは覚悟しろという風に変更されてるようです(未確認、コンパイラがエラー吐かなくなったので)
mysum :: ( Num a ) => [ a ] -> a
と推論されます
すなわちmysumは
aがNum class に属する型aに対して[a]型の値に対してa型の値を返す関数の型
です
よってmysumをある型Hogeで利用するにはHogeにNumインスタンスを導入しなければなりません、すなわちRustでは
impl Num for Hoge { ... }
のように書く部分です( >> 860 のAdd,Zeroを実装してる部分に該当します)
本来はNumのminimal complete definition全部実装するべきでHaskell1990までは“定義が揃ってない”とおこられましたが。2010以降は必要な分だけ実装すれば良い、ただし実行時エラーは覚悟しろという風に変更されてるようです(未確認、コンパイラがエラー吐かなくなったので)
863デフォルトの名無しさん
2023/07/30(日) 12:33:59.93ID:g1ghpAt+ >>861
RustのAddトレイト実装によって足し算(a + b)のみを他の型でも自由に使えるようにできる機能をHaskellは持っていないということ?
そのためHaskellではやむを得ない代替処置としてHoge型を型クラスNumへ入れてしまうことで解決したということ?
例えばRustではStringについてもAddトレイト実装があり
let s = String::from("abc");
assert_eq!(s + "xyz", String::from("abcxyz"));
といったこともできます
同様に自作の型に対しても足し算のみの実装が可能です
Haskellではこのようなケースでもオーバースペック気味にNumを使うしかないのでしょうか?
RustのAddトレイト実装によって足し算(a + b)のみを他の型でも自由に使えるようにできる機能をHaskellは持っていないということ?
そのためHaskellではやむを得ない代替処置としてHoge型を型クラスNumへ入れてしまうことで解決したということ?
例えばRustではStringについてもAddトレイト実装があり
let s = String::from("abc");
assert_eq!(s + "xyz", String::from("abcxyz"));
といったこともできます
同様に自作の型に対しても足し算のみの実装が可能です
Haskellではこのようなケースでもオーバースペック気味にNumを使うしかないのでしょうか?
864デフォルトの名無しさん
2023/07/30(日) 12:37:15.22ID:g1ghpAt+ >>862
Haskellでは実行時エラーを覚悟しろという点は非常に困りますね
今回のケースも無理やりにNumへ入れてしまったのに足し算しか実装していないから引き算や掛け算などで実行時エラーとなるわけですよね
ちなみにRustのnumクレートでは
trait Num: Zero + One + NumOps + PartialEq とトレイト境界があり
impl NumOps for T where T: Add + Sub + Mul + Div + Rem {} の実装があります
つまり自作の型で使う場合は全ての演算を実装した上で更に加えて
impl Num for Foo とするとようやくNumになれます
したがってRustでは不備があればコンパイル時エラーとなり安心して安全に使うことができます
Haskellでは実行時エラーを覚悟しろという点は非常に困りますね
今回のケースも無理やりにNumへ入れてしまったのに足し算しか実装していないから引き算や掛け算などで実行時エラーとなるわけですよね
ちなみにRustのnumクレートでは
trait Num: Zero + One + NumOps + PartialEq とトレイト境界があり
impl NumOps for T where T: Add + Sub + Mul + Div + Rem {} の実装があります
つまり自作の型で使う場合は全ての演算を実装した上で更に加えて
impl Num for Foo とするとようやくNumになれます
したがってRustでは不備があればコンパイル時エラーとなり安心して安全に使うことができます
865デフォルトの名無しさん
2023/07/30(日) 12:47:58.55ID:wjjxPYUe そろそろ隔離スレ行ってろカスども
866デフォルトの名無しさん
2023/07/30(日) 14:02:34.57ID:iwDEPHME Haskell 的には演算子オーバーロードを目的として型クラスを使うことはしない。
Num な性質を持つ値の操作として + という名前の演算子もあるというだけで、
演算子として + を使いたいから型クラスの実装を定義するということはしないってこと。
それに、 Num はいくつかの演算子を使えるというだけではなく
それらの演算子の関係で満たさなければいけない性質があるので個々の演算子 (に結び付く型クラス) として分解できない。
https://hackage.haskell.org/package/base-4.18.0.0/docs/Prelude.html#t:Num
価値観が違う。
なんせ Haskell では記号を組み合わせていくらでも演算子を作ることが出来て
たとえば <$> とか >>= とかいう変な演算子を必要なだけ作れるので少ない演算子を取り合う必要がない。
Num の性質の中で + を使うってのと、
なんらかの足し算っぽい操作は別の名前で定義されているべきだし、
Haskell ではそれで困らない。
価値観が違う。
Num な性質を持つ値の操作として + という名前の演算子もあるというだけで、
演算子として + を使いたいから型クラスの実装を定義するということはしないってこと。
それに、 Num はいくつかの演算子を使えるというだけではなく
それらの演算子の関係で満たさなければいけない性質があるので個々の演算子 (に結び付く型クラス) として分解できない。
https://hackage.haskell.org/package/base-4.18.0.0/docs/Prelude.html#t:Num
価値観が違う。
なんせ Haskell では記号を組み合わせていくらでも演算子を作ることが出来て
たとえば <$> とか >>= とかいう変な演算子を必要なだけ作れるので少ない演算子を取り合う必要がない。
Num の性質の中で + を使うってのと、
なんらかの足し算っぽい操作は別の名前で定義されているべきだし、
Haskell ではそれで困らない。
価値観が違う。
867デフォルトの名無しさん
2023/07/30(日) 18:06:30.12ID:mgfeU+D6 新設の見慣れぬ演算子の種類を勝手に増やして各々が異なる意味付けすることは可読性を下げるのみで百害あって一利無し
>>862
コンパイラがエラーを吐かずに実行時エラーとなるのはマズいな
Haskellの価値観はよくない
>>862
コンパイラがエラーを吐かずに実行時エラーとなるのはマズいな
Haskellの価値観はよくない
868デフォルトの名無しさん
2023/07/30(日) 19:58:32.75ID:Llc746TG すいません、筆が滑りました
もちろんコンパイル時にエラー吐きます
以前のHaskellだと例えそのプログラムで使われてない場合でも実装しないとエラー吐いてました
しょうがないのでwhere句に使いもしないのに
_ * _ = undefined
signum _ = undefined
....
を書いてました
流石に無意味すぎて使わないのは書かなくて良いことになったようです
使ってるのに未実装はもちろんコンパイラが見つけてくれます
もちろんコンパイル時にエラー吐きます
以前のHaskellだと例えそのプログラムで使われてない場合でも実装しないとエラー吐いてました
しょうがないのでwhere句に使いもしないのに
_ * _ = undefined
signum _ = undefined
....
を書いてました
流石に無意味すぎて使わないのは書かなくて良いことになったようです
使ってるのに未実装はもちろんコンパイラが見つけてくれます
869デフォルトの名無しさん
2023/07/30(日) 20:06:02.24ID:iwDEPHME どうでもいいけど signum という名前を見るとヴォルケンリッターを連想してしまう……
870デフォルトの名無しさん
2023/07/31(月) 08:16:09.72ID:G+nEO2Oo どうでもいいなら・・・煽りたくなるな
871デフォルトの名無しさん
2023/07/31(月) 10:23:47.98ID:8wbRk2dY use Hoge::prelude::*; って良く観るがダサいなー
872デフォルトの名無しさん
2023/07/31(月) 10:35:07.69ID:i3Lje9zm でもまあ機能ごとにモジュールを整理しても
それとは別によく使う集合があるのも現実だし。
それとは別によく使う集合があるのも現実だし。
873デフォルトの名無しさん
2023/07/31(月) 11:07:00.50ID:sgBBFIN2 global 禁止(キリっ
874デフォルトの名無しさん
2023/07/31(月) 12:25:28.59ID:lZja90Kc875デフォルトの名無しさん
2023/07/31(月) 12:34:21.81ID:eCR2qI4e Rustで、Vecに要素を追加したとき、メモリ不足で
メモリ確保に失敗した場合、どうなるんですか?
C++の場合は「例外」がthrowされますが。
メモリ確保に失敗した場合、どうなるんですか?
C++の場合は「例外」がthrowされますが。
876デフォルトの名無しさん
2023/07/31(月) 14:38:56.18ID:uDpaCeqo pqnic
877デフォルトの名無しさん
2023/07/31(月) 16:40:54.67ID:cE0Z6rmj ピクニック?
878デフォルトの名無しさん
2023/07/31(月) 17:53:43.20ID:1dCFbVL1 fn っていちいち略さなくても function でよくない?
書き込める変数の宣言に mut ってつけるのもダサい
書き込める変数の宣言に mut ってつけるのもダサい
879デフォルトの名無しさん
2023/07/31(月) 18:05:43.81ID:+bjI2PCn mutはガチでダサい
何かいい記号はなかったのかとw
何かいい記号はなかったのかとw
880デフォルトの名無しさん
2023/07/31(月) 18:13:53.64ID:+bjI2PCn 英語圏の人たちはmut見てcoolに感じるとか日本人と感性が違う可能性がある
881デフォルトの名無しさん
2023/07/31(月) 18:38:57.32ID:9nT3Yxeb >>878
感性が古いよ
感性が古いよ
882デフォルトの名無しさん
2023/07/31(月) 18:48:05.02ID:STr6yd2M 今までミュートと読んでいた
883デフォルトの名無しさん
2023/07/31(月) 18:49:54.52ID:A3cMstwB unicode解禁にして変にすればいい
884デフォルトの名無しさん
2023/07/31(月) 20:49:15.69ID:X0OEUfKN >>881
短い略語を使いたがるのはメモリ容量が少なかった昔の習性・感性だろ。
昔に作られた言語のFortranとPascalですらfunctionは略さなかったのに、
今になって変な略語を採用したRust開発者は工学的センスも美的センスもない。
比較的新しい言語のF#はmutと略さずにmutableと書く。
短い略語を使いたがるのはメモリ容量が少なかった昔の習性・感性だろ。
昔に作られた言語のFortranとPascalですらfunctionは略さなかったのに、
今になって変な略語を採用したRust開発者は工学的センスも美的センスもない。
比較的新しい言語のF#はmutと略さずにmutableと書く。
885デフォルトの名無しさん
2023/07/31(月) 21:15:27.96ID:+bjI2PCn BASICの頃はDEF FNと言うので関数を定義してた
886デフォルトの名無しさん
2023/07/31(月) 21:25:40.03ID:4/4p/Sxt 様々なプログラミング言語があって千差万別な中
大した問題ではないキーワード名やその多少の長さに文句をつける人はダメな仕事できないやつ
仕事できる人は文法とその意味論を比べる
大した問題ではないキーワード名やその多少の長さに文句をつける人はダメな仕事できないやつ
仕事できる人は文法とその意味論を比べる
887デフォルトの名無しさん
2023/07/31(月) 21:34:38.41ID:+bjI2PCn ダサいのはダサい
今後何があってもbegin end区切りの言語は使わないと思う
delphiやってた時もimplementationと言うのを見てクソダサいなと感じた
Objective-Cも二度と接することはないだろう
今後何があってもbegin end区切りの言語は使わないと思う
delphiやってた時もimplementationと言うのを見てクソダサいなと感じた
Objective-Cも二度と接することはないだろう
888デフォルトの名無しさん
2023/07/31(月) 22:59:44.59ID:i3Lje9zm kotlin や swift の前で同じこと言えるの?
889デフォルトの名無しさん
2023/07/31(月) 23:19:46.93ID:+bjI2PCn implementation Point {
public function ...
}
public function ...
}
890デフォルトの名無しさん
2023/08/01(火) 03:00:40.65ID:8wU+ches891デフォルトの名無しさん
2023/08/01(火) 03:53:49.10ID:enF/Vqu1 constは定数だからコンパイル時に静的に確定する
immutableかmutableかというのはconstとは無関係な概念で実行時の変数の値が書き換わるかどうか
つまりRustの非mut (immutable)は定数ではなく実行時に値が決まる変数
immutableかmutableかというのはconstとは無関係な概念で実行時の変数の値が書き換わるかどうか
つまりRustの非mut (immutable)は定数ではなく実行時に値が決まる変数
892デフォルトの名無しさん
2023/08/01(火) 11:16:59.87ID:AvEKEx5a let x : u32 = 1234;
と
const x : u32 = 1234;
は違うんですか?
と
const x : u32 = 1234;
は違うんですか?
893デフォルトの名無しさん
2023/08/01(火) 11:22:28.49ID:AvEKEx5a なるほど、const = の右辺値はconst 文脈で書かれていてコンパイル時に決定できないといけないけど let = の右辺はその制約がないのか
894デフォルトの名無しさん
2023/08/01(火) 17:52:49.94ID:3uGNwlqu constはコンパイル時に値が決まる定数となり定数名は大文字で書く
letは(mutの有無に関係なく)実行時に値が決まる変数となり変数名は小文字で書く
mutの有無はその変数の値が書き換えられるかどうかだけの違い
letは(mutの有無に関係なく)実行時に値が決まる変数となり変数名は小文字で書く
mutの有無はその変数の値が書き換えられるかどうかだけの違い
895デフォルトの名無しさん
2023/08/01(火) 18:49:11.32ID:Nt/KTAzO 自分は素人だけどそれじゃあ型に対する言及が抜けてないですか?
896デフォルトの名無しさん
2023/08/01(火) 20:27:35.06ID:3uGNwlqu 型とは直交する概念なので型とは無関係
任意の型で成り立つ
任意の型で成り立つ
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 立憲・野田代表が主張 台湾有事答弁で「質問者批判は筋違い」「答弁がおかしい」「高市総理迎合のネット世論は危険」★2 [♪♪♪★]
- 戦略的互恵関係望むなら答弁撤回せよと中国 [どどん★]
- 【速報】 植田日銀総裁 「円安進行が物価高を起こしている」 ★2 [お断り★]
- 「ふざけんな!」 国会議員給与、『月5万円増』報道にネット騒然 「国民が物価高で困っているのに」「定数削減とか言いながら…」 [♪♪♪★]
- デヴィ夫人、悪化の日中関係に言及「戦いましょう」「日本の経済人よ、日本総力で戦えば勝てるはず」 [muffin★]
- 【無言】中国怒らせた高市首相→1週間だんまり、国民に実害も説明なし 中国問題を避けてスルー… ★11 [BFU★]
- 高市首相「戦略的互恵関係望む」中国「なら答弁撤回しろよ」 [834922174]
- 【悲報】ウクライナ「ロシアに領土を割譲します」ウク信「ウクライナはプーアノン!」 [616817505]
- 【悲報】日本、中国に対して切れるカードが1枚もないことが発覚… 中国にボロクソ言われても高市さんは黙り込むしかなかった [271912485]
- 戦略的互恵関係望むなら答弁撤回せよと中国。高市、もう後がなくなる [805596214]
- 【鈴木早苗】お米券おひとり様3000円に閣議決定 [993451824]
- 架空を滑空ビューーーン👊😅👊三三☁😶‍🌫🏡
