ラグランジュの四平方定理

リストモナドすごーい。

import System
import Control.Monad

lagrange :: Integer -> [(Integer, Integer, Integer, Integer)]
lagrange x = do let seed = [ s^2 | s <- [0..(floor $ sqrt $ fromInteger x)]]
                a <- seed
                b <- [ b | b <- seed, b <= a ]
                c <- [ c | c <- seed, c <= b ]
                d <- [ d | d <- seed, d <= c ]
                guard $ sum [a,b,c,d] == x
                return (a,b,c,d)
main :: IO ()
main = do (arg:_) <- getArgs
          let result = lagrange $ read arg
          print result
          print $ length result