2014年2月1日土曜日

開発環境

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

その他参考書籍

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

コメントを投稿