クラなんとか or くらなんとか or cla なんとかの日記

2010-02-21

Real World Haskell 読書会にいってきた

  • which is rarely useful って何だよ.
    • Main は簡単
    • ロードして,instance 宣言とかのファイルとか(エクスポートしないで副作用だけ)
    • 他?
  • 提案
    • 英語勉強会とか
  • どえりゃあ は,注文を取りにこない
  • ムーディーな照明は要らない
  • 南西の奥の席は,電源の口が4つ使えるので,有利

ネット経由して,Google ドキュメントを更新しながらやりとりする形式です.

辞書とか,副読本とかあると吉.

参考

http://www.amazon.co.jp/exec/obidos/ASIN/4873114233/search042-22/ref=nosim/

Real World Haskell―実戦で学ぶ関数型言語プログラミング

2009-12-11

Cabal で作ってみよう

基本(Cabal パッケージのインストール)

$ runhaskell Setup.hs configure --user
$ runhaskell Setup.hs build
$ runhaskell Setup.hs install
$ ghc-pkg list

準備

  • GHC とか
    • Cabal - パッケージングシステム
    • QuickCheck, HUnit - テストフレームワーク
    • Haddock - ドキュメント整形(haddock ターゲットで作れる)

ドキュメント(haddock)

(略)

テスト

  • 本物のプログラマはHaskellを使う の 第16回 Haskellでのテストの自動化を考える を読めばいいんじゃないか?
  • ということで,下のSetup.hs は,そのまま連載のものをコピーした

(略)

ということで作ってみる

$ cat <<EOL > aaa.cabal
name:    Hoge
version: 0.0

executable hoge
  main-is:  Hoge.hs
  build-depentds: base

executable Test
  main-is:  Test.hs
  build-depends: base, directory, QuickCheck, HUnit
EOL
$ cat <<EOL > Hoge.hs
main = print hello

hello = "Hello"
EOL
$ cat <<EOL > Setup.hs
module Main (main) where

import Distribution.Simple
import Distribution.PackageDescription
import Distribution.Simple.LocalBuildInfo (LocalBuildInfo(..))

import Data.List (isInfixOf)
import System.Directory (getCurrentDirectory)
import System.Cmd (system)
import System.FilePath ((</>), dropExtension)

main :: IO ()
main = do
  defaultMainWithHooks $ simpleUserHooks {runTests = doTest}
  where doTest _ _ pkgDisc bInfo = do
          curr <- getCurrentDirectory
          let dir = buildDir bInfo
              -- data: を取り出す
              testData = dataFiles pkgDisc
              -- 名前に "Test" がつくもののみ
              filterName = filter (("Test" `isInfixOf`) . exeName)
              -- buildable: が False でないもののみ
              filterBuildable = filter (buildable . buildInfo)
              filterTest = filterName . filterBuildable
              -- executable: の実行可能ファイルの完全パス名を作成
              path exec = curr </> dir
                          </> (dropExtension . exeName) exec
                          </> (dropExtension . exeName) exec
          mapM_ (system . path) $ filterTest $ executables pkgDisc
EOL
$ cat <<EOL > Test.hs
import Test.QuickCheck
import Text.Printf

main = mapM_ (\(s,a) -> printf "%-25s: " s >> a) tests

prop_id s = id (s::Int) == s

tests  = [("id",        test prop_id)]
EOL
$ runhaskell Setup.hs configure --user
$ runhaskell Setup.hs build
$ runhaskell Setup.hs test

これだと,test とbuild の依存関係が表現できないなぁ.

とあいえ,configure -> setup-config みたいな依存関係ってないのかも.

clean が動いてないような気もするなぁ.

mkcabal を使えよ.みたいな話しはあるけど,以下のようにもあるから許してね.と

The new tool mkcabal automates all this for you,

but you should understand all the parts even so.

2 Structure of a simple project

cabal-install 使えよ的な話もあるけど,それはそれで.

参考

href を入れてみた

昔入れたけど今のシステムには入っていなかったので入れてみた

$ make
$ make prefix=$HOME/modules/href-0.3.3
$ env HREF_DATADIR=$HOME/modules/href-0.3.3/data ./mkhref ref/*
$ vi ~/modules/href-0.3.3/bin/wrapper.sh
$ cat -n !$
     1  #!/bin/sh
     2  
     3  root=$HOME/modules/href-0.3.3
     4  HREF_DATADIR=$root/data 
     5  export HREF_DATADIR
     6  
     7  basename=/usr/bin/basename
     8  lv=/opt/local/bin/lv
     9  
    10  exec $root/bin/`$basename $0` ${1+"$@"} | lv | cat
$ vi ~/modules/href-0.3.3/bin/href_datadir
$ cat -n !$
     1  #!/bin/sh
     2  
     3  echo $HREF_DATADIR
$ cd ~/local
$ vi .setup/href-0.3.3.sh
$ cat -n !$
     1  #!/bin/sh
     2  
     3  root=$HOME/modules/href-0.3.3
     4  ( cd bin && ( for f in `ls $root/bin/* | egrep -v wrapper.sh`; do rm `basename $f`; ln -s $root/bin/wrapper.sh `basename $f`; done ) )
s $root/bin/wrapper.sh `basename $f`; done ) )
$ sh .setup/href-0.3.3.sh
$ rehash
$ cat <<EOL >> .zshrc
# href の補完
compctl -K _href href
functions _href () {
  local href_datadir=`href_datadir`
  reply=(`cat $href_datadir/comptable|awk -F, '{print $2}'|sort|uniq`)
}
EOL

datadir を href から取れるようにしないとなー.まいーや.

参考

2009-11-20

Haskell night にいってきた

  • 会場がおっされー (TOKYO CULTURE CULTURE)
  • Monad は,象
    • というか,禅問答としか思えない
  • 意外に会場でもHaskell を書いていない件
    • むしろ発表者しか書いてないくらいの勢い
  • 自然言語は,関数型言語 => PTQ - http://www.slideshare.net/sakai/ptqhaskell
    • 品詞 => 型,動詞 => メソッド
  • GHCi があれば他には何も要らない
  • 仕事募集中の人とバイト募集中の人の順番とか
  • スペシャルカクテル lambda と Lazy のお味や如何に!?
  • GHC のお話を聞く(6.12系)
  • RWH は,船頭多くして船山に登るとか?
    • つまみ読みでいい
  • プログラミングHaskell は薄くていいよね
    • 前から順に読めばいい
  • Haskell でプレゼンツール
    • #hogehoge 言うの遅過ぎるというのが共通認識
  • Hackage / Cabal 重要
  • thread 実装が,select なので 1024 MAX
  • 無事帰れた

その後

追記

参考

2009-11-12

cabal-install をインストールしようとしていみた

Agda をインストールしようとしてみた.

それにはcabal が必要らしい.

sudo port hs-cabal だと 10.6.X だとghc をインストールしようともしないので,

ソースから.Cabal は cabal-install に必要らしいので.cabal-installを入れてみる.

cabal-install

$ tar zxf cabal-install-0.6.2.tar.gz
$ cd cabal-install-0.6.2
$ ./bootstrap.sh
$ echo 'export PATH=${PATH}:$HOME/.cabal/bin' >> ~/.zshrc
$ cabal --version
cabal-install version 0.6.2
using version 1.6.0.3 of the Cabal library
$ cabal update
Downloading the latest package list from hackage.haskell.org
cabal: user error (Codec.Compression.Zlib: incompatible version)

ふーむ.zlib でおこられました.

道は遠い.

参考

2009-11-08

MacOSX に GHC をインストールした

今んとこ MacPorts だと入らないみたい.

  • パッケージでインストール
  • alias ghc='command ghc -opta -m32 -optl -m32'

参考

追記 : 2009/11/14 18:48

alias では,Cabal 関連でうまくいかなかったので,

スクリプトを書き換える方針にした.

当然,$HOME/local/bin の方が /usr/bin よりPATH で前になっている.

$ cd ~/modules/ghc-6.10.4/bin
$ cp /Library/Frameworks/GHC.framework/Versions/Current/usr/bin/{ghc,runhaskell} .
$ ln -s runghc runhaskell
$ vi ghc runghc
$ diff /Library/Frameworks/GHC.framework/Versions/Current/usr/bin/ghc ~/modules/ghc-6.10.4/bin/ghc
3c3
< exec /Library/Frameworks/GHC.framework/Versions/610/usr/lib/ghc-6.10.4/ghc -B/Library/Frameworks/GHC.framework/Versions/610/usr/lib/ghc-6.10.4/. -dynload wrapped ${1+"$@"}
---
> exec /Library/Frameworks/GHC.framework/Versions/610/usr/lib/ghc-6.10.4/ghc -optc-m32 -opta-m32 -optl-m32 -B/Library/Frameworks/GHC.framework/Versions/610/usr/lib/ghc-6.10.4/. -dynload wrapped ${1+"$@"}
$ cd ~/local/bin
$ ln -s ~/modules/ghc-6.10.4/bin/{ghc,runghc,runhaskell} .

参考