パーソナルツール
現在位置: ホーム 日々のメモ書き Topics Haskell

Haskell

2010年03月15日

I have been added pkg-haskell team

by TANIGUCHI Takaki — last modified 2010年03月15日 22時56分
Filed Under:

いや、まったく。

Haskellのパッケージの作業をしていたらpkg-haskell teamに勧誘されて加入した。自分たいな適当なのが加入してよかったのだろうか。と、ぼちぼちほったらかしのパッケージのアップロード作業を地味にし続けることにする。

haskell-tagsoupとhaskell-hxtをupload。

 

2009年04月16日

hskkservでTokyo Cabinetを使う

by TANIGUCHI Takaki — last modified 2009年04月16日 00時15分
Filed Under:

辞書にTokyo Cabinetを使う。

やっつけ実装がplain辞書を毎度毎度HashTableにするすごい処理だった。ま、これは駄目なのはわかっていた。tokyocabinet-haskellを導入したのでplain辞書をTokyo CabinetのHash DBに変換するツールをまず書く。そのあとhskkserv本体でTokyo Cabinetを使うように変更。インターフェイスは似ているので辞書を引く部分を若干変更して終了。

tokyocabinet-haskellのdeb化

by TANIGUCHI Takaki — last modified 2009年04月16日 00時15分
Filed Under:

tokyocabinet-haskellをdebにした。

ちょうどtokyocabinet-1.4.14が入ったのでtokyocabinet-haskellのdebianizeができるようになった。

cdbsを使うと非常に楽。rulesは2行だけ書けばよかった。controlにlibghc6-tokyocabinet-devなどをずらずら書いていくだけ。あとは適当。でdebuildとやったら途中で止まる。

dh_haskell_shlibdepsがまずい。ディレクトリ名からライブラリ名を調べているのだが、ライブラリ名にハイフンが含まれていると誤認識する(foo-bar-0.1 => fooとなってしまう)。#524143 というレポートになった。手元で修正してきちんと動くようになった。

DAMももうすぐ通過するだろうからそのときまでに今のやっつけからまともなパッケージに改善しておこう。

2009年04月14日

HaskellでTokyo Cabinet

by TANIGUCHI Takaki — last modified 2009年04月14日 00時10分
Filed Under:

HaskellでTokyo Cabinetを使おうとした。

Tokyo CabinetのHaskell bindingはあった。だけど、DebianのTokyo Cabinetが古いのでコンパイルができない(最新は1.4.x・Debianは1.2.x)。これをなんとかしないと先に進まない。先が長いな。

2009年04月04日

Haskell SKK ServerがEmacsで動かない

by TANIGUCHI Takaki — last modified 2009年04月04日 13時21分
Filed Under:

自作のHaskell SKK ServerがEmacsで動かない。

uim-skkだと動いたのだが、Emacs-SKKだと駄目。変換されずにそのまま固まる。なんだろう…。他のskkservの挙動を見ても変なことしてないのになあと。パケットキャプチャをしてみたら…あれ?Emacs-SKKがLFを最後に送ってない。どーなってんだろう。これが原因か?

IO.getLineを使うと改行されるまで待つのがまずいらしい。IO.getCharで一文字ずつ読んでスペースが来たら一区切りで返すという処理を書いたら、Emacsでも動くようになった。dbskkd-cdbの附属の文書にはLFで終わるって書いてあったけど…。SKK serverの正しいプロトコルって何だろう…。

2009年04月02日

Haskell SKK Server

by TANIGUCHI Takaki — last modified 2009年04月02日 00時13分
Filed Under:

Haskellでなんか実用的なものを作るぞ。

Haskellで実用的なものをつくりたい、ということでSKKサーバを作ってみた。プロトコルは簡単なのでちょこちょこっと応答部分を作って辞書はSKK-JISYO.LをHashTableで格納して。50行ぐらいで書けた。大体動くようになったので入れ替えてテストしてみるか。

ただ、起動するたびにHashTableを再生成では大変なのでそこはなんかDBを使うようにしなればならない。それは別のお話。

2009年03月06日

オセロのプログラムを書いたときのメモ

by TANIGUCHI Takaki — last modified 2009年03月06日 00時11分
Filed Under:

オセロのプログラムをHaskellで作成。こんな修正したよというメモ。

なかなか作法がわからないからね。

if を使わずガードで表記

-      rowCheck x y cb = 
-          if x < 0 then
-              True
-          else
+      rowCheck x y cb
+          | x == -1 = True
+          | otherwise =

こっちのほうがきれいにかけますね。

List関係いろいろ

リファレンスをながめていて色々できることに気がついた。
-        if and [getPiece x y ob == Empty, length revPos > 0] then
+        if and [getPiece x y ob == Empty, not $ null revPos ] then
単純な話だけどライブラリは使おう。
-    foldl (++) ""  [ob2Line (7-y) ob | y <- [0..7]]
-              ++ "/01234567\n"
+    concat  ([ob2Line (7-y) ob | y <- [0..7]] ++ ["/01234567\n"])
foldlでやっているのが変だった。
+      doReverse piece ob pos = 
+ foldl (\ob p -> (putOnPiece (fst p) (snd p) piece ob)) ob pos
- doReverse piece ob [] = ob
- doReverse piece ob (p:pos) =
- doReverse piece (putOnPiece (fst p) (snd p) piece ob) pos
自分で再帰で書いていたのを工夫したらfoldlでできるようになった。
-    concatMap (\y -> ob2Line (7-y) ob) [0..7] ++ "/01234567\n"
+ concatMap (ob2Line ob) (reverse [0..7]) ++ "/01234567\n"
これもライブラリを使ったほうが自然ですよと。
-    initBoard = 
- Map.fromList [( (p2int 3 4), White), ((p2int 4 4), Black),
- ((p2int 3 3), Black), ((p2int 4 3), White)
- ]
-
+ initBoard =
+ let ob = Map.empty in
+ foldl (\ob p -> putOnPiece (fst (fst p)) (snd (fst p)) (snd p) ob)
+ ob [((3,4), White), ((4,4), Black),
+ ((3,3), Black), ((4,3), White)]
これはちょっと迷うところではあるけれど。

do記法の意味がちょっとわかった

         catch (readIO line :: IO (Int,Int)) 
-                    (\e -> return (e::SomeException) >>
-                           putStr "Input again!: " >>
-                           hFlush stdout >>
-                           readPos)
+                    (\e -> do
+                       return (e::SomeException)
+                       putStr "Input again!: "
+                       hFlush stdout
+                       readPos)
syntax sugar という話。>> がずらずら並ぶときには do を使えば消える

2009年03月03日

readIOで例外処理

by TANIGUCHI Takaki — last modified 2009年03月03日 22時41分
Filed Under:

パースに失敗してプログラムが落ちるでは意味がないので。

最初はreadを使っていたがreadIOに変更してごにょごにょと次のように。

import IO hiding (catch)
import Control.Exception
import Prelude hiding (catch)
-- ......
readPos :: IO (Int, Int)
readPos  = do
  line <- getLine
  catch (readIO line :: IO (Int,Int))
            (\e -> return (e::SomeException) >>
                   putStr "Input again!: " >>
                   hFlush stdout>>
                   readPos)

てな具合で。だんだんなんでもかんても再帰で処理する脳になってきた。よしよし。


2009年02月23日

IOの処理の中のifのインデント

by TANIGUCHI Takaki — last modified 2009年02月23日 23時29分
Filed Under:

Emacsに騙されたというか。難しいな。

よくある話のようですが。

do ...
if cond
then do xxx
else do yyy

これは良い例で次が駄目な例。

do ...
if cond
then do xxx
else do yyy

haskell-modeにまかせていたらこういうindentしかしてくれない。haskell-modeの挙動には納得しかねる部分が他にもある。

2009年02月19日

Haskellで8-Queen

by TANIGUCHI Takaki — last modified 2009年02月19日 22時08分
Filed Under:

Haskellの練習ということでやってみた。

8-Queenなんぞやったの大学1年のとき課題でCで書いて以来のような記憶があるけれど…。

置けなかった状態をNothingで返すんだとか変なことを考えていたらわけがわからなくなってきたので内包記法使って素直に実装。なんとなく納得できん。92通り出てきたのでとりあえず安心。もうちょっとごちゃごちゃ変な書き方をしてみたかったが。

最初はチェス盤をIntMapで表現するとかやっていたがQueenの位置だけを配列に覚えされるというやり方で数行で。きれいではあるが面白くはない。それだけHaskellが強力という話かもしれない。

Pythonで同じアルゴリズムでやってみた。もちろんきちんと動いたがこんな書き方している人はあまりないよなあ。代入とループに対して再帰、ifを使わずパターンマッチング。再帰は一見するとわけわからんからねえ…。

次はオセロを作ってみよう。

takaki's twitter
そろそろ出発。 2010年09月09日 05時08分
起きた。涼しいというか寒い。 2010年09月09日 04時17分
旅行の荷物を詰めたが山に比べて軽い軽い 2010年09月08日 14時00分
日豊本線は時間がかかるからこっちを通ろうとするとどうも無理がある。2泊刻みはさすがにやりたくない。 2010年09月07日 23時11分
帰りはぎりぎりなのはよくない気がするが…。 2010年09月07日 23時10分
Affiliate