2014年1月31日金曜日

開発環境

Real World Haskell―実戦で学ぶ関数型言語プログラミング(Bryan O'Sullivan (著)、 John Goerzen (著)、 Don Stewart (著)、山下 伸夫 (翻訳)、伊東 勝利 (翻訳)、株式会社タイムインターメディア (翻訳)、オライリージャパン)の4章(関数プログラミング)、4.6(ループをどのように考えるか)、4.6.9(左畳み込み、遅延性、スペースリーク)、練習問題 5.をDartで考えてみる。

その他参考書籍

練習問題 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 コメント:

コメントを投稿