型コンストラクタとは
型コンストラクタとは、ざっくり言うと「新しい型を作るための型」です。
普段使っているi32やStringなどは、それ自体が完成された一つの型です。
一方、型コンストラクタは、型を引数として受け取り、新しい型を生成するものです。
型コンストラクタとは、ざっくり言うと「新しい型を作るための型」です。
普段使っているi32やStringなどは、それ自体が完成された一つの型です。
一方、型コンストラクタは、型を引数として受け取り、新しい型を生成するものです。
Rustのトレイトは、型が持つべき振る舞い(メソッド)を定義する機能です。これは、他の言語におけるインターフェースや型クラスに非常に似ています。
Rustの関連型は、トレイトに特定の型を紐づけるための仕組みで、簡単に言うと「このトレイトを実装する型は、必ずこの名前で特定の型を持つ必要がある」というルールを定義するものです。
OCamlのListモジュールにはpartitionという便利な関数がありまして、これを使うとクイックソートが簡単に書くことができます。
let rec qsort = function
| [] -> []
| h :: t ->
let (l, r) = List.partition (fun x -> x < h) t in
(qsort l)@[h]@(qsort r)
こりゃ便利!と思い、他の言語でも使いたい!ということで自前で書くことにしました。
もう新年を迎えて2週間も経ってしまいましたが、新年あけまして、おめでたくないですが、皆様にとって良い一年になりますように。
当ブログは去年の末におかげさまで閲覧数が10000を超えました。一般的なブログの閲覧数とは雲泥の差ではありますが、なんとなく嬉しいです。今後もバタバタしながらも、時間を見つけて記事を書いていこうと思います。
新年早々に感染爆発・緊急事態宣言とえげつない状況となってしまいましたが、我々ができることは手洗い、うがい、目洗い、マスク、自粛のみ。それ以外はどうしようもできないことなので、自分でできることは全てやって、だめならだめでしょうがない、という気持ちで生きていきましょう。
今年もどうぞよろしくお願いいたします。
Rustではmatch式の省略形とも言えるif letというものがあります。
実は私、最近までこれを使わずmatch式をメインに使っていました。例えば以前の記事でRustのsubsliceを使ってL99問題をやってみるというものを書きましたが、そのコードのすべてがmatch式によるものでした。
しかし、今回if letを使って書き直してみると、何ともすっきりとしたコードになり、すっかりif letが気に入ってしまいましした。
ここ最近ずっとOCamlのL99をCommon Lispで書いてみるということをやっているのですが、あまり同じ言語ばかりやっていては、私の頭の中から他言語の知識が消えてしまう恐れがありますので、定期的に使う必要があります。悲しい脳みそです。
Common Lispのほうは現在L-37あたりまで進みましたが、今回は気分転換に、その先のL-46あたりのLogic and CodesというパートをRustでやってみようと思います。
まずドキュメントには以下のコードが書かれています。
# type bool_expr =
| Var of string
| Not of bool_expr
| And of bool_expr * bool_expr
| Or of bool_expr * bool_expr;;
let rev list =
let rec aux acc = function
| [] -> acc
| hd :: tl -> aux (hd::acc) tl in
aux [] list
;;
与えられたリストの先頭をaccの先頭に追加していくという形。
use sdl2;
use sdl2::video::Window;
use sdl2::render::Canvas;
use sdl2::event::Event;
use sdl2::pixels::Color;
use sdl2::keyboard::Keycode;
use std::error::Error;
use sdl2;
use sdl2::event::Event;
use sdl2::keyboard::Keycode;
use sdl2::mouse::MouseState;
use sdl2::image::{LoadSurface, InitFlag};
use sdl2::rect::Rect;
use sdl2::surface::Surface;
use std::time::Duration;
use std::thread;
use std::path::Path;
use sdl2;
use sdl2::event::Event;
use sdl2::keyboard::Keycode;
use sdl2::image::{LoadSurface, InitFlag};
use sdl2::rect::Rect;
use sdl2::surface::Surface;
use std::time::Duration;
use std::thread;
use std::path::Path;
use sdl2;
use sdl2::event::Event;
use sdl2::keyboard::Keycode;
use sdl2::image::{LoadSurface, InitFlag};
use sdl2::rect::Rect;
use sdl2::surface::Surface;
use std::time::Duration;
use std::thread;
use std::path::Path;
publicやprivateやprotectedなどのキーワードを付けることで、公開範囲を決定することができますが、Rustではシンプルにpubキーワードのみとなっています。その代わり、pub(..)といったかたちで範囲を変更することができます。car/cdr的なものは無いか?
fn main() {
let v = vec![1, 2, 3, 4, 5];
let (hd, tl) = v.split_first().unwrap();
assert_eq!(hd, &1);
assert_eq!(tl, &[2, 3, 4, 5]);
}
split_firstは、Option<(&T, &[T])>を返します。これを利用すればcar/cdr関数と同じように処理できます。split_first_mutというものもあり、こちらはミュータブルな参照を返します。car/cdrという名前で使いたい場合は以下のような関数を作成すればいいかと思います。