色々な言語で偶数自乗和 その2

TL;DR

Haskell ならパイプライン演算子を自分で定義できるよ

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

すごい