開発環境
- OS X Mavericks - Apple (OS)
- Dart Editor (開発環境)
- Dartium | Dart/ Structured web apps (ブラウザ, Dart VM 用 (Chromium with the Dart VM))
- Safari (ブラウザ, JavaScript 用)
- Dart (プログラミング言語)
Real World Haskell―実戦で学ぶ関数型言語プログラミング(Bryan O'Sullivan (著)、 John Goerzen (著)、 Don Stewart (著)、山下 伸夫 (翻訳)、伊東 勝利 (翻訳)、株式会社タイムインターメディア (翻訳)、オライリージャパン)の4章(関数プログラミング)、4.6(ループをどのように考えるか)、4.6.9(左畳み込み、遅延性、スペースリーク)、練習問題 6.をDartで考えてみる。
その他参考書籍
- What is Dart? [Kindle版] (O'Reilly Media) Kathy Walrath Seth Ladd (著) このブログでの感想
練習問題 6.
コード
sample.dart
import 'dart:html';
void main(){
run.onClick.listen((MouseEvent event){
pre.text = window.navigator.userAgent + '\n';
for (var x in [[(a, b) => a == b, '=='], [(a, b) => a < b, '<'],
[(a, b) => a > b, '>'], [(a, b) => a != b, '!=']]){
var f = x[0];
var op = x[1];
pre.text += '$op\n';
for(List sequence in sequences){
pre.text += 'List: $sequence\ngroupBy: ${groupBy(f, sequence)}\n';
}
}
});
clear.onClick.listen((MouseEvent event) => pre.text = '');
}
ButtonElement run = querySelector("#run_dart");
ButtonElement clear = querySelector("#clear");
PreElement pre = querySelector('#pre0');
List<List<int>> sequences = [[], [1,1,2,2,3,4,5], [1,2,3,4,5],[5,4,3,2,1],
[1,2,3,4,5,1,2,3,4,5],[5,4,3,2,1,5,4,3,2,1]];
List<List> groupBy(bool f(var a, var b), List sequence){
if(sequence.isEmpty){
return [];
}
List inner(List sequence){
if(sequence == null || sequence.isEmpty){
return [null, null, []];
}
return sequence.sublist(1).fold(
[sequence.first, [sequence.first], []],
(List previous, var element){
var y = previous[0];
List ys = previous[1];
List<List> xxs = previous[2];
if(f(y, element)){
ys.add(element);
return [y, ys, xxs];
} else {
xxs.add(ys);
return [element, [element], xxs];
}
});
}
var temp = inner(sequence);
var x = temp[0];
List ys = temp[1];
List<List> xxs = temp[2];
if (ys == null || ys.isEmpty) {
xxs.add([x]);
} else {
xxs.add(ys);
}
return xxs;
}
0 コメント:
コメントを投稿