スキップしてメイン コンテンツに移動

Perl 5 to 6 - 型

2011-02-27: コメント欄で既に改訂された仕様の指摘がありましたので一部補足しました。id:uasiに感謝します。

これはMoritz Lenz氏のWebサイトPerlgeek.deで公開されているブログ記事"Perl 5 to 6" Lesson 02 - Typesの日本語訳です。

原文はCreative Commons Attribution 3.0 Germanyに基づいて公開されています。

本エントリにはCreative Commons Attribution 3.0 Unportedを適用します。

Original text: Copyright© 2008-2010 Moritz Lenz

Japanese translation: Copyright© 2011 SATOH Koichi

NAME

"Perl 5 to 6" Lesson 02 - 型

SYNOPSIS

my Int $x = 3;
$x = "foo";         # エラー
say $x.WHAT;        # 'Int()'

# 型チェック:
if $x ~~ Int {
    say '$x contains an Int'
}

DESCRIPTION

Perl6には型があります。すべてが何らかの形のオブジェクトであり、型を持ちます。変数は型制約を持つことができますが、必須ではありません。

知っておくべきいくつかの基本的な型があります:

'a string'      # Str
2               # Int
3.14            # Rat (有理数)
(1, 2, 3)       # Seq

「通常の」組み込み型はすべて大文字で始まります。「通常の」型はすべてAnyを継承し、他も含めたすべての型はObjectMu(コメントで指摘があったので修正しました。多謝。ちなみに「無」から来ているそうです)を継承します。

型名を変数宣言に加えることで、変数が保持できる値の型に制約をつけられます。

my Numeric $x = 3.4;
my Int @a = 1, 2, 3;

「間違った」型(与えられた型でもその派生型でもない型)の値を変数に代入しようとするとエラーになります。

配列に対する型宣言はその要素に対して適用されるので、my Str @sは文字列だけを格納できる配列になります。

いくつかの型は更に詳細な型の族を表します。例えば整数、有理数と浮動小数(Num型)はNumeric型を構成します。

イントロスペクション

.WHATメソッドを呼ぶことでインスタンスの型を知ることができます。

say "foo".WHAT;     # Str()

ただし、もしインスタンスが与えられた型を継承しているか確認したいのなら別の方法があります。 継承関係も考慮してくれるのでこちらの方がオススメです:

if $x ~~ Int {
    say 'Variable $x contains an integer';
}

MOTIVATION

型システムの詳細をすべて完全に理解することは簡単ではありませんが、型が必要な理由があります:

安全なプログラミング

インスタンスがある型であると宣言すれば然るべき処理を実行することを確信できます。確認の必要はありません。

最適化可能性

コンパイル時に型情報があれば然るべき最適化を行うことができます。 Perl6は必ずしもCより遅くなりません。原理的には。

拡張性

型情報と多重ディスパッチによって、特定の型に対して演算を簡単に再定義できます。

SEE ALSO

http://perlcabal.org/syn/S02.html#Built-In_Data_Types

コメント

  1. ルートクラスの名前は Object から Mu に変更されました( http://perlcabal.org/syn/S02.html#The_Mu_type )。

    返信削除
  2. 補足しました。ご指摘ありがとうございます。

    返信削除

コメントを投稿

このブログの人気の投稿

京大テキストコーパスのパーサを書いた

要旨CaboCha やなんかの出力形式であるところの京大テキストコーパス形式のパーサモジュールを Perl で書いたので紹介します。GithubTarball on Github Ppagesこれを使うと例えば CaboCha の出力した係り受け関係を Perl のオブジェクトグラフとして取得できます。使用例単なる文節区切りの例。#!/usr/bin/env perl use v5.18; use utf8; use IPC::Open3; use Parse::KyotoUniversityTextCorpus; use Parse::KyotoUniversityTextCorpus::MorphemeParser::MeCab; use Symbol qw//; my ($in, $out, $err); my $pid; BEGIN { ($in, $out, $err) = (Symbol::gensym, Symbol::gensym, Symbol::gensym); $pid = open3($in, $out, $err, cabocha => '-f1'); } END { close $out; close $err; waitpid $pid => 0 if defined $pid; } binmode STDOUT, ':encoding(utf8)'; binmode $in, ':encoding(utf8)'; binmode $out, ':encoding(utf8)'; my $parser = Parse::KyotoUniversityTextCorpus->new( morpheme_parser => Parse::KyotoUniversityTextCorpus::MorphemeParser::MeCab->new, ); say $in '星から出るのに、その子は渡り鳥を使ったんだと思う。'; say $in '出る日の朝、自分の星の片付けをした。'; close $in; my $sentence_trees = $parser->…

Algorithm::LibLinear の紹介

Notice: This article is outdated. Please refer an updated English tutorial. 要旨かなり前になりますが、Algorithm::LibLinear という Perl モジュールを書きました。CPANGithubこれを使うと線形分類器などが高速に学習できます。テキストや画像の分類が応用として期待されます。LIBLINEAR についてLIBLINEARLIBSVM と同じ台湾国立大学の Chih-Jen Lin 教授のチームが公開しているオープンソースの機械学習パッケージです。 関数のロジスティック回帰、サポートベクター回帰及び線形 SVM による多クラス分類を行うことができます。LIBSVM と違ってカーネル関数を使うことはできませんが、はるかに高速に動作します。Algorithm::LibLinear についてLIBLINEAR には C++ で書かれたライブラリと、その機能を使って機械学習と分類・関数回帰を行うコマンドラインユーティリティが含まれています。 Algorithm::LibLinear はライブラリの機能を Perl からオブジェクト指向的に利用できるようにした上で、コマンドラインユーティリティの一部機能をライブラリ化して Perl で再実装したものです。使い方分類問題を解くときは、訓練データセットの読み込み・スケーリング学習器パラメータの設定分類器の訓練実データの分類という手順で行います。訓練データセットの読み込み正解ラベルのついたデータを大量に用意して学習させます。LIBSVM 形式のデータを読み込むか:my $data_set = Algorithm::LibLinear::DataSet->load(string => <<'EOD'); 1 1:0.1 2:0.1 4:0.1 -1 1:0.1 2:-0.1 3:0.1 ... EOD HashRef として表現されたデータを使います:my $data_set = Algorithm::LibLinear::DataSet->new(data_set => [ +{ feature => +{ 1 => 0.1, 2 => 0.1, 4 =…

Perl 5 to 6 - 正規表現(またの名をルール)

これはMoritz Lenz氏のWebサイトPerlgeek.deで公開されているブログ記事"Perl 5 to 6" Lesson 07 - Regexes (also called "rules")の日本語訳です。原文はCreative Commons Attribution 3.0 Germanyに基づいて公開されています。本エントリにはCreative Commons Attribution 3.0 Unportedを適用します。Original text: Copyright© 2008-2010 Moritz LenzJapanese translation: Copyright© 2011 SATOH KoichiNAME"Perl 5 to 6" Lesson 07 - 正規表現(またの名をルール)SYNOPSISgrammar URL { token TOP { <schema> '://' [<ip> | <hostname> ] [ ':' <port>]? '/' <path>? } token byte { (\d**{1..3}) <?{ $0 < 256 }> } token ip { <byte> [\. <byte> ] ** 3 } token schema { \w+ } token hostname { (\w+) ( \. \w+ )* } token port { \d+ } token path { <[ a..z A..Z 0..9 \-_.!~*'():@&=+$,/ ]>+ } } my $match = URL.parse('http://perl6.org/documentation/')…