SVX日記

2004|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|12|
2024|01|02|03|04|05|06|07|08|09|10|

2013-02-22(Fri) 初めてHaskeる

  最近、Haskellという言語が流行っているらしい。どこかで「極めてバグが出づらい反面、極めてバグが取りづらい」という噂を聞いて、俄然、興味が湧いてきてしまった。

  ふと、Rubyをカジり始めた日付を調べてみた。2003年3月18日とあった。ほぼ10年キッカリ。ずっと、Rubyメインで使ってきたことになる。フムン。別に節目というわけでもないが、新たな言語をカジってみるのも頭の体操には悪くない。かなり、変わった概念の言語らしいし。

  しかし、言語を始めるのは、敷居が高い。インストールから始まって、何をやるにもリファレンスと首っ引き、かつ、果てしないトライアンドエラーの繰り返し。自分なりの「口ぐせ」がそろってくるまでがツラい。Ruby の時も結構ツラかったのだが、果たして、最近の脳力でノッて行けるのだろうか。

  なにはともあれ、まずはインストール。環境は、Fedora18だ。ググりまくりつつ、Linux版の処理系が存在することを確認する。コンパイラとインタプリタが両方あるのか。ならば、まずはインタプリタの方がいいだろうな。

# yum install hugs98

  初めての味見。まずは、絶対に常用しないであろう、対話モードを試す。

$ hugs
__   __ __  __  ____   ___      _________________________________________
||   || ||  || ||  || ||__      Hugs 98: Based on the Haskell 98 standard
||___|| ||__|| ||__||  __||     Copyright (c) 1994-2005
||---||         ___||           World Wide Web: http://haskell.org/hugs
||   ||                         Bugs: http://hackage.haskell.org/trac/hugs
||   || Version: September 2006 _________________________________________
 
Haskell 98 mode: Restart with command line option -98 to enable extensions
 
Type :? for help
Hugs> 1 + 2
3
Hugs> :quit
[Leaving Hugs]

  定番の「hello, world」で筆下ろし。

$ vi hello.hs
 
$ cat hello.hs 
#!/usr/bin/runhugs
 
main = putStr "hello, world\n"
 
$ chmod 755 hello.hs 
 
$ ./hello.hs 
hello, world
 
$ cat hello.hs 
#!/usr/bin/runhugs
 
main = print "hello, world\n"
 
$ ./hello.hs 
"hello, world\n"

  Haskellは「純粋関数型プログラミング言語」ということで、関数を使ってみる。

$ cat func1.hs 
#!/usr/bin/runhugs
 
ave3 :: Float -> Float -> Float -> Float
ave3 a b c = (a + b + c) / 3
 
main = print (ave3 8 10 5)
 
$ ./func1.hs 
7.666667
 
$ cat func2.hs 
#!/usr/bin/runhugs
 
cat3 :: String -> String -> String -> String
cat3 a b c = a ++ " " ++ b ++ " " ++ c ++ "."
 
main = print (cat3 "She" "sees" "sea")
 
$ ./func2.hs 
"She sees sea."

  とりあえず、目標を作らないと楽しくないので、フラクタル図形を描いて遊ぶことにする。グラフィクスライブラリをインストール。

# yum install hugs98-hgl

  まずはC曲線から……って、どこから手をつけたらいいのかさっぱり。デモプログラムでもないかと探したらあった。

# yum install hugs98-demos.x86_64

  コードを切り貼りしながら、どうにかC曲線を描くことに成功した。直後にドラゴン曲線も。まだ、文法すらあやふやだが、習作ということなら、こんなもんかと。

$ cat dcurve.hs
#!/usr/bin/runhugs
 
import System
import Graphics.HGL
 
-- /usr/lib64/hugs/packages/HGL/Graphics/HGL/Internals/Types.hs
-- type Point = (Int,Int)
 
rad :: Int -> Float
rad d = (2 * pi * (fromIntegral d) / 360)
 
vnext :: Point -> Int -> Float -> Point
vnext (x, y) r l = (x + round (cos (rad r) * l), y + round (sin (rad r) * l))
 
ccurve :: Int -> Point -> Int -> Float -> Graphic
ccurve 0 (x, y) r l = line (x, y) (vnext (x, y) r l)
ccurve d (x, y) r l = overGraphics [
	ccurve (d - 1) (x, y) (r - 45) (l / 2 * sqrt 2),
	ccurve (d - 1) (vnext (x, y) (r - 45) (l / 2 * sqrt 2)) (r + 45) (l / 2 * sqrt 2) ]
 
dcurve :: Int -> Point -> Int -> Float -> Int -> Graphic
dcurve 0 (x, y) r l w = line (x, y) (vnext (x, y) r l)
dcurve d (x, y) r l w = overGraphics [
	dcurve (d - 1) (x, y) (r - w) (l / 2 * sqrt 2) 45,
	dcurve (d - 1) (vnext (x, y) (r - w) (l / 2 * sqrt 2)) (r + w) (l / 2 * sqrt 2) (-45) ]
 
main :: IO ()
main = runGraphics $ do
	args <- getArgs
--	w <- openWindow "C Curve Window" (800, 600)
--	drawInWindow w (ccurve (read (head args)) (250, 350) 0 300)
	w <- openWindow "Dragon Curve Window" (800, 600)
	drawInWindow w (dcurve (read (head args)) (250, 350) 0 300 45)
	getKey w
	closeWindow w
 
$ ./dcurve.hs 15

  画像の説明 画像の説明

  しかし、Rubyがあるしなぁ。果たして、Haskellは楽しめるかな。