1 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 16:41:29 ] haskell.org www.haskell.org/ 日本語サイト www.sampou.org/cgi-bin/haskell.cgi www.shido.info/hs/ 過去ログ 関数型プログラミング言語Haskell Part1 pc.2ch.net/tech/kako/996/996131288.html Part2 pc2.2ch.net/test/read.cgi/tech/1013846140/ Part3 pc8.2ch.net/test/read.cgi/tech/1076418993/ Part4 pc8.2ch.net/test/read.cgi/tech/1140717775/ Part5 pc8.2ch.net/test/read.cgi/tech/1149263630/ Part6 pc11.2ch.net/test/read.cgi/tech/1162902266/ Part7 pc11.2ch.net/test/read.cgi/tech/1174211797/ Part8 pc11.2ch.net/test/read.cgi/tech/1193743693/ ・2chの仕様により、行頭の半角スペースは表示されません。 コードをインデントしたいときは、代わりに または全角スペースを使うことができます。
823 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 12:13:24 ] ん?どんな風に?
824 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 18:45:20 ] 質問です。 Haskellにて、二次元配列を時計回りに90度回転させるには、どうすればいいでしょうか? 今あるコードが rot90 list = reverse (map (head) list) : rest where rest = if length (concat taillist) == 0 then [] else rot90 taillist where taillist = map tail list ですが、ものすごく非効率的だと思います。
825 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 19:03:11 ] >>824 length (concat taillist) == 0 の部分を all null taillist にでもすれば別に非効率的でもない気がする 俺ならtransposeを使うな rot90 = transpose . reverse
826 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 19:24:00 ] >>825 素早い回答ありがとうございます。 実は、transposeも定義しないといけなく、transposeでrot90を使っているので…。 transpose list = rot90 (hflip list) hflip list = reverse list というふうになっております。
827 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 19:39:20 ] どうしてもrot90でtransposeを定義しなきゃいけないの? そうでなくて単にtransposeが必要ってだけならその定義は捨てて import Data.Listしてtransposeを使えば良いんじゃない?
828 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 19:45:38 ] transposeって標準の関数ではないんですか?
829 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 19:53:59 ] >>827 課題では、自分でtransposeを定義しろ、とのことでした。
830 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 20:20:13 ] >>828 Prelude関数ではないのでData.Listをインポートしないと使えない。 >>829 だったら >>825 が最初に言ってる変更をするか、rot90を使わずにtransposeを定義すれば。
831 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 21:12:45 ] Data.Listのtransposeはこれ transpose :: [[a]] -> [[a]] transpose [] = [] transpose ([] : xss) = transpose xss transpose ((x:xs) : xss) = (x : [h | (h:t) <- xss]) : transpose (xs : [ t | (h:t) <- xss])
832 名前:デフォルトの名無しさん mailto:sage [2008/10/10(金) 06:57:02 ] >>813 連続した半角スペースはjavascriptモードで書き込むときに置換されるらしい。 >>824-825 長方形じゃないときに、all だとエラー、any だと長方形になるように切り落とす。 filter 使えば>>831 の transpose に map reverse . したような感じになる。 ([<h or t> | h:t<-xss] = map <head or tail> (filter (not.null) xss)) 違ったやり方なら rot90 = foldl c [] where c yss [] = yss c [] xs = [[x] | x<-xs] c (ys:yss) (x:xs) = (x:ys) : c yss xs とか。
833 名前:デフォルトの名無しさん mailto:sage [2008/10/10(金) 07:01:54 ] あ、any じゃ list == [] のときまずいという話もあるか。
834 名前:デフォルトの名無しさん mailto:sage [2008/10/11(土) 00:49:41 ] >>823 パッケージの管理方法にいろいろと問題がある。
835 名前:デフォルトの名無しさん mailto:sage [2008/10/11(土) 01:26:24 ] >>834 具体的に言ってくれよ。そして開発者達にも。
836 名前:デフォルトの名無しさん mailto:sage [2008/10/27(月) 20:53:56 ] 質問です。ディレクトリの階層構造をData.Tree型に納めようとしてい るのですが、遅延評価が効くようなコードが書けません。 type FileTree = Tree FilePathとして、以下のような関数を作ってみたのですが。 recursiveFileTree :: FilePath -> IO FileTree recursiveFileTree name = do contents <- catch (getDirectoryContents name) (\e -> return []) children <- let filtered = filter filterDots contents pathadd = map (\x -> name </> x) filtered mapped = map recursiveFileTree pathadd in sequence mapped return (Node (takeFileName name) children) where filterDots :: FilePath -> Bool filterDots "." = False filterDots ".." = filterDots _ = True (インデントしてるように見せるために全角スペースを入れています。見えますか?) おそらくsequenceで[IO FileTree] -> IO [FileTree]としているあたりが問題なのだと思いますが、解決策が分かりません。
837 名前:デフォルトの名無しさん mailto:sage [2008/10/27(月) 22:14:59 ] ・unsafeInterleaveIOを使う ・Data.Treeを使うのをやめて、明示的なIOを伴う木を定義して使う 好きな方を選んでくれ
838 名前:デフォルトの名無しさん mailto:sage [2008/10/27(月) 22:22:13 ] 一応言っておくが、HaskellのIOは基本的に遅延しないし、普通はそれで正しい IOは実行順が重要なことが多く、遅延させて順番をうやむやにすると厄介なことになりやすい それだとどうしても不便というときのためにunsafeInterleaveIOがある
839 名前:デフォルトの名無しさん mailto:sage [2008/10/30(木) 10:12:08 ] f a b c の部分適用として f a b と書くことはできますが、(\a -> f a b c) にあたる部分適用を a を省略して書く方法はありますか?
840 名前:デフォルトの名無しさん mailto:sage [2008/10/30(木) 11:26:17 ] flip使え
841 名前:デフォルトの名無しさん mailto:sage [2008/10/30(木) 17:56:42 ] flip (flip f b) cはさすがに悪趣味だろ
842 名前:デフォルトの名無しさん mailto:sage [2008/10/30(木) 18:02:48 ] (\a -> f a b c) → 15文字 flip (flip f b) c → 17文字
843 名前:デフォルトの名無しさん [2008/10/30(木) 19:39:38 ] ($c).($b).f flip (`f`b) c
844 名前:デフォルトの名無しさん mailto:sage [2008/10/30(木) 19:45:59 ] こんなのもありました。 (flip.(flip f)) b c 3引数flip haskell.g.hatena.ne.jp/mr_konn/20061223/1166869265
845 名前:デフォルトの名無しさん mailto:sage [2008/10/30(木) 19:54:21 ] >>844 は >>841 の変形だね。 あと、内側の括弧は無くてもOK
846 名前:デフォルトの名無しさん mailto:sage [2008/10/30(木) 21:45:30 ] f # b c みたいな構文(# は未適用引数を表す)があったら便利だったかもね
847 名前:デフォルトの名無しさん mailto:sage [2008/10/30(木) 23:03:15 ] SRFI 26 みたいな?
848 名前:デフォルトの名無しさん mailto:sage [2008/10/30(木) 23:47:19 ] \x->f x b c
849 名前:デフォルトの名無しさん mailto:sage [2008/10/31(金) 08:29:54 ] >>848 >>839
850 名前:デフォルトの名無しさん mailto:sage [2008/10/31(金) 11:19:22 ] >>846 それだと f # b c -- \a -> f a b cと同等 と (f #) b c -- (\a -> f a) b cと同等 を区別する必要が出てきて面倒だな
851 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 13:03:16 ] d.hatena.ne.jp/m-hiyama/20081031/1225416719 ブログ持ってないのでここで。酒井さんのパクリ。 {-# OPTIONS -fglasgow-exts #-} import Control.Monad (liftM2) import Data.Either import Test.QuickCheck infix 4 :<->: type a :<->: b = (a -> b, b -> a) (.>) :: a:<->:b -> b:<->:c -> a:<->:c (f1,g1) .> (f2,g2) = (f2 . f1, g1 . g2) un :: a:<->:b -> b:<->:a un (f,g) = (g,f) type a :+: b = Either a b infixr 5 :+: alt :: a:+:b :<->: b:+:a alt = (f,f) where f = either Right Left swap :: a:+:b:+:c :<->: b:+:a:+:c swap = (f,f) where f = either (Right . Left) (either Left (Right . Right)) rt :: b :<->: c -> a:+:b :<->: a:+:c rt (f,g) = (r f, r g) where r = either Left . (Right .)
852 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 13:04:16 ] data T = L | N T T deriving (Eq, Show) fold :: a:+:(T,(T,a)) :<->: (T,a) fold = (f,g) where f (Left a) = (L,a) f (Right (t1,(t2,a))) = (N t1 t2,a) g (L,a) = Left a g (N t1 t2,a) = Right (t1,(t2,a)) h :: (T,a) :<->: a:+:(T,a):+:(T,(T,(T,a))) h = un fold .> rt (un fold) s :: a:+:(T,(T,(T,a))) :<->: (T,a):+:(T,(T,(T,(T,a)))) s = rt (un fold .> alt) .> swap .> rt fold .> alt
853 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 13:05:44 ] st :: (T,a) :<->: (T,(T,(T,(T,(T,(T,(T,a))))))) st = -- T h -- 1 + T + T^3 .> swap -- T + 1 + T^3 .> rt (s .> s .> s .> s -- T + T^4 + T^7 .> alt) -- T + T^7 + T^4 .> swap -- T^7 + T + T^4 .> rt (s .> s .> s .> s .> s) -- T^7 + T^6 + T^9 .> swap -- T^6 + T^7 + T^9 .> un h -- T^7
854 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 13:08:02 ] instance Arbitrary T where arbitrary = oneof [return L, liftM2 N arbitrary arbitrary] main :: IO () main = do quickCheck $ \x -> x == (snd st (fst st x) :: (T,())) quickCheck $ \x -> x == fst st (snd st x :: (T,())) 型検査で漏れてるのは fold の定義ぐらいで、QuickCheck 意味ないのかも。
855 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 11:50:00 ] すげえ、読みやすいな
856 名前:デフォルトの名無しさん [2008/11/05(水) 07:40:02 ] GHC 6.10.1リリースあげ
857 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 08:34:43 ] ((f.) . g) a b みたいなテクニックが沢山載ってるようなページを教えてください
858 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 12:06:08 ] unsafeInterleaveIO :: IO a -> IO a unsafeInterleaveIO (IO m) = IO ( \ s -> let r = case m s of (# _, res #) -> res in (# s, r #)) この#って何なんですか?ghc6.8.2ではエラーになりますし…
859 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 12:38:02 ] >>858 unboxed tupleってやつだね。 itpro.nikkeibp.co.jp/article/COLUMN/20070206/260872/?ST=develop&P=2 >>856 Windows版を入れてみたんだけど、ライブラリの置き場所がキモイな。 6.8だと$topdir/lib以下に入ってたのが6.10.1だと$topdirに入ってる。 キモイし$topdirの見通しも悪いので6.8と同じように$topdir/libの中に移動して package.confの中の$topdir\\を$topdir/lib\\に全置換した。
860 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 14:29:51 ] >>859 ありがとうございました 拡張構文なんですね
861 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 23:45:00 ] weakリダクションって何?
862 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 00:10:49 ] googleで検索したらひっかかったので、ここに書かせていただきます。質問していいでしょうか? Haskellの処理系だけを使って、prologみたいなことができないか調べています。 ↓でprologのタプル parent(tom, bob). のような感じにすると、 parent::[Char]->[Char]->Bool parent "tom" "bob" = True parent "liz" "bob" = True parent "mike" "liz" = True parent _ _ = False とりあえず、 main = print $ parent "tom" "bob" main = print $ parent "mike" "bob" で True や False が出て、prologっぽくなります。 そこで、 parent X "bob" という質問に対し、 X=tom X=liz みたいに変数にユニファイするような定数を手に入れるような仕組みってあるでしょうか? 入門書に、コンパイル時に内部でグラフを作るみたいな話が書いてあったので、 そのグラフを参照できるようなことができれば実現できると思うのですが、無理でしょうか?
863 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 00:23:23 ] >>862 無理 Haskellの関数は文字通り関数なので、引数を放り込んで結果を観察する他に使い道は無い
864 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 00:43:20 ] 中間形式のグラフみたいなの見れないのん?
865 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 01:15:29 ] 中間形式のグラフって何? グラフ簡約のことを言ってるのなら、グラフが作られるのは実行時だし、 要するに「未評価の式」を表してるだけだから、それを見ても>>862 みたいなことをする助けにはならんよ
866 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 01:27:35 ] 少なくとも書こうとしてるプログラムの中からは見れない。 Haskellって厳格な言語で、その手の変なことは基本的にできないよ。 何をやりたいのか知らないけど、インタプリタ的なものを書いて、 それをライブラリとして使えば?
867 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 01:38:05 ] ん、普通にMaybeとかそれ以前にListモナドとか使えば普通に実現出来るって云うかモナドのすべて読んだ方が良いと思うよ
868 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 02:16:43 ] 関数から引数への参照は、関数が展開されても複数の場所から同じ場所を参照するという話と、 先にグラフを作って、実行時に、そこにデータを流し込むような感じの説明があったから、 処理系をそのまま利用して、かなり高速なデータベースが作れると思ったんですけどダメですかね。 実現できればprologよりも表現能力が高いから面白そうだと思ったんですが。
869 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 03:27:38 ] >関数から引数への参照は、関数が展開されても複数の場所から同じ場所を参照する これはその通り >先にグラフを作って、実行時に、そこにデータを流し込む これはぜんぜん違う 多分どこかで誤読してると思う
870 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 11:40:05 ] >>867 zs <- everything append [1..100] [1..100] zs こういうやり方じゃ生きてるうちに終わらないかもよ。 Listモナドは、もちろんユニフィケーションや制約伝播なんて無くて、 総当りで解を求めようとする非決定性計算ってだけなんで。
871 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 11:50:02 ] yet another embedding of pure Prolog into Haskell okmij.org/ftp/Prolog/Arithm/DefinitionTree.hs いまいち使い方はわからんけど、ググったら見つかったので貼っておく。
872 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 20:48:35 ] >>870 failや[]で枝狩り
873 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 00:44:22 ] >>872 変数をどう表現して、何をどう枝刈るの?
874 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 08:25:24 ] 887 名前:デフォルトの名無しさん[] 投稿日:2008/11/22(土) 00:28:37 Real World Haskellは糞本だと思う
875 名前:デフォルトの名無しさん mailto:sage [2008/11/23(日) 12:49:16 ] 出版されたの?
876 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 23:01:38 ] 出版されたかは知らないけど訳してる人がいる ttp://d.hatena.ne.jp/mokehehe/20081124/rwh
877 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 23:27:23 ] 始まったばかりにしても、ひでえ訳
878 名前:デフォルトの名無しさん [2008/11/25(火) 23:41:58 ] Real World Haskellって翻訳本が出ると思いますか? マイナーな言語だけど、微妙にブームになってるし 来年ぐらいに出版されたりするかなあ?
879 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 23:48:26 ] 確かに一時期あったけど、とっくに沈静化したような…>ブーム
880 名前:a36 ◆K0BqlCB3.k mailto:sage [2008/11/25(火) 23:50:52 ] >>879 最近は沈静化したように見せかけて、ジワジワきてるよ。 各大学の卒研レベルではHaskellやったりしてるところが増えてきてる。
881 名前:デフォルトの名無しさん [2008/11/26(水) 00:04:13 ] うーん、訳の出来とは別になんか期待できなさそうな感じ
882 名前:a36 ◆K0BqlCB3.k mailto:sage [2008/11/26(水) 00:08:27 ] 原文自体平易な英文なので今後のことを考えるなら英文に慣れるために原文で読むことをお勧めします。
883 名前:デフォルトの名無しさん mailto:sage [2008/11/26(水) 00:12:16 ] まだ10章までしか読めてないけど ふつケルの次くらいに読む分には悪くないと思う>RWH タダだし
884 名前:デフォルトの名無しさん [2008/11/26(水) 00:17:39 ] 本買おうと思ったけど、WEBで読めるわけだし 翻訳本が出るまでそれですまそうかなw
885 名前:デフォルトの名無しさん mailto:sage [2008/11/26(水) 00:19:34 ] RWHクソだろ〜 11章からはページを増やすためにネタを書きましたって レベルのオナねたのオンパレードだぞ
886 名前:デフォルトの名無しさん mailto:sage [2008/11/26(水) 00:36:34 ] RWHってネットでもう出回ってるんだなw
887 名前:デフォルトの名無しさん mailto:sage [2008/11/26(水) 00:45:56 ] 出回ってるつーかあれを最近本にしたんでしょ?
888 名前:デフォルトの名無しさん [2008/11/26(水) 00:49:09 ] 存在型ってなんですか?
889 名前:デフォルトの名無しさん mailto:sage [2008/11/26(水) 01:23:56 ] バキシルとか大麻のことだ
890 名前:デフォルトの名無しさん [2008/11/26(水) 01:48:33 ] ありがとうございます。
891 名前:デフォルトの名無しさん mailto:sage [2008/11/26(水) 07:48:38 ] >>888 Cardelli読め
892 名前:デフォルトの名無しさん mailto:sage [2008/11/26(水) 13:02:02 ] Haskell: The Craft of Functional Programming と Programming in Haskell のどちらがお勧めですか?ふつけるの次くらい。
893 名前:デフォルトの名無しさん mailto:sage [2008/11/26(水) 21:24:32 ] >>884 下手糞な翻訳の恐れ大。最近多いね、いや昔からか
894 名前:デフォルトの名無しさん [2008/11/26(水) 22:52:49 ] Programming in Haskellはいいよ。ふつけるの前でもいいです。
895 名前:デフォルトの名無しさん mailto:sage [2008/11/27(木) 19:14:12 ] >>892 自分はふつけるの後にCraftでした。というか、その間にSICPが あるので、あんまり参考にならないかな。ふつける読んでも ちょっとピンとこなかったんですね、よくまとまってるとは思うのですが。 自分は普通の文系プログラマで、関数型プログラミングの世界とは 無縁だったので、SICPをくぐる必要があったと感じてます。
896 名前:デフォルトの名無しさん [2008/11/27(木) 19:30:50 ] Craftはいつ第3判が出るのですか?
897 名前:デフォルトの名無しさん mailto:sage [2008/11/27(木) 19:55:34 ] Craft第2版以降で目立ったHaskellの技法というと、Arrowぐらいでしょうか。 あとはReal Worldみたいな実用面を書いたものになりますかね。
898 名前:デフォルトの名無しさん mailto:sage [2008/11/27(木) 20:02:06 ] ガンズのニューアルバムが出るころに出版されるそうです。
899 名前:デフォルトの名無しさん mailto:sage [2008/11/28(金) 20:17:32 ] それは出版されないってのとどう違うのだ
900 名前:デフォルトの名無しさん mailto:sage [2008/11/28(金) 22:32:12 ] 泳げる頃にh(ry
901 名前:デフォルトの名無しさん mailto:sage [2008/11/28(金) 23:59:30 ] 1版ならともかく3版なら別に出なくてもいいんじゃね
902 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 00:04:26 ] Implementing Functional Languages: a tutorial ってのをやってますが、練習問題の回答とかどっかに転がってますでしょうか。
903 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 11:25:49 ] >>902 著者本人が公開してる。あとは自分で探せクズ。
904 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 11:27:36 ] >>903 おめーがクズだろ この引きこもりw
905 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 21:15:40 ] 自演乙
906 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 22:05:13 ] Haskellで書かれた数式処理ソフトがあると聞いたのですが maximaと比べると 言語から直接利用するときの利用しやすさは、どんな感じなのでしょうか?
907 名前:デフォルトの名無しさん mailto:sage [2008/11/30(日) 09:20:37 ] PJの答を探しているクズ、どこのゼミ生かしらんが、これで次の輪講はアウトだなwww
908 名前:902 mailto:sage [2008/11/30(日) 09:56:28 ] >>907 自分では探してみましたが、部分的なコードだけしか見つけられませんでした。 ちなみに、自分は学生ではないんです。輪読の場があったりしたら入りたい ですけど、ちょっと今は時間的に厳しいかな。ネットでやってたりするといいん ですが。
909 名前:デフォルトの名無しさん mailto:sage [2008/11/30(日) 16:00:41 ] 探すもなにも、入手方法ちゃんと書いてあるじゃんwww
910 名前:デフォルトの名無しさん [2008/11/30(日) 21:28:44 ] >>896 2021年4月19日に出るみたいです。 まだ相当先ですね。
911 名前:デフォルトの名無しさん mailto:sage [2008/12/01(月) 20:25:35 ] どんどん延期してると思ったら 今度はありえないくらいに延ばしたな・・・
912 名前:デフォルトの名無しさん [2008/12/07(日) 12:54:19 ] ghci の補完って windows じゃ効かないんですかね。 Linux 上だとちゃんと動いて便利だったのでショックです。 ネット探してみると rlwrap 使えとかあったけど rlwrap って動的な補完(スコープ内の関数一覧等) って可能なんでしょうか。
913 名前:デフォルトの名無しさん mailto:sage [2008/12/07(日) 13:54:21 ] そんな高度な補完はemacsのinferior-haskellとかeclipseの拡張でもできるかどうか怪しいな
914 名前:デフォルトの名無しさん mailto:sage [2008/12/07(日) 13:56:28 ] 英語配列30g早く!
915 名前:902 mailto:sage [2008/12/07(日) 20:05:48 ] >>909 書いてありました。これって個人でも送ってくれるのでしょうかね。 ただ、まだ半分ぐらいなんですけど、問題簡単なので別に解答不要 になりそうです。ありがとうございました。
916 名前:デフォルトの名無しさん mailto:sage [2008/12/13(土) 18:52:49 ] do記法と(>>=)の対応についてですが、 do;putStr "a\n";putStr "b\n";putStr "c\n"; ≡ putStr "a\n" >>= (\_->putStr "b\n" >>= (\_-> putStr "c\n")) なんですかね? 右結合的になったり匿名関数に変換されたりと難しいです
917 名前:a36 ◆K0BqlCB3.k mailto:sage [2008/12/13(土) 19:06:24 ] >>916 一緒です。 でも putStr "a\n">>putStr "b\n">>putStr "c\n" と書いた方がきれいですよ。
918 名前:a36 ◆K0BqlCB3.k mailto:sage [2008/12/13(土) 19:06:57 ] あと、括弧なくても良いですよ。
919 名前:デフォルトの名無しさん mailto:sage [2008/12/14(日) 10:36:09 ] なるほど、そう言えばlambda式ってかなり優先順位が高いんでしたね ありがとうございました
920 名前:デフォルトの名無しさん mailto:sage [2008/12/14(日) 15:42:38 ] F#からポロロッカしてきました fold/undold、flip とかを使った関数合成がすげえ苦手なんですが このあたりに特化した書籍とかってないでしょうか モナドとか継続とかはわりとどうでもいいんですが
921 名前:デフォルトの名無しさん mailto:sage [2008/12/14(日) 16:19:34 ] プログラムの変形やそこで使う公式を見るのがいいと思う。 birdがそういうの得意な人だから、 Introduction to Functional Programming using Haskell www.amazon.com/Introduction-Functional-Programming-using-Haskell/dp/0134843460/ "Using Haskell"じゃない前の版の方がその辺は内容が濃かった。 The Algebra of Programming www.amazon.com/Algebra-Programming-Prentice-Hall-International-Computer/dp/013507245X/ は関数合成、変形ドリルみたいな内容だった。 たしかparserを必要な機能を持つように変形する論文もあったはず。
922 名前:デフォルトの名無しさん mailto:sage [2008/12/14(日) 17:06:40 ] undoldって何かと思ったけど、unfoldの間違いだよね?
923 名前:920 mailto:sage [2008/12/14(日) 17:19:51 ] 間違いですw >>921 ありがとう Introduction〜とRealWorldHaskellをぽちってみました 下は高杉…
924 名前:デフォルトの名無しさん mailto:sage [2008/12/15(月) 17:13:13 ] yet another haskell tutorialの4.6で cfold' f z [] = z cfold' f z (x:xs) = f x z (\y -> cfold' f y xs) という継続fの与え方次第でfoldlにもfoldrにもなるものが出てきたんですが 普通のfoldlやfoldrの定義からこれを導きだす手順のようなものがあるなら知りたいです また「なんでも再帰」流に一つ引数増やして、最後にそれを必ず呼び出すようにして 末尾再帰の形に直していく…ってやり方で書こうとしてますがさっぱりです
925 名前:デフォルトの名無しさん mailto:sage [2008/12/16(火) 12:48:15 ] 面倒だからfactorialで書くと、 fac 0 = 1 fac n = n * fac (n-1) なのか fac n = fac (n-1) * n なのかってことだから、 fac n = ((n *) . fac) (n-1)あるいは、 fac n = ((* n) . fac) (n-1) fac n = (((\m ->(m *)) n) . fac) (n-1)あるいは、 fac n = (((\m ->(* m)) n) . fac) (n-1) fac0 f n = ((f n) . (fac0 f)) (n-1)で fac0 (\m ->(m *)) nあるいはfac0 (\m ->(* m)) n \m ->(m *)と\m ->(* m)は、 fac(n-1)を計算した後にすべき計算、つまり継続になっています。
926 名前:デフォルトの名無しさん mailto:sage [2008/12/16(火) 12:51:01 ] 要するにfoldってのは累積を計算しているのだから、 その累積演算を関数に独立させると、foldの性質上、継続的になるのです。 mapだとこうはなりません。
927 名前:デフォルトの名無しさん mailto:sage [2008/12/16(火) 22:40:24 ] >>926 ところがどっこい、この説明のすぐ後で、 「CPSを使ってmapとfilterを書け」なんて演習問題が出されてるわけですよ。 それを考えると、foldlの定義からcfold'へ持っていってあげたほうが 親切かもしれません。
928 名前:デフォルトの名無しさん mailto:sage [2008/12/16(火) 22:53:36 ] あっと、「この説明」ってのは 「yet another haskell tutorial の cfold' の説明」のことね。
929 名前:デフォルトの名無しさん mailto:sage [2008/12/16(火) 23:38:03 ] >>927 cfold'は、元のfold*の引数に渡す演算自体が継続的になるのに対して、 mapでは引数に渡す演算ではなくて、:が継続的になるわけです。 だからYAHTでは微妙に表現を変えています。 map f = foldr (\x -> ((f x) :)) [] ですから当たり前ですけども。
930 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 19:38:36 ] >>929 すまん、「継続的」という言葉の意味がさっぱり分からん。 CPSにしたときに最後に行われる計算、という意味なら、 foldlは「foldl」自体が継続的、 foldrは引数として渡す関数「f」が継続的ということになるので、 fold*で継続的となる関数が同じになるとは思えない。
931 名前:デフォルトの名無しさん [2008/12/21(日) 19:58:16 ] おそらく激しいFAQだとは思うのですが、日本語の扱いについて。 Charの仕様からして、 >>5 の「i. CharをUnicodeとして扱う」が筋と思いますが、 リテラルはともかく、IOでの変換のスタンダードな方法はもう固まってきてるでしょうか。 blog.kfish.org/2007/10/survey-haskell-unicode-support.html によると、 メジャーな方法が3つあるらしいですが、どれか、もしくはどれかがdefactoになっているでしょうか。 Haskell'でも使えるのがいいですが…。
932 名前:デフォルトの名無しさん mailto:sage [2008/12/21(日) 22:14:48 ] utf8-stringっぽいかな‥‥