[過去ログ] Rust part21 (1002レス)
前次1-
抽出解除 レス栞

このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
リロード規制です。10分ほどで解除するので、他のブラウザへ避難してください。
430
(6): デフォルトの名無しさん [sage] 2023/10/07(土) 06:46:44.80 ID:bWLG2vp7(1) AAS
mut無しとはこういうことか
外部リンク:play.rust-lang.org

fn qsort<T: Copy+Ord>(list: &[T]) -> Vec<T> {
match list {
[pivot, ..] => {
let (smaller, rest): (Vec<T Vec<T>) =
list[1..].iter().partition(|&i| i < pivot);
[qsort(&smaller), vec![*pivot], qsort(&rest)].concat()
},
_ => vec![]
}
}

fn main() {
let list = [9, 0, 7, 3, 6, 1, 2, 4, 8, 5];
println!("{:?}", list);
println!("{:?}", qsort(&list));
}
435: デフォルトの名無しさん [sage] 2023/10/07(土) 15:18:57.75 ID:AO4ZOvxF(1) AAS
>>424
424(2): デフォルトの名無しさん [sage] 2023/10/06(金) 23:30:10.29 ID:hdhWn3/E(3/3) AAS
関数型に関してはscalaのほうがよっぽど意欲的だよ
def qsort(list: List[Int]): List[Int] = list match
case Nil => Nil
case pivot :: tail =>
val (smaller, rest) = tail.partition(_ < pivot)
qsort(smaller) ::: pivot :: qsort(rest)

たとえば↑こういうのとか
>>430
なるほど

美しいコードはスッキリうんこみたいに気持ち良い
まるで脳が洗われるようだ
普段いかに毒に浸かってるかが判るな
439
(1): デフォルトの名無しさん [sage] 2023/10/07(土) 23:59:36.96 ID:QajUcOD9(2/2) AAS
>>430
RustはそのようにOCamlやScalaと同等に書くことも容易な点がいいな
同時にその方法によりRustで記述すると大量にVec(またはリストを実現する何か)を使い捨てていることが見える
つまりGC言語ではガベージが大量に出る
442
(1): デフォルトの名無しさん [sage] 2023/10/08(日) 09:57:45.64 ID:ShBUnVvx(1) AAS
同等というより>>438
438(1): デフォルトの名無しさん [sage] 2023/10/07(土) 16:42:12.14 ID:2ow1Jojj(1) AAS
ocamlだとこんな感じかな?
let rec qsort = function
| [] -> []
| pivot :: tail ->
let smaller, rest = List.partition ((>) pivot) tail in
qsort smaller @ pivot :: qsort rest

>>424 scala比較のためそのままコピペ
def qsort(list: List[Int]): List[Int] = list match
case Nil => Nil
case pivot :: tail =>
val (smaller, rest) = tail.partition(_ < pivot)
qsort(smaller) ::: pivot :: qsort(rest)

scalaすごい頑張ってると思うわ
>>430は全く同じだな
空でなければpartitionでsmallerとrestに分けて
それぞれを再帰でqsortしてconcatenate
474
(3): デフォルトの名無しさん [sage] 2023/10/11(水) 23:18:11.74 ID:vJm7EO/F(1) AAS
>>441
441(1): デフォルトの名無しさん [sage] 2023/10/08(日) 08:07:41.64 ID:WAd1DVRF(1/3) AAS
同等に書けてないでしょw
>>430がVec使用だから同等でないという話ならばRustにもリンクリストがあるよ
リンクリストに特化したパターンマッチング構文や結合構文はないけれど
例えばTをCopyせずそのまま使うならば

use std::collections::LinkedList;

fn qsort<T: PartialOrd>(mut list: LinkedList<T>) -> LinkedList<T> {
 if let Some(pivot) = list.pop_front() {
  let (smaller, rest): (LinkedList<T LinkedList<T>) =
   list.into_iter().partition(|x| x < &pivot);
  // concat
  list = qsort(smaller);
  list.extend([pivot]);
  list.extend(qsort(rest));
 }
 list
}

fn main() {
 let list = LinkedList::from([9, 0, 7, 3, 6, 1, 2, 4, 8, 5]);
 println!("{:?}", list);
 println!("{:?}", qsort(list));
}
478: デフォルトの名無しさん [sage] 2023/10/12(木) 12:51:53.05 ID:5Y8Kw2UP(1/2) AAS
>>477
477(2): デフォルトの名無しさん [sage] 2023/10/12(木) 11:17:21.26 ID:u59ybXeV(2/2) AAS
>>474
mut 使ったら負け
そんな表層的なことを問題にするのは愚か

例えばmutを表層的に使っていない>>430はそこで呼び出しているpartitionとconcatそれぞれのなかでmutを使っている
当たり前だがデータを組み立てたり書き換える処理は全てmutにたどりつく

>>474でも表層的にmutを無くしたいだけならば同様にconcat関数を作りその中でmutを使えばいい
479: デフォルトの名無しさん [sage] 2023/10/12(木) 12:52:32.93 ID:5Y8Kw2UP(2/2) AAS
>>477
そんな表層的なことを問題にするのは愚か

例えばmutを表層的に使っていない>>430はそこで呼び出しているpartitionとconcatそれぞれのなかでmutを使っている
当たり前だがデータを組み立てたり書き換える処理は全てmutにたどりつく

>>474でも表層的にmutを無くしたいだけならば同様にconcat関数を作りその中でmutを使えばいい
前次1-
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.037s