Let's write β

プログラミング中にできたことか、思ったこととか

Haskell

Project Euler 67をHaskellで

module Main where import Data.List.Split readTriangle :: FilePath -> IO [[Int]] readTriangle fpath = do content <- readFile fpath return $ map (map read . splitOn " ") $ lines content prob67 :: [[Int]] -> Int prob67 = head . prob67' where …

DIMACS CNFパーサーを書いた。

SATソルバーの実装に昨日あたり興味がわきまして、手始めにデータ構造とDIMACS CNFファイルのパーサーを書いて見ました。ファイルから読み込めるようになると今後開発するときのデバッグも用意になりますものね。 module Main where import System.Environme…

Generalized LR法をHaskellで Part3

以前の構文木では、途中のスタックの状態を保存していなかったので、出力される構文木では どのような途中のスタックの経過をたどったのかが不明瞭でした。 そこで、すこし更新して、スタックの途中経過を構文木中に保存するようにしたので、 どのようなルー…

Generalized LR法をHaskellで Part2

前回はXML風に木を出力するという機能をつけていましたが、本命はDOT言語に出力する事です。 そっちのほうが確認しやすいからね。というわけで付けてみました。 以下は変更した部分だけ -- ParseTreeをDOT言語として出力 type IndentLevel = Int --- インデ…

Generalized LR法をHaskellで

自然言語処理のGeneralized LR法をHaskellで書いてみました。 {-# LANGUAGE TemplateHaskell #-} module Main where import Data.List import Control.Monad import Control.Lens import Text.Printf -- 終端記号と非終端記号(行末も終端記号としておく) dat…

ルービックキューブと置換とHaskell

何度かプログラムを書いてるので、自分のためのまとめ記事(自分への記事なのでけっこうはしょっています) ルービックキューブの各セルの面に番号をわりあてる ルービックキューブの表面には全部で 9x6 = 54個のセルの表面が見えています。 この面の事をセル…

置換の合成

複数の置換を合成したりしたい場面がありました。 symm.hs module Symm(Symmetric(Symm),clean) where import Data.List import Data.Monoid data Symmetric a = Symm [(a,a)] deriving (Show,Eq) conc :: Eq a => [(a, a)] -> [(a, a)] -> [(a, a)] conc as…

Haskellでラムダ式をパース

import Text.ParserCombinators.Parsec import Text.ParserCombinators.Parsec.Char import Control.Monad data LambdaExpr = Var Char | Lambda LambdaExpr LambdaExpr | Apply LambdaExpr LambdaExpr deriving (Show) identifier :: GenParser Char st Lam…

Haskellで論理式をパースして遊ぶ

昨日の昼ごろなんとなくパーザを書きたくなり、ちょうど論理式のパーザなんかが短時間で書くには適切なものだろうと思いまして書いてみました。Parsecのハイパワーな機能をつかってしまうことも考えたのですが、どうせならなんとなく自分で構造をくみ上げて…

すごいH本をかったよ!

かなり流行の波にのりおくれましたが、本日、急におもいたち すごいH本こと『すごいHaskellたのしく学ぼう!』を無事購入いたしました。