Hatena::Groupsubtech

冬通りに消え行く制服ガールは✖夢物語にリアルを求めない。

 | 

Nov 25, 2007 (Sun)

ラムダ計算 / オブジェクト指向 03:25 はてなブックマーク - ラムダ計算 / オブジェクト指向 - 冬通りに消え行く制服ガールは✖夢物語にリアルを求めない。

ラムダ計算では true/false はもちろん関数で、こんなかんじらしい (true は x と y を引数にとり x を返す関数で、false は y を返す関数)

t :: a -> b -> a
t x y = x

f :: a -> b -> b
f x y = y

main :: IO ()
main = t (putStrLn "hoge") (putStrLn "fuga")

Haskell で書いたはいいけど、あんまわかりやすくないなw (引数は評価されるけど、副作用はモナドでラッピングされてる(?)から、かえされた IO モナドインスタンスが保持してる putStrLn "hoge" しか表示されないってことだとおもうけど、というか用語がすでにあやしい。Haskell こわい)

(define (t x y) x)
(define (f x y) y)

((t
  (lambda () (print "hoge"))
  (lambda () (print "fuga"))))

Scheme で書くとこんなかんじかな。Haskell より綺麗に書けないけど、なんかまちがってるかな……(引数は評価されてしまうので lambda でかこみ、t の返り値をさらに呼びだしてる)

まぁどっちにしろこれってどことなく OOP で書いた

true then (
	"hoge" println
) else (
	"fuga" println
)

に似ていて、

true if := method(
	call evalArgAt(0)
)

false if := method(
	call evalArgAt(1)
)

("foo" == "bar") if (
	"hoge" println
,
	"fuga" println
)

とかくともっと似てますね! と最近思ったのでした。(もしかしたらあたりまえなのかもしれないけど、じぶんとしては、やっと気付けたことなのでした)

似ているからなんなの? っていうのはまだうまく言語化できない。なんというか、「ああそっかラムダ計算もオブジェクト指向も純粋だと似てくるんだなぁ」みたいな、よくわからないけど

あー Ruby で書くともっとわかりやすいかなぁ……

# lambda
t = lambda {|x, y| x }
f = lambda {|x, y| y }

t[lambda {
	puts "hoge"
}, lambda {
	puts "fuga"
}][]

# OOP
class TrueClass
	def if(x, y)
		x[]
	end
end

class FlaseClass
	def if(x, y)
		y[]
	end
end

true.if(Proc.new {
	puts "hoge"
}, Proc.new {
	puts "fuga"
})

ラムダのほうは似せるために curry 化してない。curry 化するとラムダのほうはもっと綺麗にかける。

# http://subtech.g.hatena.ne.jp/cho45/20071119/1195420784
t = lambda {|x, y| x }.curry
f = lambda {|x, y| y }.curry

t[lambda {
	puts "hoge"
}][lambda {
	puts "fuga"
}][]

curry 化バージョンは Scheme と全く同じことをやってる。

というか Ruby は表現しやすいなぁ。Io や SchemeHaskell は初見だと読めないし……Ruby にしとくと関数系の人もOOP系の人も読めていいかんじがする。

 | 

スポンサード リンク

書いてる人

cho45 (佐藤広央) (www.lowreal.net)

Perl, JavaScript, Ruby, HTML, CSS, Web etc


スポンサード リンク