トップページ > プログラム > 2015年01月05日 > UJnBa08N

書き込み順位&時間帯一覧

5 位/216 ID中時間01234567891011121314151617181920212223Total
書き込み数0000000000000101103110008



使用した名前一覧書き込んだスレッド一覧
デフォルトの名無しさん
関数型プログラミング言語Haskell Part26

書き込みレス一覧

関数型プログラミング言語Haskell Part26
934 :デフォルトの名無しさん[]:2015/01/05(月) 13:54:22.37 ID:UJnBa08N
>>929
リスト走査を1度ですませたいなら融合変換すればよいのでは.
関数型プログラミング言語Haskell Part26
942 :デフォルトの名無しさん[]:2015/01/05(月) 15:59:36.20 ID:UJnBa08N
>>937
zipで一回,filterで一回,計2回ではないでしょうか?
関数型プログラミング言語Haskell Part26
944 :デフォルトの名無しさん[]:2015/01/05(月) 16:29:22.31 ID:UJnBa08N
>>943
中間リストがなくなればその分の走査が減るとおもいます.
関数型プログラミング言語Haskell Part26
947 :デフォルトの名無しさん[]:2015/01/05(月) 18:31:50.63 ID:UJnBa08N
>>946
oddElems :: [a] -> [a]
oddElems = filter' snd (odd . fst) . zip [0..]
filter' _ _ [] = []
filter' f p (x:xs) = if p x then f x : filter' f p xs
このとき,oddElem の入力となるリストを es.その長さを n = length es とします.
zip [0..] は関数で,この関数が結果のリスト全体を作成するには es の全要素を辿ります.
zip [0..] es が生成するリストを es' とすると,そのは長さは es の長さと同じ n です.
filter' snd (odd . fst) es' は結果のリスト全体を生成するのに es の全要素を辿ります.
融合変換して es' という中間リストがなくなれば,辿るべきリストが1つ減っていることが期待できますよね.
関数型プログラミング言語Haskell Part26
948 :デフォルトの名無しさん[]:2015/01/05(月) 18:48:33.68 ID:UJnBa08N
訂正 es → es'
filter' snd (odd . fst) es' は結果のリスト全体を生成するのに es' の全要素を辿ります.
関数型プログラミング言語Haskell Part26
949 :デフォルトの名無しさん[]:2015/01/05(月) 18:49:41.11 ID:UJnBa08N
中間リストといっているのはzip [0..] が生成するリストのことです.
関数型プログラミング言語Haskell Part26
951 :デフォルトの名無しさん[]:2015/01/05(月) 19:47:30.17 ID:UJnBa08N
走査という曖昧な言葉をつかったのが失敗でした.
中間リストの生成を除去するといえばよかったですね.
関数型プログラミング言語Haskell Part26
952 :デフォルトの名無しさん[]:2015/01/05(月) 20:19:28.54 ID:UJnBa08N
oddElems :: [a] -> [a]
oddElems = filter' snd (odd . fst) . zip [0..]

filter' snd (odd . fst) . zip [0..]
⇔ { zipp = uncurry zip とする }
filter' snd (odd . fst) . zipp . (,) [0..]
⇔ { addifodd (i,x) xs = if odd i then x:xs eles xs とする }
foldr addifodd [] . zipp . (,) [0..]
⇔ { phipair (xxs,yys) = if null xxs || null yys then Nothing else Just ((head xxs,head yys),(tail xxs, tail yys)) とする }
foldr addifodd [] . unfoldr phipair . (,) [0..]
⇔ { hylo f e phi x = case phi x of {Nothing -> e; Just (y,z) -> f y (hylo f e phi z)} とする }
hylo addifodd [] phipair . (,) [0..]

まちがえてなければ,これで融合変換できたことになると思います.
oddelems = hylo addifodd [] phipair . (,) [0..]


※このページは、『2ちゃんねる』の書き込みを基に自動生成したものです。オリジナルはリンク先の2ちゃんねるの書き込みです。
※このサイトでオリジナルの書き込みについては対応できません。
※何か問題のある場合はメールをしてください。対応します。