色々な言語で偶数自乗和 その2
TL;DR
java8
import java.util.stream.IntStream; public class Main { public static Integer evenSquareSum(Integer n) { return IntStream.range(1, n) .filter(n1 -> n1 % 2 == 0) // variable n is already defined in method evenSquareSum(Integer) と出るので変数名を変更。引数と同じ変数名は使えないみたい .map(n1 -> n1 * n1) .reduce(0, (acc, n1) -> acc + n1) ; } public static void main(String[] args) throws Exception { Integer result = evenSquareSum(10); System.out.println(result); } }
ちょっと見ない間にだいぶマシになった印象。 でも SIer とかだとバージョンアップできない所も多いんだろうな…
kotlin
fun main(args: Array<String>) { val result = evenSquareSum(10) println(result) } fun evenSquareSum(n: Int): Int { return (1..n) .filter{ n -> n % 2 == 0 }.map{ n -> n * n }.fold(0) { acc, n -> acc + n } }
よいです。
swift
func evenSquareSum(n: Int) -> Int { return (1...n) .filter { $0 % 2 == 0 } .map { $0 * $0 } .reduce(0) { $0 + $1 } } let result = evenSquareSum(n: 10) print(result)
クロージャの省略記法いいね。
haskell
evenSquareSum n = sum . map (\n -> n * n) . filter even $ [1..n] {- これでも OK evenSquareSum n = foldl (+) 0 $ map (^2) $ filter even [1..n] -} main = do let result = evenSquareSum 10 print result
やっぱり右からになるのね と思ったら、自分でパイプライン演算子が定義できるみたい via * HaskellでElixirのようなパイプラインで記述したいとき - Qiita * Hakellでパイプライン演算子
(|>) :: a -> (a -> b) -> b (|>) a f = f a -- a |> f = f a evenSquareSum n = [1..n] |> filter even |> map (\n -> n * n) |> foldl (+) 0 main = do let result = evenSquareSum 10 print result
すごい