開発環境
- 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(左畳み込み、遅延性、スペースリーク)、練習問題 5.をDartで考えてみる。
その他参考書籍
- What is Dart? [Kindle版] (O'Reilly Media) Kathy Walrath Seth Ladd (著) このブログでの感想
練習問題 5.
コード
sample.dart
import 'dart:html';
void main(){
run.onClick.listen((MouseEvent event){
pre.text = '';
// 最初から奇数の間は取得。
for(Iterable sequence in sequences){
pre.text += 'List: ${sequence}\n' +
'takeWhile: ${sequence.takeWhile((int a) => a.isOdd)}\n' +
'recursive: ${takeWhileWithRecursive((int a) => a.isOdd, sequence)}\n' +
'fold: ${takeWhileWithFold((int a) => a.isOdd, sequence)}\n' +
'loop: ${takeWhileWithLoop((int a) => a.isOdd, sequence)}\n\n';
}
});
clear.onClick.listen((MouseEvent event) => pre.text = '');
}
Iterable<Iterable> takeWhileWithRecursive(bool f(var a), Iterable sequence){
if (sequence.isEmpty){
return sequence;
}
var a = sequence.first;
if(f(a)){
var temp = [a];
temp.addAll(takeWhileWithRecursive(f, sequence.skip(1)));
print(temp);
return temp;
}
return [];
}
Iterable<Iterable> takeWhileWithFold(bool f(var a), Iterable sequence){
bool flag = true;
return sequence.fold([], (List previous, var element){
if(flag){
if(f(element)){
previous.add(element);
return previous;
} else {
flag = false;
}
}
return previous;
});
}
Iterable<Iterable> takeWhileWithLoop(bool f(var a), Iterable sequence){
var result = [];
for(var element in sequence){
if(f(element)){
result.add(element);
} else {
break;
}
}
return result;
}
ButtonElement run = querySelector('#run_dart');
ButtonElement clear = querySelector('#clear');
PreElement pre = querySelector('#pre0');
List<List<int>> sequences = [[1, 3, 2, 4, 5], [2, 4, 1, 3, 5], [1], [2], []];
0 コメント:
コメントを投稿