[過去ログ] 関数型プログラミング言語Haskell Part16 (978レス)
前次1-
抽出解除 レス栞

このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
802
(2): デフォルトの名無しさん [sage] 2011/12/23(金) 18:32:22.82 AAS
>>797
797(2): デフォルトの名無しさん [sage] 2011/12/23(金) 18:16:45.13 AAS
>>795
Control.Monadにあるようなものは抽象化できるし、
(Monad m) =>で書けなさそうなものは抽象化できない
言葉で言われて分かる類の問題じゃないから具体例を見たり書いたりして慣れるしかないよ

>モナドで抽象する前と後とで何が変わるの?
関数の型が変わって任意のモナドに対して使えるようになる。たとえば、
foreach :: [a] -> (a -> IO ()) -> IO () -- foreach xs f はxsの各要素に対してfを実行
をモナドに関して抽象化すれば、
forM_ :: (Monad m) => [a] -> (a -> m b) -> m ()
になって、IO以外でも使えるようになる
それってオブジェクト指向でメソッドの引数の型を
IO型からObject型にするのと、どう違うの?
804
(1): デフォルトの名無しさん [sage] 2011/12/23(金) 18:53:48.59 AAS
>>802
色んなものの「共通する性質」や「共通する関係」を抜き出し、
具体的な実態では無くその性質や関係のみで以て語るのが「抽象化」だから、
抽象化するという意味は同じ

どう抽象化するかという点で、IO型からObject型へとMonadへとで違いがでる

Haskell のモナドは (m を Monad クラスのインスタンスとして)
forall a b. m a -> (a -> m b) -> m b
forall a b. m a -> m b -> m b
a -> m a
String -> m a
という4つの「演算で抽象化」してる(うち2つだけで十分だが)

特にモナド同士の演算がまたモナドになるという性質と、
モナドの外からはモナドの具体的な実態は見えないという性質が特徴的だから、
そういう性質が活かせるところでもてはやされる

オブジェクト指向のObject型がどういう性質の抽象化なのかは忘れた
807
(1): デフォルトの名無しさん [sage] 2011/12/23(金) 19:37:49.40 AAS
>>802
その例だと、内部でやってることもだいたい同じ
実際の型に応じて実装が選ばれる
実装を選ぶタイミングがコンパイル時か実行時かは違う

型クラスは ad-hoc polymorphism を使いやすくしたものでオーバーロードの親戚
OOPのほうはsubtype polymorphismといって、部分かなり違う部分がある
例えばsubtype relationが推移律をみたすみたいな強い性質がある
subtypeがあるとどうなるかは、Scalaが壮大な社会実験中
前次1-
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.036s