[Haskell]フィボナッチベンチ、その頃 Haskell は・・・。

Haskell 2 Comments »

恒例のフィボナッチベンチで V8 と Smalltalk、Ruby、Python、Scheme とを戦わせてみるにHaskellがいないではないか!ってことで、やってみた。(やってからブログ書く暇がなくて、かなり乗り遅れてるけど)

gabu@ubuntu-vm:~/haskell/fib$ time ./fib 39
63245986

real	0m0.019s
user	0m0.000s
sys	0m0.012s

0.019秒きたーーー。

ソースはこちら。

import System

fibonacci = 1:1:zipWith (+) fibonacci (tail fibonacci)

main = do
  args <- getArgs
  print $ fibonacci !! ((read $ head args) - 1)

List の index の関係で マイナス1してるのがださいけど、こんなもんですかねぇ。

フィボナッチ数列の作り方は、フィボナッチ数列 - Haskell はスケるよから頂きました。読んでも意味が分かりません。。。誰か解説プリーズ。

Haskell で日本語(マルチバイト文字)を使う方法

Haskell No Comments »

GHC(Haskell コンパイラ) 単体では日本語(マルチバイト文字)が使えません。単純に出力しようとすると文字化けしちゃいます><
なぜかというと、

http://ja.doukaku.org/comment/2957/ から引用

さらにghcでは文字は内部的にはUCS4で表現されているといってよいのですが,
エンコーディングを変換する機構が標準では提供されていません.
外部から文字列データを読み込み,それを逆転し,外部へ出力するためには
エンコーディングを変換する機構を自前で用意するか,それ用のライブラリ
モジュールを使う必要があります

そこで色んな対処方があるのですが、utf8-string という素敵なパッケージがありますので、これを使います。

環境

  • GHC 6.8.2
  • Ubuntu (UTF8 な OS なら何でも)

utf8-string をインストール

wget http://hackage.haskell.org/packages/archive/utf8-string/0.3.1/utf8-string-0.3.1.tar.gz
tar zxf utf8-string-0.3.1.tar.gz
cd utf8-string-0.3.1/
runhaskell Setup.lhs configure
runhaskell Setup.lhs build
sudo runhaskell Setup.lhs install

ちゃんとインストールできたか確認

ghc-pkg -l | grep utf8
    unix-2.3.0.0, utf8-string-0.3.1, xhtml-3000.0.2.1

utf8-string が表示されればOK!

試してみる

以下のコードを test.hs に保存。

module Main where
import qualified System.IO.UTF8 as U

main = do
  U.putStrLn "あいうえお"

コンパイル

ghc --make test.hs

実行

$ ./test
あいうえお

日本語きたーーー

System.IO.UTF8 が提供する他のメソッドについては以下の通り。他にもさっき落としたソースを読めば使えそうなメソッドがありそうな感じです。Codec.Binary.UTF8.String とか他にもいろんなモジュールがあるっぽい。

module System.IO.UTF8 (
      print
    , putStr
    , putStrLn
    , getLine
    , readLn
    , readFile
    , writeFile
    , appendFile
    , getContents
    , hGetLine
    , hGetContents
    , hPutStr
    , hPutStrLn
  ) where

ちなみに今回みたいに外部パッケージを import したファイルをコンパイルする時には make オプションを付けないとリンクが作れないみたいな以下のようなエラーメッセージが出ます。

$ ghc test.hs
test.o: In function `siz_info':
(.text+0xaa): undefined reference to `utf8zmstringzm0zi3zi1_SystemziIOziUTF8_putStrLn_closure'
test.o: In function `siz_info':
(.text+0x14f): undefined reference to `__stginit_utf8zmstringzm0zi3zi1_SystemziIOziUTF8_'
test.o: In function `siz_closure':
(.data+0x14): undefined reference to `utf8zmstringzm0zi3zi1_SystemziIOziUTF8_putStrLn_closure'
collect2: ld はステータス 1 で終了しました

Ubuntu に darcs と searchpath をインストール

Haskell No Comments »

Haskell製アプリケーションサーバ Happs(http://happs.org/)には以下が必要らしい。

  • ghc 6.8.2
  • darcs (Haskell製 ソースコード管理システム)
  • searchpath 0.9.2 (Automatic import chasing across the Internet for Haskell modules・・・ようわからんけどw)

ghcは既に入れたので、darcs と searchpath を入れる。

環境

Ubuntu 7.10 (Gutsy)

インストール

sudo apt-get install darcs
sudo apt-get install curl  # searchpathのインストールに必要
curl http://searchpath.org/searchpath/SearchPath.hs -o SearchPath.hs
ghc -main-is SearchPath --make SearchPath.hs -o sp

失敗。。。 「/usr/bin/ld: cannot find -lgmp」とか言われる。調べるとどうやら「libgmp3-dev」が必要らしい。

sudo apt-get install libgmp3-dev
ghc -main-is SearchPath --make SearchPath.hs -o sp

成功!

sudo mv sp /usr/local/bin
sp

バージョンとヘルプがずらずら表示されれば、とりあえずOKだと思われ。

蛇足

ちなみにghcでコンパイルした時に 「compilation IS NOT required」とか言われても心配無用。これは、ghc が .oファイルとソースファイルの更新日時を比較して、コンパイルの必要があるかないかを判断しているので、その名の通り「コンパイルは不要」と言っているだけらしい。コンパイルの必要がないのにghcコマンドを叩いている自分が恥ずかしいというわけです。僕です。さらに、ghc は外部のライブラリを使うようなプログラムでも、その参照先の変更をチェックして賢く振舞うらしい。

Ubuntu に GHC(Haskellコンパイラ) インストール

Haskell No Comments »

今までWindowsでGHC使ってたんですが、やっぱり気持ち悪いので開発用のUbuntu on VMWareでやろうと思います。

環境

Ubuntu 7.10 (Gutsy)

前置き

$ sudo apt-get install ghc6

で一発なんですが、これはおススメしません。なぜなら少し古いバージョン「6.6.1」がインストールされるからです。-V を付けるとインストールの前にバージョンを表示させることが出来ます。

 $ sudo apt-get -V install ghc6

コンパイル済のパッケージを手動でインストール

最新のバージョン「6.8.2」を入れるためには、http://www.haskell.org/ghc/download_ghc_682.html#x86linux から
ghc-6.8.2-i386-unknown-linux.tar.bz2」をダウンロードしてきます。

$ tar xvf ghc-6.8.2-i386-unknown-linux.tar.bz2
$ cd ghc-6.8.2
$ sudo apt-get install libreadline5 #必要らしい
$ sudo ./configure

失敗。「libgmp.so.3: cannot open shared object file: No such file or directory」と言われるので「libgmp3」を入れてみる。 すると、「libgmpxx4ldbl」と「libgmp3c2 」と「libgmp3-doc」(docは、いらんけど)に置き換えられたと教えてくれる。apt-get賢いなぁ、いいやつだなぁ。

$ sudo apt-get install libgmpxx4ldbl libgmp3c2
$ sudo ./configure
$ sudo make install #コンパイル済を落としてるので make は飛ばす。
$ ghci

Prelude> putStrLn "Hello world!"

Hello world!

終わり。

Haskell で Web Application を作るには(フレームワークとか)

Haskell No Comments »

前置き

CSNAGOYAのHaskell勉強会に参加しているのですが、前々回の勉強会で代表のお一方であるM氏から「『オープンソースカンファレンス(OSC)2008 Nagoya』(サイトは準備中っぽい)に我々CSNAGOYAも出ませんか!」という提案があり、「いいねいいねぇ」と参加する方向に。

M氏:5分と45分があるけど?

M氏:内容は?

みんな:なにがいいっかなぁー

いろいろ出て。。。

gabuとかいう子:Haskell で twitter 作ろう!

勢い(だけ)すげーーー。 #若干デフォルメ てか、おいらtwitterユーザ登録しただけで全然使ってないのに(w

ってことで調べましたよ。 Haskell で Web Application を作るには(フレームワークとか)。

HAppS

http://happs.org/

A web framework for developers to prototype quickly, deploy painlessly, scale massively, operate reliably, and change easily.

—意訳—

HAppSは、プロトタイプの開発が迅速、デプロイが手軽な、 大規模スケール対応、信頼できる動作、変更を容易にできる、Webフレームワークです。

これだけじゃ特徴が分からんなw けど、Web“アプリケーション”フレームワークというより、アプリケーションサーバのような印象。

WASH

http://www.informatik.uni-freiburg.de/~thiemann/WASH/

WASH is a family of embedded domain specific languages (EDSL) for programming Web applications.

—意訳—

WASHは、WebアプリケーションをプログラミングするためのEDSL群です。

以下のコンポーネントがあるらしい。

  • WASH/CGI for server-side web scripting
  • WASH/HTML for dynamic generation of HTML and XHTML
  • WASH/Mail for email processing
  • WSP, a server supporting Wash Server Pages
  • WASH/DB, a transactional interface to SQL databases
  • DBconnect, a simple interface to PostgreSQL (deprecated)

WSPとWASH/DB・DBconnectがあれば、MVCとして十分いけそうな印象。

Kaya

http://kayalang.org/

個人的に本命です。2008/03/15に最新バージョンがリリースされてるし、古きよきHaskellにしては鮮度が高くて良いですね。あと、「Top 10 most popular Haskell programs」にも入っているのも人気の高さが伺える。WASH, HAppSは入っていない。

けど、Kaya はWebアプリを書くためのHaskellの拡張言語とも呼べる存在っぽい。なぜかというと。

  • kayac というコンパイラでコンパイルする。
  • おかげでHaskellでは存在しない、for文は使えるわ、return文は使えるわ。
  • その代わり便利(そう)なモジュールが大量にありそう。

KayaでWebアプリ作って、「うは!HaskellでTwitter作ったよ!」と言っていいのか。うーむ。けどまあKayaから試してみるかー。

「ふつうのHaskellプログラミング」読書会@CSNagoyaに行ってきた

Haskell, 雑記 2 Comments »

toyoshi さんに誘われて「ふつうのHaskellプログラミング」読書会@CSNagoyaに行ってきました。

感想を書くまでが勉強会!(読書会)と、どこかで読んだので書いておこう。

雰囲気

参加人数は自分を入れて7名。テキスト「ふつうのHaskellプログラミング」を第2章から1節ずつ1人が読み、サンプルのコードを実際に打ち込んで、実行。素朴な疑問などを話し合いつつ、解決しつつ、次の節へ 。という感じで読書会は進んでいき、第3章の最後まで終えることが出来ました。

21時頃には終えて懇親会へ。PerlでSNS作っちゃう不動産屋さん、OCaml でお仕事をされている方、自分と同じように業務系(?)の方、Web屋さん、などなど多種多様で面白かったです。

学んだこと

  • main アクションから実行される。Haskell は大文字小文字を区別するため小文字の main であること。
  • do 式で束ねる複数の(アクション)はインデントを揃える。この規則を「レイアウト」とか「オフサイドルール」と言う。これが噂のオフサイドルールかぁ。
  • do 式を使うと上から順にアクションが実行される。
  • リスト重要。文字列は文字のリスト。[] 空リスト。
  • 「$」演算子。括弧に展開できる。これは結構好きかも。
  • 型推論は個人的にコンパイラすげー。と思った。
  • 関数定義は、「関数名 :: 第1引数 -> 第2引数 -> ・・・ -> 返り値の型」 必須ではない。
  • [a] の時、a は型変数と言い「何でも来い」多相型。
  • 「[a] -> a」の時、引数の型と返り値の型は同じじゃなきゃダメ。
  • 高階関数。関数を引数にとる関数。map 関数だと「map :: (a -> b) -> [a] -> [b]」の「(a -> b)」が引数にとる関数の定義の条件。
  • パターンマッチ。引数の値のパターンごとに関数定義を書くことができ、上から評価されパターンにマッチした関数が選ばれて実行される。
  • リストに対するパターン。「(x:xs)」は、リストの最初の要素に x が、残りに xs が束縛される。定石っぽく覚えておく。
  • Haskell には for や while がないので、これ使って再帰、再帰、再帰。

エレガントだなぁ。仕事でどうっていうレベルではなくて、純粋に楽しい。

勝手にふりかえり(KPT)

Keep・・・和やか雰囲気。質問しやすい。

Problem・・・意外に明るくないと言われたw 明るく音読します><

読むときに単純に読み上げるよりも自分の言葉でと言われたんですが、結構難しい。

Try・・・予習しとくと理解してる分、分かりやすい言葉で説明できるし、みんなのためにも良いかも><

次回は

隔週なので次回は、4/13(日)ですか。続きが楽しみー。もし興味を持たれた方は、まだ始まったばかりなので是非参加してください>< 詳しくはこちら。toyoshi さん、こんな感じで良いですか:-)

WP Theme & Icons by N.Design Studio
Entries RSS Comments RSS ログイン