Skip to content

Instantly share code, notes, and snippets.

@Iruyan-Zak
Created July 15, 2017 08:38
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Iruyan-Zak/095f451a88b98865a1b41d242d447bf7 to your computer and use it in GitHub Desktop.
Save Iruyan-Zak/095f451a88b98865a1b41d242d447bf7 to your computer and use it in GitHub Desktop.
histudy 2017/07 で説明したコード
import Data.List (sum)
-- エントリーポイント
main :: IO ()
main = print . sum . pickOdds $ [1..20]
{-
`sum . pickOdds` について
`.` 演算子は後ろの関数の戻り値を前の関数の第1引数に渡す
(Haskellはデフォルトでカリー化するので、例えば2引数関数に1引数を渡すと1引数関数が帰ってきます)
いま、 `sum :: [Int] -> Int` (実際は `sum :: (Num a, Foldable t) => t a -> a` なのですが、上の例では前に書いたシグネチャでいいです)で
`pickOdds :: [Int] -> [Int]` なので、 `sum` の入力と `pickOdds` の出力をくっつけて、
`(sum . pickOdds) :: [Int] -> Int` となります
`print :: Show a => a -> IO ()` で、 `Int` は `a` に当てはまります
なので、 `(print . sum . pickOdds) :: [Int] -> IO ()` となります
`$` は関数適用を遅らせる演算子です
なので、上の関数を [1,2,3,...,19,20]というリストに適用します
答えは100です
-}
-- よくある階乗関数です
-- 引数が0なら1個目、引数が1なら2個目、それ以外なら3個目の内容が返される
-- 負の値を渡すと無限ループする気がします
fact 0 = 1
fact 1 = 1
fact n = n * fact (n-1)
-- 整数のリストから奇数だけを取り出す関数
pickOdds :: [Int] -> [Int]
pickOdds = filter odd
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment