開発環境
- macOS Sierra - Apple (OS)
- Emacs (Text Editor)
- Haskell (プログラミング言語)
- Haskell Platform(ghci)(処理系)
関数プログラミング入門(Richard Bird (著)、山下伸夫 (翻訳)、オーム社)の第1章(基本概念)、1.4(関数)、練習問題1.4.1、1.4.2、1.4.3、1.4.4、1.4.5、1.4.6、1.4.7を取り組んでみる。
練習問題1.4.1、1.4.2、1.4.3、1.4.4、1.4.5、1.4.6、1.4.7
コード(Emacs)
-- 1.4.1 f :: Integer -> Integer f x = x + 1 g :: Integer -> (Integer -> Integer) g x y = x + y h :: Integer -> (Integer -> Integer) h x = f . (g x) -- 1.4.2 square :: Double -> Double square x = x * x delta :: Double -> (Double -> (Double -> (Double))) delta a b c = sqrt (square b - 4 * a * c) -- 1.4.3 -- log :: Double -> Double -> Double -- 1.4.4 -- integral :: Double -> Double -> (Double -> Double) -- 1.4.5 f1 :: (Integer -> Integer) -> Integer f1 g = g 10 f2 :: (Integer -> Integer) -> (Integer -> Integer) f2 g = (10+) . g -- 1.4.6 -- (*) x y = x * y -- (*x) y = y * x -- * は可換(Integer, Double)だから計算結果は同じになる f3 x = (*) x f4 x = (*x) -- (+) x y = x + y -- (x+) y = x + y f5 x = (+) x f6 x = (x+) -- (-) x y = x - y -- (-x) = - x f7 x = (-) x f8 x = (-x) -- 1.4.7 curry :: ((a, b) -> c) -> (a -> b -> c) curry f x y = f (x, y) uncurry :: (a -> b -> c) -> ((a, b) -> c) uncurry f (x, y) = f x y
入出力結果(Terminal, ghci)
$ ghci sample1.hs GHCi, version 8.0.2: http://www.haskell.org/ghc/ :? for help [1 of 1] Compiling Main ( sample1.hs, interpreted ) Ok, modules loaded: Main. *Main> f 1 2 *Main> g 1 2 3 *Main> (h 1) 2 4 *Main> f1 (1+) 11 *Main> f2 (1+) 20 31 *Main> f3 1 2 2 *Main> f4 1 2 2 *Main> f5 1 2 3 *Main> f6 1 2 3 *Main> f7 1 2 -1 *Main> f8 10 -10 *Main> (curry (uncurry (+))) 1 2 <interactive>:1:2: error: Ambiguous occurrence ‘curry’ It could refer to either ‘Prelude.curry’, imported from ‘Prelude’ at sample1.hs:1:1 (and originally defined in ‘Data.Tuple’) or ‘Main.curry’, defined at sample1.hs:50:1 <interactive>:1:9: error: Ambiguous occurrence ‘uncurry’ It could refer to either ‘Prelude.uncurry’, imported from ‘Prelude’ at sample1.hs:1:1 (and originally defined in ‘Data.Tuple’) or ‘Main.uncurry’, defined at sample1.hs:53:1 *Main> (Main.curry (Main.uncurry (+))) 1 2 3 *Main> (+) 1 2 3 *Main> let f9 (x, y) = x + y *Main> (Main.uncurry (Main.curry f9)) (1, 2) 3 *Main> f9 (1, 2) 3 *Main> :q Leaving GHCi. $
0 コメント:
コメントを投稿