{"type":"rich","categories":[],"image_url":null,"provider_name":"Hatena Blog","width":"100%","blog_title":"\u8a00\u8a9e\u30b2\u30fc\u30e0","description":"import Control.Arrow newtype SF a b = SF {runSF ::[a]->[b]} instance Arrow SF where arr f = SF (map f) SF f >>> SF g = SF (f >>> g) first (SF f) = SF (unzip >>> first f >>> uncurry zip) instance ArrowChoice SF where left (SF f) = SF(\\xs -> combine xs (f [y | Left y <- xs])) where combine (Left y:xs)\u2026","height":"190","provider_url":"https://hatena.blog","title":" [haskell] How To Arrow3 \u9078\u629e","published":"2007-08-08 00:00:00","author_url":"https://blog.hatena.ne.jp/propella/","html":"<iframe src=\"https://hatenablog-parts.com/embed?url=https%3A%2F%2Fpropella.hatenablog.com%2Fentry%2F20070808%2Fp1\" title=\" [haskell] How To Arrow3 \u9078\u629e - \u8a00\u8a9e\u30b2\u30fc\u30e0\" class=\"embed-card embed-blogcard\" scrolling=\"no\" frameborder=\"0\" style=\"display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;\"></iframe>","author_name":"propella","blog_url":"https://propella.hatenablog.com/","url":"https://propella.hatenablog.com/entry/20070808/p1","version":"1.0"}