Haskell

parsec --- 2.4 Adding semantics

ただパーサを書いて何をパースしたか出力するだけでは意味がないので,意味のあるものを返そうというお話.前に作ったparens parens::Parser () parens = do char '(' >> parens >> char ')' parens <|> return () を書き直して,括弧が何重になってるかを数…

Parsec --- 2.3 Predictive parsers

Parsecの選択 は「predictive」だとのこと.predictive,予言的.最初のパーサが入力を一切消費しないときのみ,次のパーサに処理が進むということらしいです. testOr::Parser String testOr = string "(a)" <|> string "(b)" というのを作ってみると *Main…

Parsec --- 2.2 Sequence and choice

パーサをつなげてみようというお話.Parserはモナドだからdo記法でつなげることができます. openClose:: Parser Char openClose = do char '(' char ')' これで () だけをパースするパーサになるわけですか. *Main> parseTest openClose "()" ')' *Main> p…

Parsec --- 2.1 Running a parser

``Parsec, a fast combinator parser''をきちんと読んでみます.関係ないですけど,このドキュメント,誰がどうみてもLaTeX2e組で,PDFはdvipdfmで生成されてますね.閑話休題. 入力したソースは全部p.hsに保存することにして,ghciで実行します. ___ ___ …

本が出ませんね

Haskell本,それも日本人による日本語の本の三冊目以降が出ませんね.Haskellの「尖がった」ところが前面にでるような本が出てくれると勉強になるのですが.とりあえず現在頑張ってParsecのドキュメント読み中. ParsecでRPNからASTを作る なんてくらいのこ…

「ふつける」のexpandPattern,わかんなくなった

「ふつける」でソースは省略されているexpandPatternを,ちょっと前に練習がてら自前で実装したんですが。。。今見るとまるで分からない(-_-;;。だめだめ。parsecは忘れてるわ,そもそも自分が作った中間処理の関数が何をしてるのかが不明.コメントは冗長す…

隣接n項間漸化式

昨日,zipWithAnyなんてものを考えたのは,Perlでも考えた隣接n項間漸化式をHaskellでも考えようとしたためです.例えば,隣接4項間で考えてみます. | a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a0 | a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 (a0) a1 | a2 a3 a4 a5 a6 a7 a8 …

zipを考える

Haskellのzip,zipWith関数はこんな感じで定義することができます. zip :: [a] -> [b] -> [(a,b)] zip [] ys = [] zip xs [] = [] zip (x:xs) (y:ys) = (x,y):zip xs ys zipWith :: (a->a->a) -> [a] -> [a] -> [a] zipWith f [] ys = [] zipWith f xs [] =…

フィボナッチがあまりに遅いのでなんとかします.

昨日のフィボナッチはあまりに遅いのです.辛抱できません.遅い理由は簡単で,同じことを何度も何度もしてるからで,Perlの場合はハッシュのクロージャでキャッシュしてました.けど,Haskellじゃそういうことはきっとできません*1.どうして同じことを繰り…

型に嵌まる

Haskell初心者のお約束(「ふつける」読了程度)なんでしょうが,案の定「型に嵌まり」ました.やりたいことは $> fib 10 55 のように,コマンドラインで引数で番号を与えると,対応するフィボナッチの項を返すというだけです.悩んだ結果は以下の通り. imp…