基礎知識で詰まる

http://www.haskell.org/haskellwiki/99_questions/46_to_50#Problem_46
日本語での理解があやしい。
46, 47は入力値としてA,BがTrueかFalseをとるから、そのときCがTrue | False どっちになるか というのをABC全部可能性列挙しろ、ってことかな。
48はA, B, CがTrue or False
たぶん。ロジックのすごく基本なところなんだろうし、置いて行かれてしまう。問題文でググッてもocamlで解いてみたとかprologだとこうなるとか読めないのしか無いw

IO出てくるとまだよく分かんないから
Bool -> Bool -> Bool -> [(Bool, Bool, Bool)] 満たすようにあとで書こう

Edited: 2012-04-05 14:15
いやこれもちがうな
(Bool, Bool) -> (Bool, Bool) -> (Bool, Bool) -> [(Bool, Bool, Bool)] か? よくわかんね

cable install readline with homebrew

Below is cable install readline with homebrew. And temporally unlink to libiconv. Then I can install lambdabot. Too long!

$ cabal install readline --extra-include-dirs=$(brew --prefix)/include \
--extra-lib-dirs=$(brew --prefix)/lib \
--configure-option=--with-readline-includes=$(brew --prefix)/include \
--configure-option=--with-readline-libraries=$(brew --prefix)/lib

$ brew unlink libiconv
$ cabal install lambdabot
$ brew link libiconv

via:
http://stackoverflow.com/questions/8291137/how-do-you-install-the-haskell-readline-library-on-mac-osx

filter, fst, snd, zip, cycle

filter, fst, snd, zip, cycleがよく理解できてないのでサンプル見て真似した
filter odd [1, 2, 3, 4]
#=> [1, 3]
snd (‘a’, ‘b’)
#=> ‘b’
fst (‘a’, ‘b’)
#=> ‘a’
cycle [1..3]
#=> [1, 2, 3, 1, 2, 3, 1, …]
zip [1, 2, 3] [“one”, “two” “three”]
#=> [(1, “one”), (2, “two”), (3, “three”)]

Prelude.filter

lazyLines 動かないが切り分けられず

ふつケル読んでてlazyLines 動かそうとしてるが動かない
問題の切り分けがわからない
$ ./server
は実行出来るバイナリじゃないと言われてしまうので、
$ ruby server.rb
で動かす方で考える。

とりあえず動きそうなpatchをあてて、
ふつケルの LazyLines を ruby1.9 で動かす – @yujioramaの日記 http://d.hatena.ne.jp/yujiorama/20110430/1304165258

1.9.2以降で問題になりそうな$LOAD_PATHなやつを追加してみて make all

サーバは立ち上がるんだけど、http://localhost:10081/ にアクセスに行くと500エラーが返ってしまう。

euc-jpのテンプレート読み込もうとしてうまくいってない感じだけど、よくわからない。1.9.3, 1.9.2, 1.8.7で試してみたけどどれもダメ。手持ちのruby環境がまずいのか、webrickなのか、またまた別なところなのかわからない。はげしくyak shavingなので動いたことにして進むしかなさげ。

ふつケル読んでる splitAt

文字列調べて、長かったらsplitAtって書いた。解答例見て書きなおした。

foldLine :: String -> [String]
foldLine line = case splitAt 60 line of
    (s, []) -> [s]
    (s, remain) -> s : foldLine remain

いきなりsplitAtして、後ろが空リストだったら、リストリテラルで1番目を返して、後ろがあれば、1番目の要素+残りに再帰。って賢いなー。自分でsplitAtみたいなの書くときもこういう関数の設計にすればうまくいくのね。

よく言われててふーんって聞き流してたけど、ふつうのhaskellは練習問題のちょうどよさ加減が気持ちいい。できそうでできない、頑張ったらできた、解答例見たらすっきり書いててそれが理解できて、もう一度自分で書いてみたらかけて、良いサイクルである。

ふつケルからのメモ書き 高階関数

square n = n * n
map square [1, 2, 3]
[(square 1), (square 2), (square 3)]

concatMap f xs

concatMap expandTab "ab\tcd\n"
concat $ map expandTab "ab\tcd\n"
concat $ [(expandTab 'a'), (expandTab 'b'), (expandTab '\t'), (expandTab 'c'), (expandTab 'd'), (expandTab '\n')]
concat $ [['a'], ['b'], (replicate tabStop ' '), ['c'], ['d'], ['\n']
concat ['a', 'b', " ", ['c'], ['d'], [\n]]
'ab cd\n'

map :: (a -> b) -> [a] -> [b]
map f [] = []
map f (x:xs) = f x : map f xs

map f (x:xs) = ((f x) : (map f xs))

: リストを生成する演算子
リストに対するパターンマッチでは(x:xs)がリストを先頭要素とそれ以降のリストに分解
関数定義の中で(y:ys) リストysの先頭にyを追加したリストを作成