ちょっと前に id:uskz 先生に「PStade.OvenはtakenWhileからtakenを定義してるから、Haskellでもできるんじゃないですか」とネタ振りしてたので、書いてみました。 インデックスのリストと一緒にループして、インデックスと比較する述語をxxxWhileに渡します。 インデックスリストは結果としていらないので、最後にインデックスを除いたリストを抽出。 take。 take2 :: Int -> [a] -> [a] take2 n xs = map snd (takeWhile (preds n) (zxs xs)) where zxs xs = zip (enumFrom 0) xs preds n zx = (fst zx) < n main = print $ take2 5 [3..10] [3,4,5,6,7] drop。 drop2 :: Int ->