例として、「テキストファイルから1行ずつ読み込んで列挙する」というユースケースを考えます。テキストファイルの行数は不定とします(数百行かもしれないし、数万行かもしれないし、0行かもしれません)。Tuple(ファイルが1行以上ある場合)。なければ、その1行目の内容はもう取得済なのでそれを利用した処理をするだけ(println(line))。Tuple(ファイルがn+1行以上ある場合)。なければその行の内容はもう取得済なのでそれを利用した処理をするだけ。うん、一貫性ありますね。返せば良い」のですから。なんだかごちゃごちゃしているイメージですよね。同じ引数の組で別々の関数を呼び出しています。前者は「次の行があるかどうかの判定」をするだけで、後者は「次の行(と状態オブジェクト)を返す」という動作。呼び出されたときにそれを利用するようにした方が効率良くね?」とか思う方もいらっしゃるかもしれません6。そのあたりを色々考えると、この3関数の実装方法には、少なくとも3つの実装方針が考えられます。関数は、何らかの適切な『状態オブジェクト』を返す。関数は、何らかの適切な『状態オブジェクト』を返す。関数で、実際に次の要素を読み込んでしまう。読込に成功したら、引数で受け取った『状態オブジェクト』にその読み込んだ要素を格納しておく。関数では、『状態オブジェクト』に格納された(読込済の)要素を返すだけ(『状態オブジェクト』は使い回し)。関数呼び出し時点で、最初の要素取得を試みる。それを格納した『状態オブジェクト』を返す。取得に失敗したら『要素を格納していない状態オブジェクト』を返す。関数では、『状態オブジェクト』に格納された(読込済の)要素を返す。その前に次の要素を取得し、成功したらそれを格納した『状態オブジェクト』を、失敗したら要素を格納していない『状態オブジェクト』を一緒に返す。ほら、一貫していませんね。いう関数名とは裏腹に、設計方針によって全然違う動作となる実装(具体的には「要素を取得する」タイミングとそれをどの関数の役割として持たせるか)が可能なのです。ちなみに本来想定している仕様は、最前者の「方針1」。『状態』を実際の要素の取得とは分離された概念として考えて、各関数にそれぞれ適切な役割を持たせる、というのが本来の思想。先ほど挙げた例からも分かるとおり、どうしてもその方針で実装出来ないパターンも出てきます。その場合、「方針2」または「方針3」の実装を余儀なくされる場合もあるのです。これと比較して新形式は、1つの関数で1つの方針で実装出来る。シンプルな仕様となったわけです。実装したことがある場合。以下のような方針で新形式に変換できます。ものではなくもっと単純なものにする(1関数内で完結するので持ち回る必要が無いから)。なければ、取得した次の要素と『状態オブジェクト』を返せばOK。#25261某検査結果もどうやら異常なさそうですし。