haskonの日記 このページをアンテナに追加 RSSフィード

2006-07-29

[]haskell.vim 15:57 haskell.vimを含むブックマーク

おひさしぶりです。最近忙しくてHaskellを書けていないんですが、こんなものをみつけました。

haskell.vim

emacsにあるhaskell-modeみたいに、vimで書いていたプログラムをrunghcをつかって実行できます。

ふぇじょーーーあwwwwふぇじょーーーあwwww 2009/06/15 16:36
これヤった後でパチ屋に行ったら勝率上がりすぎwwwwww

http://shiofuki.navi-y.net/fv1Mw5E/

ただの軍資金稼ぎのつもりでヤってたんだけど、
パチも負けねーもんだから金が余りまくりっす・・(^^;
まー金は余っても困らないからまだ続けるけどねーヽ( ・∀・)ノ
とりあえずBMWでも買うわwwwwwww

いよっしゃーーっ!!!!いよっしゃーーっ!!!! 2009/06/23 10:29
これ始めたら女釣れすぎーw ww
いつもテ〃リ嬢に金払ってたのがバカみてぇ。。
だってヤる度に金くれんだもんヽ(´ー`)ノ
ぶっちゃけ風俗は卒業ッス(´ー`)y─┛~~

http://dopyun.quitblue.com/KUiN4H7/

むきゅっもきゅっ?むきゅっもきゅっ? 2009/06/23 10:34
いつもマヌコに空気入れてブリブリ音出させて遊んでんだけど
昨日の女動物の鳴き声みたいな変な音出たwwwwwwww
かなり締まりのイイ女だったんだがもしかしてそれが理由かな?
5万しか貰えなかったけどある意味貴重な経験出来たからおkだろwww

http://ahan.yumenokuni.net/CUpW6yU/

ヒャッハーーー!!!!ヒャッハーーー!!!! 2009/07/14 17:30
あひょー!初 体 験でいきなり生でマ ヌ コに挿入してきたワイさあ!!!!
「ぶっちゃけオ ナ ホの方が気持ちE!」って言ってた友達はヴァカだろーw
1000%生挿入が最強だろぉぉぉおおおおがあぁああ!!!!!

http://sE2vT4O.fctwo.d-viking.jp/

これなんて錬金術??これなんて錬金術?? 2009/07/20 01:55
> 教えてくれた人
書き込み消えてるから名前わかりません(すいません・・)
半信半疑で試してみたんすけど、その日にハメちゃいましたwwww
本当に一発で5万貰えるって思ってなかったんで正直ビビりましたよ(^^;
思ってる以上に世の中甘いもんなんすねーーwwwww

http://CROz9F3.dashinuki.adult-value.com/

ぎょはぁ!!!!!ぎょはぁ!!!!! 2009/08/15 21:40
ヘイヘイ!!あひひひほはぁwwwwwww ちょwwいきなりごめwwwwww
寝てるだけで5 万もらっちゃって真面目な自分がヴァカらしくなってさwwwww
はぁーいま女シャワー浴びてんだけど、もう1ラウンドでまた5 万くれるってYO!wwwwww
またマグロでさっさと中 出 しするわwwwwwwwww

http://kachi.strowcrue.net/05HOpER/

2006-07-01

[]cons,car,cdr 13:56 cons,car,cdrを含むブックマーク

今日は、問題2.4をといてみます。

問題2.4は、lispのconsと、carを

(define (cons x y)
  (lambda (m) (m x y)))
(define (car z)
  (x (lambda (p q) p)))

と定義されているときのcdrはどう定義されるかと問題。

ということで、cons,car,cdrのこの定義で実装

cons x y = \x' -> x' x y
car x = x ( \x' y' -> x')
cdr x = x ( \x' y' -> y')

で、実行。

$ ghci cons.hs
*Main> :l cons.hs
Compiling Main             ( condcons.hs, interpreted )
Ok, modules loaded: Main.
*Main> :t cons
cons :: t -> t1 -> (t -> t1 -> t2) -> t2
*Main> :t car
car :: ((t1 -> t2 -> t1) -> t) -> t
*Main> :t cdr
cdr :: ((t1 -> t2 -> t2) -> t) -> t
*Main> let test = cons 8 10
*Main> car test
8
*Main> cdr test
10

うまく動いてるようです

トラックバック - http://d.hatena.ne.jp/haskon/20060701

2006-06-25

[]長方形を表現 18:42 長方形を表現を含むブックマーク

SICPの問題2.3。長方形を表し、周囲の長さと面積を計算する手続きを作る。

今回は、問題2.2とほぼ同じなので、以下にソースと実行結果を示します。 

$cat rectangle.hs
data Point = Point Integer Integer

instance Show Point where
    show (Point x y ) = "( "++show(x)++" , " ++ show(y)++" )"

data Rectangle = Rectangle Point Point

instance Show Rectangle where
    show (Rectangle (Point x y) (Point x' y')) 
         = show (Point x y) ++ " - " ++ show (Point x' y)
                ++ "\n" ++ show (Point x y') 
                     ++ " - " ++ show (Point x' y')

makeRectangle:: Integer->Integer->Integer->Integer->Rectangle
makeRectangle x y x' y' = Rectangle (Point x y) (Point x' y')

getCircuit::Rectangle->Integer
getCircuit (Rectangle (Point x y) (Point x' y'))
        = double $( getLength x x') + (getLength y y')
        where
                double = (*) 2

getDimension (Rectangle (Point x y) (Point x' y'))
        = (*) (getLength  x x') (getLength  y y')

getLength::Integer->Integer->Integer
getLength x x' = abs ( x' -x )
$ghci rectangle.hs
Loading package base-1.0 ... linking ... done.
Compiling Main             ( rectangle.hs, interpreted )
Ok, modules loaded: Main.
*Main> makeRectangle 3 5 6 1
( 3 , 5 ) - ( 6 , 5 )
( 3 , 1 ) - ( 6 , 1 )
*Main> let rect = makeRectangle 3 5 6 1
*Main> getCircuit rect
14
*Main> getDimension rect
12
トラックバック - http://d.hatena.ne.jp/haskon/20060625

2006-06-24

[]平面上の線分 22:27 平面上の線分を含むブックマーク

今日は、SICPの問題2.2を解いてみます。

問題は、線分を表現するデータ構造を作り、その線分の中間点を求めよという問題。データ構造は、x座標と、y座標を表すデータ構造を作って、ポイントを表すデータ構造を作れとなっているんだけど、そこは割愛。そのかわり、線分の長さを求める関数も作ることにします。

で、線分と座標を表すデータ構造は、このような感じ。

data Point = Point Integer Integer

instance Show Point where
    show (Point x y ) = "( "++show(x)++" , " ++ show(y)++" )"

data Line = Line Point Point

instance Show Line where
    show (Line s e) = show s ++ " - " ++ show e

makeLine:: Integer->Integer->Integer->Integer->Line
makeLine x y x' y' = Line (Point x y) (Point x' y')

毎回、Lineを作るのに、Pointとかうつのが面倒臭そうなので、makeLineなる関数も定義 。

中間点と、長さをあらわす関数は、こちら。

getMiddlePoint::Line->Point
getMiddlePoint (Line (Point x y) (Point x' y'))
        = Point ( calMiddle x x' ) (calMiddle y y')

calMiddle::Integer->Integer->Integer
calMiddle x x' = quot (x+x') 2

getLength::Line->Float getLength (Line (Point x y) (Point x' y'))
        = sqrt   ((func x x') + (func y y'))
        where
func x x' = (x'-x) ^ 2

関数funcは、自分のボキャブラリーから適切な名前が浮かばなかったので、こんな名前に。では、実行してみます。

$ ghci calline.hs
calline.hs:22:10:
No instance for (Floating Integer)
arising from use of `sqrt' at calline.hs:22:10-13
Probable fix: add an instance declaration for (Floating Integer)
In the definition of `getLength':
getLength (Line (Point x y) (Point x' y')) = sqrt ((func x x') + (func y y'))
Failed, modules loaded: none.

どうやら、(func x x') + (func y y')の返す値の型と、sqrtの引数の型があわないよう です。

(func x x') + (func y y') は、Integerだとおもわれます。sqrtの型は、

Prelude> :t sqrt
sqrt :: (Floating a) => a -> a

Float型みたいです。どうやら、IntegerはFloatには、勝手にならないようです。

ということで、ここではfromInteger関数を使ってみることにします。

Prelude> :t fromInteger
fromInteger :: (Num a) => Integer -> a

fromIntegerは、Integer型の値をNum型に直してくれる関数です。

Num型は、数値の規定クラスです。Javaをやっている人には、数値のなかでのObjectクラ スとでも言えば、わかりやすいでしょうか?rubyでいうとこのNumericです。

なので、Floatは、Numであるともいえるので、この関数を適用することで、今回の問題を解決できます。

以下に、完全なソースを

data Point = Point Integer Integer

instance Show Point where
    show (Point x y ) = "( "++show(x)++" , " ++ show(y)++" )"

data Line = Line Point Point

instance Show Line where
    show (Line s e) = show s ++ " - " ++ show e

makeLine:: Integer->Integer->Integer->Integer->Line
makeLine x y x' y' = Line (Point x y) (Point x' y')

getMiddlePoint::Line->Point
getMiddlePoint (Line (Point x y) (Point x' y'))
        = Point ( calMiddle x x' ) (calMiddle y y')

calMiddle::Integer->Integer->Integer
calMiddle x x' = quot (x+x') 2

getLength::Line->Float
getLength (Line (Point x y) (Point x' y'))
        = sqrt $ fromInteger  ((func x x') + (func y y'))
        where
                func x x' = (x'-x) ^ 2

では、実行結果です。

$ ghci calline.hs
Loading package base-1.0 ... linking ... done.
Compiling Main             ( calline.hs, interpreted )
Ok, modules loaded: Main.
*Main> makeLine 2 4 2 12
( 2 , 4 ) - ( 2 , 12 )
*Main> let linea = makeLine 2 4 2 12
*Main> getMiddlePoint linea
( 2 , 8 )
*Main> getLength linea
8.0

途中ででてくる、letは、変数に値を束縛することができます。なので、lineaは、makeLine 2 4 2 12の値に束縛されることになります。

追記:id:nobsunさんから指摘。letは関数ではないとのこと。ふつけるを読んで、letが式だったことを確認。すみませんでした。

nobsunnobsun 2006/06/28 17:29 let は関数ではありません

haskonhaskon 2006/06/28 21:18 毎度毎度すみません。
letは式なんですね。ghci内で使っていると適用される範囲を書かなくていいんでかんちがいしていました。

トラックバック - http://d.hatena.ne.jp/haskon/20060624

2006-06-22

[]使える文字 21:31 使える文字を含むブックマーク

前回関数の名前で定義できない文字を使いエラーを出していたので、名前に使える文字をまとめてみます。

まず、関数名。

1文字目は、アルファベットの小文字か、アンダースコア

それ以降は、アルファベットの大文字、小文字。数字。アンダースコア。シングルクォート。

正規表現で書くとこんな感じかな?

 funcName = [a-z_][a-zA-Z0-9_']*

また、Haskellでは、アンダースコアから始まる関数名は、あまり良しとされていないようです。

次に、データコンストラクタ、型コンストラクタ、クラス名

これらは、関数名と違いアルファベットの大文字から始めなくてはなりません。また、クラス名は、データコンストラクタとは、かぶってはいけないようです。

話はかわりますが、マージンFXのひまわり証券さん、ニンテンドーDS Lite欲しい!と、いってもいいですか?

トラックバック - http://d.hatena.ne.jp/haskon/20060622