Haskell Prelude にある list 系関数のうち range adaptor にしたら面白そうなヤツは全部 C++ に移植する的俺様専用メモ

  • break - rangeEx にある同名 (ただし過去分詞) なヤツは意味が違うよにぇ. Prelude に対応するものがないけれど rangeEx のヤツのセマンティスクに Prelude 風の名前つけるとしたら takeUnless?
  • concat - lvalueness についてかなり複雑なこと意識する必要があるけれど一応実装済
  • concatMap - これ concat を高階化して map (transformed) して concat で達成できるけれど,頻出パタンとして1つの関数に昇格されたのかしらね
  • cycle - 使いどころがわかんね
  • drop
  • dropWhile
  • enumFrom - 無限遅延な counting だあね
  • enumFromThen - これ関数にまで引き上げるようなパタンなのかな?自分としては counting + transformed な形で直交化したままで十分用が済む感覚なんだけれど
  • enumFromThenTo - 上に同じ
  • enumFromTo - counting として実装済
  • filter - 実装済
  • init - これ要るの?高階な形で何かに使うのかしらん
  • iterate - 前から実装しよう実装しようと思っていたけれど,名前が決まらなくて放棄してたヤツ. Haskell の Prelude から名前引っ張ってくるってのは案外お手軽だよにぇ.「naming の rationale は?」「Haskell の Prelude パクリました」
  • lines - これより汎用な形で実装済
  • map - 実装済
  • mapM - えー,あー,んーと…….たとえば Maybe もにゃどの場合,全部の map が成功した list が帰ってくる,もしくは1個でも失敗しちゃったら即座に失敗ちゃったテヘ☆,が帰ってくる感じ?よぐわがんね
  • repeat - 無限な replicate
  • replicate - 実装済
  • reverse - 実装済
  • scanl - これ何に使うの?1個だけ面白い使い道はすぐ思いつくけれど
namespace fs = boost::filesystem;
std::string dirs[3] = { "foo", "bar", "baz" };
range::scanned_l( _1 / _2, fs::path( "/" ), dirs ); // -> { "/", "/foo", "/foo/bar", "/foo/bar/baz" }
  • scanl1 - 同上.
  • scanr - うぅんぅぇ?
  • scanr1
  • sequence
  • splitAt - これ使い道が分からないんだよにぇ〜
  • tail - init に同じ
  • take - これ過去分詞取るので良いのかなぁ
  • takeWhile
  • unlines - String を range とみなしての話だけれど,これ最後の\nを付ける付けないは結構大きいな違いのはずなんだよにぇ
  • unwords - ……とか思ってたら速攻あった.これ何を delimiter にするかは汎用化するべきでしょう,という青年の主張
  • words - より汎用な形では実装済
  • zip - 実装済
  • zip3 - 相当するものを実装済
  • zipWith - 実装済み.だけど,他のものの組み合わせで簡単に実装できるものを特殊化して関数に引き上げるのは,その組み合わせがよっぽど頻出な場合に限定したいと思う今日この頃
  • zipWith3 - 同上.あと,名前に3以上の数字がくっついていたらその数字はテンプレート引数に書きたいワ・タ・シ