関数型プログラミングの基礎 ラムダ関数とレキシカルスコープ 書き換え、記述、平方の和と和の平方、大小
入門Haskellプログラミング (Will Kurt(著)、株式会社クイープ(監修、翻訳)、翔泳社)のUNIT1(関数型プログラミングの基礎)、LESSON 3(ラムダ関数とレキシカルスコープ)、3.6(練習問題)Q3-1の解答を求めてみる。
コード
lesson/app/Main.hs
module Main where
-- import Lib ()
sumSquareOrSquareSum :: (Num a, Ord a) => a -> a -> a
sumSquareOrSquareSum x y =
( \sumSquare squareSum ->
if sumSquare > squareSum
then sumSquare
else squareSum
)
(x ^ 2 + y ^ 2)
((x + y) ^ 2)
ns :: [Int]
ns = [-4 .. 5]
main :: IO ()
main = do
mapM_
print
$ ( \x y ->
mconcat
[ "sumSquareOrSquareSum ",
show x,
" ",
show y,
" -> ",
show $ sumSquareOrSquareSum x y
]
)
<$> ns
<*> ns
入出力結果(Terminal, Zsh)
% stack runghc app/Main.hs
"sumSquareOrSquareSum -4 -4 -> 64"
"sumSquareOrSquareSum -4 -3 -> 49"
"sumSquareOrSquareSum -4 -2 -> 36"
"sumSquareOrSquareSum -4 -1 -> 25"
"sumSquareOrSquareSum -4 0 -> 16"
"sumSquareOrSquareSum -4 1 -> 17"
"sumSquareOrSquareSum -4 2 -> 20"
"sumSquareOrSquareSum -4 3 -> 25"
"sumSquareOrSquareSum -4 4 -> 32"
"sumSquareOrSquareSum -4 5 -> 41"
"sumSquareOrSquareSum -3 -4 -> 49"
"sumSquareOrSquareSum -3 -3 -> 36"
"sumSquareOrSquareSum -3 -2 -> 25"
"sumSquareOrSquareSum -3 -1 -> 16"
"sumSquareOrSquareSum -3 0 -> 9"
"sumSquareOrSquareSum -3 1 -> 10"
"sumSquareOrSquareSum -3 2 -> 13"
"sumSquareOrSquareSum -3 3 -> 18"
"sumSquareOrSquareSum -3 4 -> 25"
"sumSquareOrSquareSum -3 5 -> 34"
"sumSquareOrSquareSum -2 -4 -> 36"
"sumSquareOrSquareSum -2 -3 -> 25"
"sumSquareOrSquareSum -2 -2 -> 16"
"sumSquareOrSquareSum -2 -1 -> 9"
"sumSquareOrSquareSum -2 0 -> 4"
"sumSquareOrSquareSum -2 1 -> 5"
"sumSquareOrSquareSum -2 2 -> 8"
"sumSquareOrSquareSum -2 3 -> 13"
"sumSquareOrSquareSum -2 4 -> 20"
"sumSquareOrSquareSum -2 5 -> 29"
"sumSquareOrSquareSum -1 -4 -> 25"
"sumSquareOrSquareSum -1 -3 -> 16"
"sumSquareOrSquareSum -1 -2 -> 9"
"sumSquareOrSquareSum -1 -1 -> 4"
"sumSquareOrSquareSum -1 0 -> 1"
"sumSquareOrSquareSum -1 1 -> 2"
"sumSquareOrSquareSum -1 2 -> 5"
"sumSquareOrSquareSum -1 3 -> 10"
"sumSquareOrSquareSum -1 4 -> 17"
"sumSquareOrSquareSum -1 5 -> 26"
"sumSquareOrSquareSum 0 -4 -> 16"
"sumSquareOrSquareSum 0 -3 -> 9"
"sumSquareOrSquareSum 0 -2 -> 4"
"sumSquareOrSquareSum 0 -1 -> 1"
"sumSquareOrSquareSum 0 0 -> 0"
"sumSquareOrSquareSum 0 1 -> 1"
"sumSquareOrSquareSum 0 2 -> 4"
"sumSquareOrSquareSum 0 3 -> 9"
"sumSquareOrSquareSum 0 4 -> 16"
"sumSquareOrSquareSum 0 5 -> 25"
"sumSquareOrSquareSum 1 -4 -> 17"
"sumSquareOrSquareSum 1 -3 -> 10"
"sumSquareOrSquareSum 1 -2 -> 5"
"sumSquareOrSquareSum 1 -1 -> 2"
"sumSquareOrSquareSum 1 0 -> 1"
"sumSquareOrSquareSum 1 1 -> 4"
"sumSquareOrSquareSum 1 2 -> 9"
"sumSquareOrSquareSum 1 3 -> 16"
"sumSquareOrSquareSum 1 4 -> 25"
"sumSquareOrSquareSum 1 5 -> 36"
"sumSquareOrSquareSum 2 -4 -> 20"
"sumSquareOrSquareSum 2 -3 -> 13"
"sumSquareOrSquareSum 2 -2 -> 8"
"sumSquareOrSquareSum 2 -1 -> 5"
"sumSquareOrSquareSum 2 0 -> 4"
"sumSquareOrSquareSum 2 1 -> 9"
"sumSquareOrSquareSum 2 2 -> 16"
"sumSquareOrSquareSum 2 3 -> 25"
"sumSquareOrSquareSum 2 4 -> 36"
"sumSquareOrSquareSum 2 5 -> 49"
"sumSquareOrSquareSum 3 -4 -> 25"
"sumSquareOrSquareSum 3 -3 -> 18"
"sumSquareOrSquareSum 3 -2 -> 13"
"sumSquareOrSquareSum 3 -1 -> 10"
"sumSquareOrSquareSum 3 0 -> 9"
"sumSquareOrSquareSum 3 1 -> 16"
"sumSquareOrSquareSum 3 2 -> 25"
"sumSquareOrSquareSum 3 3 -> 36"
"sumSquareOrSquareSum 3 4 -> 49"
"sumSquareOrSquareSum 3 5 -> 64"
"sumSquareOrSquareSum 4 -4 -> 32"
"sumSquareOrSquareSum 4 -3 -> 25"
"sumSquareOrSquareSum 4 -2 -> 20"
"sumSquareOrSquareSum 4 -1 -> 17"
"sumSquareOrSquareSum 4 0 -> 16"
"sumSquareOrSquareSum 4 1 -> 25"
"sumSquareOrSquareSum 4 2 -> 36"
"sumSquareOrSquareSum 4 3 -> 49"
"sumSquareOrSquareSum 4 4 -> 64"
"sumSquareOrSquareSum 4 5 -> 81"
"sumSquareOrSquareSum 5 -4 -> 41"
"sumSquareOrSquareSum 5 -3 -> 34"
"sumSquareOrSquareSum 5 -2 -> 29"
"sumSquareOrSquareSum 5 -1 -> 26"
"sumSquareOrSquareSum 5 0 -> 25"
"sumSquareOrSquareSum 5 1 -> 36"
"sumSquareOrSquareSum 5 2 -> 49"
"sumSquareOrSquareSum 5 3 -> 64"
"sumSquareOrSquareSum 5 4 -> 81"
"sumSquareOrSquareSum 5 5 -> 100"
%