計算機科学のブログ

関数型プログラミングの基礎 ラムダ関数とレキシカルスコープ 書き換え、記述、平方の和と和の平方、大小

入門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"
%