Created
July 15, 2017 08:38
-
-
Save Iruyan-Zak/095f451a88b98865a1b41d242d447bf7 to your computer and use it in GitHub Desktop.
histudy 2017/07 で説明したコード
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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