とりとめのないことを書いております。
by tempurature
カテゴリ
全体
プログラミング
scheme
verilog
未分類
以前の記事
2016年 04月
2016年 03月
2016年 02月
2016年 01月
2015年 12月
2015年 11月
2015年 10月
2015年 09月
2015年 08月
2015年 07月
2015年 06月
2015年 03月
お気に入りブログ
PHPで競技プログラミング
メモ帳
最新のトラックバック
ライフログ
検索
タグ
人気ジャンル
ブログパーツ
最新の記事
情報処理技術者試験 お疲れ様..
at 2016-04-17 18:55
基本情報技術者試験 平成27..
at 2016-04-14 04:48
基本情報技術者試験 平成27..
at 2016-04-13 23:03
苦い薬(ハーブ、サプリメント..
at 2016-04-09 14:03
「おバカ度チェックリスト」を..
at 2016-03-24 09:54
外部リンク
ファン
記事ランキング
ブログジャンル
画像一覧
<   2015年 12月 ( 40 )   > この月の画像一覧
Graham hutton著「プログラミングHaskell」4.8 練習問題を解答
-- ch4.hs

-- 1.

halve :: [a] -> ([a], [a])
halve xs
   | (even (length xs)) = (take i xs, drop i xs)
                          where
                           i = (length xs) `div` 2

-- 2.

safetail :: [a] -> [a]
safetail xs = if null xs then [] else tail xs

safetail' :: [a] -> [a]
safetail' xs
    | null xs = []
    | otherwise = tail xs

safetail'' :: [a] -> [a]
safetail'' [] = []
safetail'' xs = tail xs

-- 3.

{-
(||) :: Bool -> Bool -> Bool
True || True = True
True || False = True
False || True = True
False || False = False
-}

{-
(||) :: Bool -> Bool -> Bool
False || False = False
_ || _ = True
-}

{-
(||) :: Bool -> Bool -> Bool
False || b = b
True || _ = True
-}

(||) :: Bool -> Bool -> Bool
b || c | b == c = b
       | otherwise = True

-- 4.

{-
(&&) :: Bool -> Bool -> Bool
b && c = if (if b then c else False) then True else False
-}

-- 5.

(&&) :: Bool -> Bool -> Bool
b && c = if b then c else False

-- 6.

mult = \ x -> \ y -> \ z -> x * y * z


[PR]
by tempurature | 2015-12-31 01:21 | プログラミング
Graham hutton著「プログラミングHaskell」3.11 練習問題を解答
-- ch3.hs

-- 1.

-- ['a', 'b', 'c'] の型は [Char]
-- ('a', 'b', 'c') の型は (Char, Char, Char)
-- [(False, 'o'), (True, '1')] の型は [(Bool, Char)]
-- ([False, True], ['0', '1']) の型は ([Bool], [Char])
-- [tail, init, reverse] の型は [[a] -> [a]]

-- 2.

-- second :: [a] -> a
-- swap :: (a, b) -> (b, a)
-- pair :: a -> b -> (a, b)
-- double :: Num a => a -> a
-- palindrome :: Eq a => [a] -> Bool
-- twice :: (a -> a) -> a -> a

-- 3.

{-

-- GHCiで実行

-- 値 : 型 とインタプリタに入力してみる。
*Main> ['a', 'b', 'c'] :: [Char]
"abc"
-- また、わざと間違えてみる。するとエラーになる。
*Main> ['a', 'b', 'c'] :: (Char, Char, Char)

<interactive>:38:1:
    Couldn't match expected type ‘(Char, Char, Char)’
                with actual type ‘[Char]’
    In the expression: ['a', 'b', 'c'] :: (Char, Char, Char)
    In an equation for ‘it’: it = ['a', 'b', 'c'] :: (Char, Char, Char)
*Main> ('a', 'b', 'c') :: (Char, Char, Char)
('a','b','c')
*Main> [(False, 'o'), (True, '1')] :: [(Bool, Char)]
[(False,'o'),(True,'1')]
*Main> ([False, True], ['0', '1']) :: ([Bool], [Char])
([False,True],"01")
*Main> [tail, init, reverse] :: [[a] -> [a]]

<interactive>:42:1:
    No instance for (Show ([a0] -> [a0]))
      (maybe you haven't applied enough arguments to a function?)
      arising from a use of ‘print’
    In a stmt of an interactive GHCi command: print it
-- 関数のリストの場合、関数が表示クラスでないためエラーがでるようだ。
-- そこで、またわざと間違った値と型の組み合わせを入力する。
*Main> [head, init, reverse] :: [[a] -> [a]]

<interactive>:45:2:
    Couldn't match type ‘a1’ with ‘[a1]’
      ‘a1’ is a rigid type variable bound by
           an expression type signature: [[a1] -> [a1]] at <interactive>:45:1
    Expected type: [a1] -> [a1]
      Actual type: [[a1]] -> [a1]
    In the expression: head
    In the expression: [head, init, reverse] :: [[a] -> [a]]
-- 先ほどとは異なるエラーがでる。

-}

-- GHCiで実行

second :: [a] -> a
second xs = head (tail xs)

{- この定義はエラー
second' :: [a] -> b
second' xs = head (tail xs)
-}

swap :: (a, b) -> (b, a)
swap (x, y) = (y, x)

-- この定義はOK
swap' :: (a, a) -> (a, a)
swap' (x, y) = (y, x)

pair :: a -> b -> (a, b)
pair x y = (x, y)

double :: Num a => a -> a
double x = x * 2

{- この定義はエラー
double' :: a -> a
double' x = x * 2
-}

palindrome :: Eq a => [a] -> Bool
palindrome xs = reverse xs == xs

{- この定義はエラー
palindrome' :: [a] -> Bool
palindrome' xs = reverse xs == xs
-}

twice :: (a -> a) -> a -> a
twice f x = f (f x)

{- この定義はエラー
twice' :: (a -> b) -> a -> b
twice' f x = f (f x)
-}

-- 4.

{-
Haskellの組み込み関数がC/C++のライブラリで実現されているため。

実現可能であるのは、
組み込み関数f1, .., fnについて、
それらの関数のうち任意のfiがほかの組み込み関数の組み合わせC(f1..fi-1,fi+1,..,fn)と
恒等関数とならず、また、組み込み関数の組み合わせを正規化できる場合。
-}


[PR]
by tempurature | 2015-12-30 23:55 | プログラミング
Graham hutton著「プログラミングHaskell」2.6 練習問題を解答
-- ch2.hs

-- 1.

-- ( 2 ^ 3 ) * 4
-- ( 2 * 3 ) + ( 4 * 5 )
-- 2 + ( 3 * ( 4 ^ 5 ) )

-- 2.

-- GHCiで実行した

double x = x + x
quadruple x = double (double x)

factorial n = product [1..n]
average ns = sum ns `div` length ns

{-
double x = x + x
quadruple x = double ( double x )
-}

-- 3.

{-
N = a 'div' length xs
    where
     a = 10
    xs = [1,2,3,4,5]
-}

-- Nをnに変更
-- whereの後のxsのインデントをa = 10に合わせる
-- 'div'のシングルクオートをバッククオートに変更

n = a `div` length xs
    where
     a = 10
     xs = [1,2,3,4,5]

-- 4.

last' xs = head ( reverse xs )

last'' xs = xs !! ( ( length xs ) - 1 )

last''' [x] = x
last''' (x:xs) = last''' xs

-- 5.

init' xs = reverse ( tail ( reverse xs ) )

init'' xs = take ( ( length xs ) - 1 ) xs


[PR]
by tempurature | 2015-12-30 22:54 | プログラミング
Graham hutton著「プログラミングHaskell」1.7 練習問題を解答
-- ch1.hs

--1.

double x = 2 * x

--2.

-- 任意のNum型のxについて、
--   sum [x]
-- =     { sumを適用 }
--   x + sum []
-- =     { sumを適用 }
--   x + 0
-- =     { + を適用 }
--   x

-- 3.

product' [] = 1
product' (x:xs) = x * product' xs

--   product' [2,3,4]
-- =     { product'を適用 }
--   2 * product' [3,4]
-- =     { product'を適用 }
--   2 * ( 3 * product' [4] )
-- =     { product'を適用 }
--   2 * ( 3 * ( 4 * product' [] ) )
-- =     { product'を適用 }
--   2 * ( 3 * ( 4 * 1 ) )
-- =     { * を適用 }
--   2 * ( 3 * 4 )
-- =     { * を適用 }
--   2 * 12
-- =     { * を適用 }
--   24

-- 4.

qsort [] = []
qsort (x:xs) = qsort larger ++ [x] ++ qsort smaller
               where
                smaller = [ a | a <- xs, a <= x ]
                larger = [ b | b <- xs, b > x ]

-- リスト連結している部分で、smaller++[x]++largerをlarger++[x]++smallerに
-- 置き換える

-- 5.

-- リストの重複がなくなる。


[PR]
by tempurature | 2015-12-30 22:27 | プログラミング
Cygwinで find . | xargs grep [keyword] したい時は?
find . | xargs grep [keyword]
というコマンドは、カレントディレクトリ以下のすべてのファイル内の[keyword]を検索するときに使います。

ただ、Cygwinでこれを実行すると、grepが以下の様な警告を沢山発生させます。

grep: ./msys/usr/share/vim/vim74/tutor: Is a directory
grep: ./msys/usr/ssl: Is a directory
grep: ./msys/usr/ssl/certs: Is a directory
grep: ./msys/usr/ssl/misc: Is a directory
grep: ./perl: Is a directory


これの対処方法として、findにファイルタイプのオプションを付加します。

find . -type f | grep [keyword]

これでfindがディレクトリパスをgrepに渡すことはなくなるので警告が表示されなくなります。

[PR]
by tempurature | 2015-12-30 19:38 | プログラミング
GHCiでisLower関数、ord関数、chr関数を使うには?
isLower関数、ord関数、chr関数はData.Charモジュールで用意されています。
ソースファイル内で使いたい場合は、ファイルの先頭でData.Charモジュールをimportします。

-- okay.hs : 正しいimport

import Data.Char

let2int :: Char -> Int
let2int c = ord c - ord 'a'

ソースファイルの途中でimportすると失敗します。

-- ng.hs : 間違ったimport

concat' :: [[a]] -> [a]
concat' xss = [ x | xs <- xss, x <- xs ]

import Data.Char

let2int :: Char -> Int
let2int c = ord c - ord 'a'


インタプリタでimportする場合は、import文をそのまま入力します。

*Main> import Data.Char
*Main Data.Char>


[PR]
by tempurature | 2015-12-30 18:09 | プログラミング
Graham Hutton著「プログラミングHaskell」を購入しました
c0364169_17471422.jpg
Haskellは学習するのが難しい言語と言われておりますが、この本ではその常識に挑戦するというスタンスを示しています。Amazonのレビューも好評でした。

「すごいHaskellたのしく学ぼう!」という本はHaskell言語の入門書として有名ですが、その本を1読しただけではHaskellをマスターするのは難しいのだそうです。

対して、こちらの本は全217ページと薄めで読みやすいです。Haskellを学習したい人はこの本を読みましょう。

[PR]
by tempurature | 2015-12-30 17:59 | プログラミング
私が好きな言語・嫌いな言語
なんか思い立ったように書きたくなったので。

○好きな言語

・C

- 簡潔で美しい。特にconstの思想がすばらしい。

・シェルスクリプト(Bシェル系)

- 究極のものぐさ言語。すばらしい。

・Perl

- わかりやすく書こうと思えば書ける。
- 正規表現はPerlで完成した。

・Racket

- 初心者をばかにしない
- 新しい言語で、標準言語の慣習におもねっているところ
- IDEが実装されていて、黒画面やEmacsの陰気さをなくしているところ
(Windowsユーザーにやさしい)
- ただし日本語のソースが少ない。LGPLなところも諸刃の剣。

○嫌いな言語

・C++

- 煩雑

・Python

- 1スペースと1タブが等価値なこと
- endが分かりづらい(Lispもそうですけど)
- インタプリタがしょぼい
- 定数という考えがない

・F#
- ;;(ダブルセミコロン)が醜悪

・OCaml
- 浅井健一氏の本がローマ字なので


[PR]
by tempurature | 2015-12-26 19:02 | プログラミング
メリークリスマス! Dr. Racket!!
12/25。今日のDr. Racketの起動画面はミケランジェロの「アダムの創造」です。
キリスト生誕祭とは微妙にずれているような… なんでもないです。

c0364169_23510586.png

[PR]
by tempurature | 2015-12-25 23:51 | scheme
【Haskell】ペアノ算みたいなのを作ってみました
Lispに疲れたのでHaskellを。ペアノ算が機械的なので、少し人間的に処理してみました。

-- tashizan.hs

hiku :: String -> String -> String
hiku a "0" = a
hiku "1" "1" = "0"
hiku "2" "1" = "1"
hiku "3" "1" = "2"
hiku "4" "1" = "3"
hiku "5" "1" = "4"
hiku "6" "1" = "5"
hiku "7" "1" = "6"
hiku "8" "1" = "7"
hiku "9" "1" = "8"
hiku "10" "1" = "9"
hiku a b = hiku (hiku a "1") (hiku b "1")

tasu :: String -> String -> String
tasu a "0" = a
tasu "1" "1" = "2"
tasu "2" "1" = "3"
tasu "3" "1" = "4"
tasu "4" "1" = "5"
tasu "5" "1" = "6"
tasu "6" "1" = "7"
tasu "7" "1" = "8"
tasu "8" "1" = "9"
tasu "9" "1" = "10"
tasu a b
    | (length a) == 1 && (length b) == 1
    = tasu (tasu a "1") (hiku b "1")
    | (length a) < (length b)
    = tasu b a
    | (last a) == '0'
    = (tasu (uenoketa a) (uenoketa b)) ++ [(last b)]
    | otherwise
    = (tasu ((tasu (uenoketa a) (uenoketa b)) ++ "0")
            (tasu [(last a)] [(last b)]))

uenoketa a = tadashi null "0" $ reverse (tail (reverse a))

tadashi cond replacement =
    (\ x -> ( if (cond x) then replacement else x))


[PR]
by tempurature | 2015-12-25 22:37 | プログラミング