日本情報オリンピックの問題

id:kenkitiiさんがふつうの haskellプログラミング読了&はじめてのhaskell - Λάδι Βιώσαςで日本情報オリンピックの問題を解いていらっしゃいます。おっ、これはHaskellにぴったり。ということで僕も解いてみました。実際の問題はこちらです。

n 個の整数からなる数列 a1, a2, ..., anと正整数 k (1 ≦ k ≦ n) が与えられる.
このとき,連続して並ぶ k 個の整数の和 Si = ai+ai+1+...+ai+k−1 (1 ≦ i ≦ n−k+1) の最大値を出力するプログラムを作りなさい
http://www.ioi-jp.org/joi/2006/2007-ho-prob_and_sol/2007-ho.pdf

ファイルI/Oは面倒なので省略しています。
こういう現実世界のドロドロとは無縁な問題を解いていると、あー、Haskellは何て素晴らしいんだと思います。Haskellの機能全てがラブいです。

module Main (main) where

import Data.List (tails)

calcMax :: Int -> [Int] -> Int
calcMax k = maximum $ map sum $ 
  filter ((==) k . length) $ map (take k) $ tails xs

main :: IO ()
main = print $ calcMax 3 [2, 5, -4, 10, 3]
-- => 11