プログラミングHaskell 10章 (練習問題10-4)

練習問題10-4

バランスのとれた木をつくる。

data Tree = Leaf Int | Node Tree Tree deriving Show

balance :: [Int] -> Tree
balance [x] = Leaf x
balance xs = Node (balance ys) (balance zs)
    where (ys,zs) = splitlr xs
              where splitlr ls = splitAt (length ls `div` 2) ls

いちいちリストの長さを数えるのはあほらしいということで、長さを数えずにリスト分割する別解

要するにsplitを工夫すればいいのね。

ということでマージソートまわりを漁ってみた。

split :: [a] -> ([a],[a])
split []       = ([],[])
split [x]      = ([x],[])
split (x:y:zs) = (x:xs,y:ys)
  where 
    (xs,ys) = split zs

ってのが直感的に分かりやすいかな。

ProductName プログラミングHaskell
Graham Hutton
オーム社 / ¥ 2,940 ()
在庫あり。

という感じで、静岡Haskell読書会をやっています。

Real World Haskell 7章

入出力

環境変数をmapM_を使って出力してみた。

import System.Environment
main = do env <- getEnvironment 
          mapM_ (putStrLn . show) env

ProductName Real World Haskell―実戦で学ぶ関数型言語プログラミング
Bryan O'Sullivan,John Goerzen,Don Stewart
オライリージャパン / ¥ 3,990 ()
在庫あり。

今日の畑(100930)

最近雨ばかりで、今日も雨の予報だったのだけど、朝起きたら降ってなかったのでこのタイミングを逃すまじと。

今時は5時だとまだ暗くて、5時半にならないと日が出てこない。夜は日が落ちちゃうし、畑仕事をする時間がなくて困る。

甘長美人と茄子のレーン。両方共ほとんど終わりかけてる。

1285843646

ミョウガは、ボコボコ取れて楽しい上に、オクラみたいにすぐ成長するわけでないので、多少放っておいても収穫時期を逃すことがないのが嬉しい。

1285843640

浅葱も順調に大きくなってきて、収穫タイミングをはかっている。

1285843652

今日の収穫。ミョウガ、茄子、甘長美人

1285843658

空いてる区画が結構多くて、雑草も生えてきてるので手入れしつつ葉物でも蒔くといいんだけど、去年撒いたらアブラムシの猛攻にあったので躊躇している。

あと、来年はソラマメとジャガイモ(春)を植えたいんだけど、それらを逆算して葉物をシーケンシャルにつなげられるかとか週末に計画を立てる。

Real World Haskell 4章 練習問題4-5

takeWhileの実装

まずは再帰で

mytakeWhile :: (a  -> Bool) -> [a] -> [a]
mytakeWhile f [] = []
mytakeWhile f (x:xs) = case f x of
                       True   -> x : mytakeWhile f xs
                       False  -> [] 

続いてfoldrを使って

mytakeWhile' :: (a  -> Bool) -> [a] -> [a]
mytakeWhile' f xs = foldr step [] xs
    where step x ys | f x    = x : ys
                    | otherwise = []


-- *Main> mytakeWhile' (<3) [1,2,3,4,5,4,3,2,1]
-- [1,2]

最初書いてたときにコレって

1:2:3:[]:[]:3:2:1:[]

ってなるよなとか思ったんだけどfoldrの定義見て

-- foldr            :: (a -> b -> b) -> b -> [a] -> b
-- -- foldr _ z []     =  z
-- -- foldr f z (x:xs) =  f x (foldr f z xs)

再帰になってるから[]が返った時点で終了すんのねと。

ProductName Real World Haskell―実戦で学ぶ関数型言語プログラミング
Bryan O'Sullivan,John Goerzen,Don Stewart
オライリージャパン / ¥ 3,990 ()
在庫あり。

Real World Haskell 4章 練習問題4-4

concat実装

myconcat :: [[a]] -> [a]
myconcat = foldr (++) []

ProductName Real World Haskell―実戦で学ぶ関数型言語プログラミング
Bryan O'Sullivan,John Goerzen,Don Stewart
オライリージャパン / ¥ 3,990 ()
在庫あり。

「農はショーバイ!」を読んだ

出てすぐ買って読んだのだけど、記録を付けるのを忘れていた。

ProductName 農はショーバイ!
松木 一浩
アールズ出版 / ¥ 1,365 ()
在庫あり。

付加価値というものはつけるものではなくて理念についてくるものなんだよなぁと再認識した。僕自身はビジョンとかそういうものを非常に大事にしていて、あと創薬もアートと捉えていて(略)

農人日記を読んで、ピンときたら手にとってみるとよいでしょう。確実に得るものはあると思う。

Real World Haskell 4章 練習問題

4章の練習問題

ProductName Real World Haskell―実戦で学ぶ関数型言語プログラミング
Bryan O'Sullivan,John Goerzen,Don Stewart
オライリージャパン / ¥ 3,990 ()
在庫あり。

1

import Data.Char (digitToInt)

asInt_fold :: String -> Int
asInt_fold cs@(c:cs') | c == '-'  = negate $ foldl step 0 $ map digitToInt cs'
                      | otherwise = foldl step 0 $ map digitToInt cs
                      where step x y = 10*x + y


-- *Main> asInt_fold "101"
-- 101
-- *Main> asInt_fold "-31337"
-- -31337
-- *Main> asInt_fold "1798"
-- 1798

2

-- 2
import Data.Char (digitToInt)

asInt_fold :: String -> Int
asInt_fold [] = 0
asInt_fold "-" = 0
asInt_fold cs@(c:cs') | c == '-'  = negate $ foldl step 0 $ map digitToInt cs'
                      | otherwise = foldl step 0 $ map digitToInt cs
                      where step x y = 10*x + y

-- *Main> asInt_fold ""
-- 0
-- *Main> asInt_fold "-"
-- 0
-- *Main> asInt_fold "-3"
-- -3
-- *Main> asInt_fold "2.7"
-- *** Exception: Char.digitToInt: not a digit '.'
-- *Main> asInt_fold "314159265358979323846"
-- 1537529798

3

なんか汚い。

import Data.Char (digitToInt,isDigit)
type ErrorMessage = String

asInt_fold :: String -> Either ErrorMessage Int
asInt_fold [] = Right 0
asInt_fold "-" = Right 0
asInt_fold cs@(c:cs') | c == '-'  = case foldl step (Right 0) cs' of
                                      Right x  -> Right  (negate x)
                                      Left x   -> Left x 
                      | otherwise = foldl step (Right 0) cs
                      where step (Left x) _ = Left x
                            step (Right x) y = case isDigit y of
                                                 True  -> Right (10*x + (digitToInt y))
                                                 False -> Left ("non-digit '" ++ [y] ++ "'")

Real World Haskell 4章 (foldrを使ってfoldlを定義する)

RWHの4章にfoldlをfoldrによって書く例が載っていたのだけど、ぱっと見ただけではわからなかったので良く考えてみた。

ProductName Real World Haskell―実戦で学ぶ関数型言語プログラミング
Bryan O'Sullivan,John Goerzen,Don Stewart
オライリージャパン / ¥ 3,990 ()
在庫あり。

myFoldl :: (a -> b -> a) -> a -> [b] -> a

myFoldl f z xs = foldr step id xs z
    where step x g a = g (f a x)

これは結局

foldr step id xs

によって出来た関数に本来の初期値であるzを与えていると。

例えば

myFoldl (+) 0 [1..3]

だと

foldr (+) id [1..3]

により

\x -> (+3) $ (+2) $ (+1) (id x)

が出来てこれに元の初期値0が与えられて(3+(2+(1+0)))となる。

参考

「ウェブで学ぶ」を読んだ

きらの里に持って行って読んでた。

基本、与える方も与えられる方もヤル気があるってのが前提の考え方で、オプティミズムが強い気もするのだが、結局子供に与えられるのは教育の機会しかないんだろうなぁと。この本を読んでそう思った。

ProductName ウェブで学ぶ ――オープンエデュケーションと知の革命 (ちくま新書)
梅田望夫,飯吉透
筑摩書房 / ¥ 861 ()
在庫あり。

僕自身はネットがあることによる教育の利点を享受しているので、内容は賛同するところが多いのだけど、実際には研究者なのに学習しなくても淘汰されないという例を嫌になるほどみているので、まぁそれは労働システムに原因があるにしても、それはなくなる世界がくるのかなぁ?とも思ってしまう。

というか、そういうよどみではなくもっと上のほうの話をしているのかも知れないけど。でも、「レストオブアス(だっけ?)」に触れていたので、世代間格差は避けられないような気がするなぁと思った。

グローバルに職を求めて競争する準備のために教育がある

ってのは名言だと思うけど、圧としては下にも上にも働くよなぁ。下のダメな方に対して触れてないのが冒頭のオプティミズム臭を感じるというのにつながってんのかな?

色々考えるきっかけにもなったし、読んでよかった本だった。

きらの里に行ってきた

前回2008年6月なので2年ちょいぶりきらの里に泊まってきた。

あいにくの雨だったが楽しめた。雨のせいでうさぎ小屋からうさぎがあまり出てこなくて娘は残念がってた。ちなみにうさぎは20匹くらいに増えてるらしい。植えてた作物がわかるようになってたというあたりは家庭菜園効果。あとは稲刈りは終わってた。

前回は、風呂付きの部屋に泊まったが、貸切風呂がいくつかあるし、普通の風呂も広いので今回はマッサージチェア付きの広い部屋にしてみた。

1285572950

小さい庭も付いている。

1285572900

ベランダと、そこから撮った外の風景。のどかな雰囲気。

1285572963 1285572924

子供の夕食はエビフライとハンバーグを中心に。そして我々の献立

1285572868 1285572975

八寸。お酒は富士錦

1285572944 1285572956

お造りはマグロとタカベとアオリイカ。枝豆の冷製スープ

1285572861 1285572905

水なすと牛の田楽。海鮮しゃぶしゃぶ(伊勢エビ、イサキ、平貝)は野菜が美味しかった。

1285572855 1285572893

かき揚げとご飯物の代わりに黒米うどん

1285572938 1285572994

デザートはほとんど娘に取られるという予定調和

1285572932

部屋に戻ってぐだぐだした。自販機で買ったワンカップ。ビールの気分じゃないので買ってみたがワンカップなんて何年ぶりだろうか?

1285572875

22時からラーメン屋台が出るので、ワンカップをちびちびやりつつ、ちょうどやってたRookiesを見ながら娘と粘る。妻と息子は早々に就寝。Rookiesは漫画のほうが面白かったな。

1285572969 1285572881

粘った甲斐があって、無事にラーメンゲット。前回は寝てしまい食べられなかったのでリベンジを果たした。雨が降っていたので建物の中で頂いたが、外で食べるとそれはまた楽しいんだろう。

朝はもちろんお風呂に入って、朝食。リスも木の実を食べに来ていてた。

1285572887 1285572918

来年もまた行きたいと言っていたので、また行くような気がする。

1285572982 1285572912