LoginSignup
3
0

More than 5 years have passed since last update.

【LT没資料】 From Haskell to Perl

Posted at
1 / 18

YAPC::Hokkaido SAPPORO のLTに応募しましたが、採択されませんでしたので没になった資料をそのまま公開します。


まだ型チェックの厳しい言語で消耗してるの?


動的型付け言語を使おう!


quickcheck

  • 単体テストライブラリ
  • 満たすべき性質を記述する
  • テストケースを自動生成
  • ランダムに生成する (VS smallcheck)
  • テストケースの確率分布はプログラマが制御する

Test::RandomCheck

Test::RandomCheck

  • quickcheckをPerlへ移植したもの

使用例

例えば新人が挑戦的な length 関数を書いてきた時。

use List::Util qw(sum);

sub my_length {
  (my $x = splice @_, 0, 1) =~ s/./2/g;
  sum (split //, $x || 0) >> 1;
}

lengthの性質

  • length("") == 0
  • length($char) == 1
  • length($s1 . $s2) == length($s1) + length($s2)

空文字列のチェック

is my_length(""), 0;

単位のチェック

性質を式に書く。

my_length($char) == 1;

単位のチェック

Test::RandomCheck を使う。

use Test::RandomCheck;
use Test::RandomCheck::Generator;

random_ok {
    my $char = shift;
    my_length($char) == 1;
} char;

演算の保存のチェック

性質を式に書く。

my_length($s1) + my_length($s2) == my_length($s1 . $s2);

演算の保存のチェック

性質の記述に必要な型を、Test::RandomCheck::Generator で定義。

my $type_of_arguments = concat(string, string);

演算の保存のチェック

Test::RandomCheck を使う。

my $type_of_arguments = concat(string, string);
random_ok {
    my ($s1, $s2) = @_;
    my_length($s1) + my_length($s2) == my_length($s1 . $s2);
} $type_of_arguments;

自然性をチェックしてみる

性質を式に書く。

my @chars = split //, $str;
my $mapped = join '', map { $f->($_) } @chars;
my_length($str) == my_length($mapped);

自然性をチェックしてみる

性質の記述に必要な型を、Test::RandomCheck::Generator で定義。

my $type_of_arguments = concat(string, function(char, char));

自然性をチェックしてみる

こんな感じ。

my $type_of_arguments = concat(string, function(char, char));
random_ok {
    my ($str, $f) = @_;
    my @chars = split //, $str;
    my $mapped = join '', map { $f->($_) } @chars;
    my_length($str) == my_length($mapped);
} $type_of_arguments;

まとめ

  • 性質を検査できるのは便利
  • 生成される変数の質が悪いから手直しいるかな・・・
3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0