計算機科学のブログ

関数型プログラミングの基礎 高階関数 調和級数、リスト、foldl関数、ラムダ、sum関数、zip関数、map関数

入門Haskellプログラミング (Will Kurt(著)、株式会社クイープ(監修、翻訳)、翔泳社)のUNIT1(関数型プログラミングの基礎)、LESSON9(高階関数)、9.6(練習問題)Q9-3の解答を求めてみる。

コード

-- foldl関数版
harmonic :: (Fractional a, Enum a) => a -> a
harmonic n = foldl (\l m -> l + 1 / m) 0 [1 .. n]

-- sum関数版
harmonic1 :: (Enum a, Fractional a) => a -> a
harmonic1 n =
  let nums = cycle [1]
      dens = [1 .. n]
      rats = map (\(n, d) -> n / d) $ zip nums dens
   in sum rats

ns :: [Double]
ns = [1 .. 10]

main :: IO ()
main = do
  print "foldl, lambda"
  mapM_ (print . harmonic) ns
  print "sum, map, zip"
  mapM_ (print . harmonic) ns

入出力結果(Terminal, Zsh)

% runghc sample3.hs
"foldl, lambda"
1.0
1.5
1.8333333333333333
2.083333333333333
2.283333333333333
2.4499999999999997
2.5928571428571425
2.7178571428571425
2.8289682539682537
2.9289682539682538
"sum, map, zip"
1.0
1.5
1.8333333333333333
2.083333333333333
2.283333333333333
2.4499999999999997
2.5928571428571425
2.7178571428571425
2.8289682539682537
2.9289682539682538
%