2017年2月4日土曜日

開発環境

関数プログラミング入門(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 コメント:

コメントを投稿