新本格派を登場時期を基準に分類する場合がある。当初は、綾辻行人、有栖川有栖、法月綸太郎などを代表的な作家とし、京都大学ミステリ研究会出身の作家がその中心であったと見ることができる。この世代は、前述の古典的ミステリに倣った作風を志向しているのが特徴である（作家により差異はあるが、おおむね謎の不可解性や解決の論理性を重視している）。江戸川乱歩や横溝正史、クイーン（現在に至るまで、『Yの悲劇』のパロディものなどに取り組む作家は多い）などの影響を語る者も多い。狭義には「新本格派ミステリー作家」はこの世代の作家を指し、第一世代とも呼ばれる。1994年前後にも京極夏彦、西澤保彦、森博嗣ら、新人作家が多く登場している。この世代を第二世代と呼ぶことがあり、講談社の編集者・唐木厚のプロモーションによるところが大きい。また、さらに後続世代の作品を第三世代、新新本格などと称して売り出すこともあったが、概して、世代が下るほど、第一世代が強く持っていた論理性への拘りは薄れる傾向にある。もともと出版社主導のキャッチコピーが起源ということもあるが、第一世代作家の出版点数が減少、その後ミステリがおおむね拡散状況となったため、現在では、この用語自体が、歴史的な用語に近くなっているとされる。
1987年、綾辻行人が講談社から島田荘司の推薦を伴い『十角館の殺人』でデビューし、以降、講談社の編集者・宇山日出臣（宇山秀雄、新本格の生みの親とも言われる）は、主に講談社ノベルスを経路として、「新本格」をキャッチコピーとするミステリの集中的な販売戦略を取った。また、東京創元社の編集者・戸川安宣も、同時期に新人作家の活動をバックアップした。このような状況を受けて、1980年代後半から1990年代前半にかけ、国内のミステリの新人作家が相次いでデビュー、作品の出版点数が大きく高まり、一般的な注目も集まった。この一連の動きを指して、新本格ムーブメント（もしくは本格ミステリの第三の波〔これは笠井潔が提唱した呼称である〕）などと呼ぶ場合がある。
木を指定した位置で分割するためには、木の各部分に対してその部分が含む要素の数を計算する必要がある。class SizeMeasured a where size :: a -> Integerinstance SizeMeasured FingerTree where  size Empty = 0  size (Single a) = size a  size (Deep pr m sf) = size pr + size m + size sfinstance SizeMeasured Digit where  size (One a) = size a  size (Two a b) = size a + size b  -- その他のDigitは省略instance SizeMeasured Node where  size (Node2 a b) = size a + size b  size (Node3 a b c) = size a + size b + size cnewtype Leaf a = Leaf a -- 葉はLeafでくるんでおく。instance SizeMeasured Leaf where  size (Leaf _) = 1実際には木の各部分に要素数のキャッシュを追加しておき、再計算しないようにする。i番目の葉での分割演算は、i番目の葉を含む要素より左の要素からなる木・i番目の葉を含む要素・i番目の葉を含む要素より右の要素からなる木に分割する演算splitTreeAtを使って定義される。木が要素を1つだけもつときは単純である。ここで、iは0以上、木のサイズ未満とする。 splitTreeAt i (Single a) = (Empty, a, Empty)深い木の場合はi番目の葉の位置により場合分けする。まずi番目の葉が左の木や右の木に含まれる場合は、それを分割すればよい。 splitTreeAt i (Deep pr m sf)   | i <= size pr -- i番目の葉は左に含まれる     = let         (pr1, a, pr2) = splitDigitAt i pr       in         (pr1, a, Deep pr2 m sf)   | i > size pr + size m -- i番目の葉は右に含まれる     = let         (sf1, a, sf2) = splitDigitAt (i - size pr - size m) sf       in         (Deep pr m sf1, a, pr2)   -- 続く左右の木の分割は単純にi番目より左の要素と、i番目の要素と、i番目より右の要素に分ければよい。 splitDigitAt i (One a) = (Empty, a, Empty) splitDigitAt i (Two a b) | i < size a = (Empty, a, Single b)                          | otherwise = (Single a, b, Empty) -- 他のDigitについては略i番目の葉が中央のより深い木に含まれる場合はひと手間多く必要となる。まず中央の木を分割する。するとi番目の葉を含むNodeが得られる。このNodeをさらに分割すると葉が得られる。   -- 続き   | otherwise -- i番目の葉はより深い木に含まれる       = let           -- m1とm3はFingerTree、m2はNode。           (ml, xs, mr) = splitTreeAt (i - size pr) m           -- lとrはMaybe (Digit a)とする。           (l, a, r) = splitNodeAt (i - size pr - size ml) xs         in           -- deepR, deepLは、rやlがNothingの場合に繰り下がり処理をしてFingerTreeを作る関数           (deepR pr ml l, a, deepL r mr sf)  splitNodeAt i node = -- 省略  deepR pr m Nothing = borrowR pr m deepR pr m (Just sf) = Deep pr m sf  -- deepLは省略