[過去ログ] 関数型プログラミング言語Haskell Part16 (978レス)
上下前次1-新
このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
785: 778 [sage] 2011/12/22(木) 12:54:37.61 AAS
>>783,784783(2): 778 [sage] 2011/12/22(木) 07:55:25.77 AAS
途中でレスってしまった
>>780 に指摘されて修正案を考えてる時に、
全然違うアイデアが思い浮かんだんだが、
これは今まで出てきたかな(特に >>771 と同類か)
listA から x の位置を探す
x の位置の直後から listB の要素数分の要素をリストとして取り出す listC
x が listB に無い場合、head listB が listC に有れば「前」
head listB が listC に無ければ「後ろ」
784(1): 778 [sage] 2011/12/22(木) 08:55:12.79 AAS
>>783
訂正
> x の位置の直後から listB の要素数分の要素をリストとして取り出す listC
x の位置の直後から末端までをリストとして取り出す listC
式にするとこんな感じ
whereIncluded :: (Eq a) => [a] -> [a] -> a -> Where
whereIncluded as bs@(b:_) x
| elem x bs = Here
| elem b as' = After
| otherwise = Before
where as' = takeWhile (/=x) as
ダサいかな
786: デフォルトの名無しさん [sage] 2011/12/22(木) 20:08:59.62 AAS
Haskell Platform じゃなくて素の GHC の方には、
random パッケージってデフォルトでは入ってないんだね
地味に驚いた
787: デフォルトの名無しさん [sage] 2011/12/22(木) 21:36:01.61 AAS
QuickCheck を調べてて、ステキなリファクタリング テクニックに出会った
外部リンク:www.haskell.org
リファクタリング前は(インデントに全角スペースを入れた)、
getList = find 5 where
find 0 = return []
find n = do
ch <- getChar
if ch `elem` ['a'..'e'] then do
tl <- find (n-1)
return (ch : tl) else
find n
というコードなんだが、副作用がある処理と無い式とが混ざっててテストし難い
(また、全体の処理もぱっと見分かりにくい)
これがリファクタリングで次のようになる
getList :: IO [Char]
getList = fmap take5 getContents
take5 :: [Char] -> [Char]
take5 = take 5 . filter (`elem` ['a'..'e'])
ちょっと感動した
こういうことがサラっとできるようになりたいもんだ
788: デフォルトの名無しさん [sage] 2011/12/22(木) 21:56:17.35 AAS
遅延I/O怖い><
789: デフォルトの名無しさん [] 2011/12/22(木) 22:55:08.11 AAS
モナドって大した概念なの?
790(2): デフォルトの名無しさん [sage] 2011/12/22(木) 22:59:36.72 AAS
ものごとを抽象化するための仕組みとしては大したもんだよ
791(1): デフォルトの名無しさん [] 2011/12/23(金) 10:28:44.71 AAS
>>790
なんかいい例希望
モナドはものごと全部を抽象化するんじゃないよね?
792: デフォルトの名無しさん [sage] 2011/12/23(金) 10:30:00.16 AAS
STMとか?
793: デフォルトの名無しさん [] 2011/12/23(金) 12:02:29.11 AAS
>>790 >>791
そうだな。なんでも抽象化できるんならこれまた意味不明になるし。
だいたい、何なんだよ抽象化って。
794: デフォルトの名無しさん [sage] 2011/12/23(金) 17:44:45.43 AAS
モナドによる抽象化ってのは、だいたい(Monad m) =>で始まる型のある関数を書くこと
具体例はControl.Monadとか見れば
795(1): デフォルトの名無しさん [sage] 2011/12/23(金) 17:52:14.34 AAS
それで、何をどう抽象できて、何は抽象できないの?
モナドで抽象する前と後とで何が変わるの?
796: デフォルトの名無しさん [sage] 2011/12/23(金) 18:06:55.65 AAS
いつもの糖質が現われる頃合いだな
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以外でも使えるようになる
798: デフォルトの名無しさん [sage] 2011/12/23(金) 18:19:11.21 AAS
抽象化できないものの証明って難しいな。もうあるのだろうか。
799(1): デフォルトの名無しさん [sage] 2011/12/23(金) 18:22:51.88 AAS
いい例かどうか分からないが
外部リンク[html]:blog.sigfpe.com
外部リンク:www.haskell.org
外部リンク:www.haskell.org
800: デフォルトの名無しさん [sage] 2011/12/23(金) 18:24:52.49 AAS
コードが書いてあるあたりだけでもざっと見ればいいよ
801: デフォルトの名無しさん [] 2011/12/23(金) 18:26:57.57 AAS
>>797
サンクス
802(2): デフォルトの名無しさん [sage] 2011/12/23(金) 18:32:22.82 AAS
>>797
それってオブジェクト指向でメソッドの引数の型を
IO型からObject型にするのと、どう違うの?
803: デフォルトの名無しさん [sage] 2011/12/23(金) 18:47:13.75 AAS
メソッドの引数に限定する意味が良くわからないが
bindとかreturnというメソッドを持ったIO型を一般化して、
Monadという抽象クラスから派生するようにしたら便利なのと一緒。
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型がどういう性質の抽象化なのかは忘れた
805: デフォルトの名無しさん [sage] 2011/12/23(金) 18:59:26.87 AAS
なんかHaskellPlatform DLできないんだけど鯖どうなってんこれ
806: デフォルトの名無しさん [] 2011/12/23(金) 19:27:53.45 AAS
>>799
ありがとう。読んでみる。
807(1): デフォルトの名無しさん [sage] 2011/12/23(金) 19:37:49.40 AAS
>>802
その例だと、内部でやってることもだいたい同じ
実際の型に応じて実装が選ばれる
実装を選ぶタイミングがコンパイル時か実行時かは違う
型クラスは ad-hoc polymorphism を使いやすくしたものでオーバーロードの親戚
OOPのほうはsubtype polymorphismといって、部分かなり違う部分がある
例えばsubtype relationが推移律をみたすみたいな強い性質がある
subtypeがあるとどうなるかは、Scalaが壮大な社会実験中
808: デフォルトの名無しさん [sage] 2011/12/23(金) 20:08:50.39 AAS
Objectにしたらキャストがいるよね
interface Monadみたいの定義しないと
809(1): デフォルトの名無しさん [sage] 2011/12/23(金) 21:29:18.89 AAS
抽象化と言うか普遍化だな。
上下前次1-新書関写板覧索設栞歴
あと 169 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 0.029s