1 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 20:28:13 ] 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/ ・2chの仕様により、行頭の半角スペースは表示されません。 コードをインデントしたいときは、代わりに または全角スペースを使うことができます。
29 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 20:59:21 ] 説明ってsequenceが何をするか分からんってこと? sequence [putStr "Hello", putChar ' ', putStrLn "world"] とかすれば"Hello world\n"と表示できたり、 sequence_ $ repeat (putStrLn "hoge") とすればhogeが無限に表示できたり。 実用例が知りたいってことならGoogle Code Searchでいくつか見つかる。 mapM(mapしてsequence)は日常的に使うけど、sequenceを単独で使うことはそれほど無い気がする。 リストモナドに適用して総当たりという使い方も一応ある。 Prelude> sequence [[1,2], [3,4,5], [6]] [[1,3,6],[1,4,6],[1,5,6],[2,3,6],[2,4,6],[2,5,6]]
30 名前:デフォルトの名無しさん [2007/11/02(金) 01:07:34 ] >>29 sequence自体が何をするのかはわかるんだけど… google code明日にでも漁ってみるよ 分からないのは、たとえばその例だと putStr "Hello world"で済むじゃんいらないじゃんみたいな リストモナドに総当たりうんぬんはすごく幸せそうに見えるわ
31 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 01:23:24 ] >putStr "Hello world"で済むじゃんいらないじゃんみたいな うん。だからsequenceの真価が発揮されるのはリストの内容や要素数が実行時まで決まらないときだ。 なんか人為的な例だけど、 g :: Int -> IO (Maybe (IO ()) という関数があるとする。これは何か動作を実行するんだけど、それは失敗するかもしれなくて、 そのときはNothingを返す。成功した場合は後で後始末をしなきゃいけない。そのために(Just 後始末)を返す。 gを0から9までを引数にして実行して、それが終わったら全部後始末をしたいとしよう。これはsequence_を使って do cleanups <- liftM catMaybes $ mapM g [0..9] sequence_ cleanups と書ける。
32 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 01:38:06 ] GHC 6.8.1がstableにupされてる ttp://www.haskell.org/ghc/dist/stable/dist/
33 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 20:17:45 ] >>31 むずかしーな… sequence_ 〜〜のほうはわかるけどgがどんな関数なのかわからん… 時間かけて考えてみる そして今度はStateモナドが意味わかんない件 あと>>=とかreturnも微妙によくわからない… ふつけるP.277の main = do g <- getStdGen let ns = take 3 (randoms g) -- print (ns :: [Int]) って>>=使った記法にどうやったら変形できるの? getStdGen >>= (\g -> take 3 (randoms g)) じゃダメなの?
34 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 20:46:19 ] >>33 getStdGenはIOモナドだけどtake 3 (randoms g)はモナドじゃないから return (take 3 (randoms g))にしないとだめ。 main = getStdGen >>= return . take 3 . randoms >>= (print :: [Int] -> IO ())
35 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 23:57:32 ] そっか! でも\gが勝手に型推論されていい感じになったりはしないのか? あと(print :: [Int] -> IO ()) もよくわからんから明日勉強してみるよ!
36 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 00:14:35 ] 質問です。 前スレで↓のような宣言が書かれていたのですが、 これはどのような実装で使うことができる構文なのでしょうか? type Hoge' = { h in Hoge | (one h) < (two h)}
37 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 00:16:45 ] >>28 sequenceはモナドができるまでのHaskellのIOに使われていたもので、 現在ではレガシーです。
38 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 04:20:37 ] >>36 その書き込みに対して「それはどういう方言?実装ある?」という 質問があったけどその後誰も反応しなかったところを見ると ガセだったじゃないのかな。
39 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 15:38:45 ] またhaskell.org落ちてやがる 管理どうなってんだ
40 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 22:27:26 ] GHC 6.8.1リリース haskell.org/ghc/download_ghc_681.html
41 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 02:47:40 ] マニュアルの日本語訳も早くこーい
42 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 21:43:44 ] >>41 お前が書くんだよ
43 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 09:02:10 ] HaskellってGPL?
44 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 10:39:43 ] GHCとかHugsは非GPL。
45 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 12:17:28 ] どうせコンパイラいじる気がないから何でもいい
46 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 20:22:54 ] ちょっとお前ら教えてくれよ >>33 の続きなんだけど @ genNRandom :: Int -> IO () genNRandom n = do g <- getStdGen let ns = take n (randoms g) putStr $ show (ns :: [Int]) A genNRandom :: Int -> String genNRandom n = do g <- getStdGen let ns = take n (randoms g) show (ns :: [Int]) B genNRandom :: Int -> [Int] genNRandom n = do g <- getStdGen take n (randoms g) @はコンパイル通るけどAとBがダメなのはなんでなんだぜ? で、 ttp://www.sampou.org/haskell/a-a-monads/html/laws.html#nowayout 読んでたらなんとなく分かった気がしたんだけど要するにIOモナドは1方向モナドで、値が取り出せないし、 IOモナド使ってる関数は返り値の型が絶対IO()とかになるから参照透明じゃないのが他の関数まで波及しないよって意味なのか? じゃMaybeとかStateとかは使っても参照透明なままなのか?
47 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 20:57:35 ] 2は型がInt -> IO Stringで、最後をreturn(show(ns::[Int]))にせないかん。 3は型がInt -> IO [Int] で、最後をreturn(take n (randoms g))にせないかん。
48 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 22:22:38 ] それ>>34 でも教えてもらったな… 俺わかってないな… (・´ω`・)ぅーん
49 名前:デフォルトの名無しさん [2007/11/06(火) 22:35:47 ] >>46 IOモナドを使った関数も参照透明だよ。 個人的には、IOモナドを「副作用を閉じ込める」と表現したり、 値を取り出せるかどうかを云々しても混乱するだけだと思う。 むしろ、IO aとaは全然別のものであるという認識を推奨。 実際、IO aの中にa型の値など入っていない。 この辺読んでみたらどうだろう。 ttp://www.ice.nuie.nagoya-u.ac.jp/~h003149b/lang/haskell_io.html
50 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 23:09:33 ] letのところは無視してdo構文の各行を最終的な型だけで見てやったら それぞれこんな感じになって、 1. do {r <- IO r; IO ()} 2. do {r <- IO r; String} 3. do {r <- IO r; [Int]} これを >>= を使った形にしたらこんな感じ。 1. IO r >>= (r -> IO ()) 2. IO r >>= (r -> String) 3. IO r >>= (r -> [Int]) (>>=) :: m a -> (a -> m b) -> m bだから >>=の前後は m a >>= (a -> m b) って状態になってないといけない。 1はちゃんとそれを満たしてるからOKだけど、 2はString = [Char] = [] Charで、IO ≠ []なのでNG。 3も同様にNG。
51 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 23:39:33 ] >>49 読んだ 少し分かったような分からないような…? YOUはIOモナドを使った関数も参照透明だよって言ってるけど 標準入力読んだときとか乱数生成したときとか同じ引数あげても同じ値が返ってくるとは 限らないじゃん それって困るんじゃないの? って思うの >>50 >>49 の説明と合わせたらちょっと分かったかも そーいえばリストもモナドなんだったっけ 例示してくれた1.2.3.の例はHaskellとして正しい文法なん? 言いたい意味はわかるけどそういう書き方があるの? 前スレ952が教えてくれたサイトやら見てみたけどわかんない…
52 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 00:05:04 ] >>51 randomRIO :: (Int, Int) -> IO Int というのを考えてみる。これは要するに与えられた範囲の乱数を生成する関数な訳だけど、 厳密に考えると、これは動作を返す関数で、同じ引数で呼ばれたら常に同じ動作を返す。 例えば、(0, 3)を与えて呼び出すと、常に「0以上3以下の乱数を生成する」という動作を返す。 この「動作」を実行した結果はもちろん毎回違うけど、それをHaskellプログラムが 受け取ることはないので、参照透過性には影響ない。 (この動作の結果を受け取って別のことをする、より大きな動作を作ることはできるけど) これは別に言葉遊びじゃなくて、実際、randomRIO (0, 3)が複数回出てくる巨大な式 f x = ... randomRIO (0, 3) >> ...... fmap (1-) $ randromRIO (0, 3) ... があったとして、これを機械的に一つにまとめて f x = let z = randomRIO (0, 3) in ... z >> ...... fmap (1-) $ z ... としても意味が変わらないことが保証される。これが参照透過性。
53 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 00:06:11 ] 文法として正しいわけねぇじゃん。あくまで説明用。
54 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 00:25:41 ] >>52 アクションやら動作うんぬんとかいうことかー 変数に束縛して使ったときに動作が実行されて〜〜みたいな? main = do rnd <- randomRIO(0,3) putStr $ show (rnd :: Int) とかすると束縛したときはアクションですけどshowに渡るときにはいつの間にか数字ですよみたいなごまかし方(?)なのか? ていうかghcでコンパイルしたあと実行すると処理が帰ってこないんだけどghciでmain呼ぶとちゃんと表示される罠 意味わかんね >>53 だってわかんなかったんだもん いぢわるー
55 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 00:44:46 ] >>54 do記法で rnd <- randomRIO (0, 3) と書くと、rndが束縛されるのは数値Intであって動作IO Intじゃない。 矢印の右辺と左辺は別物。というかこの行だけ取り出すのは無意味。 do式全体で、「randomRIO (0, 3)を実行し、その結果がrndならばputStr $ show rndを実行するという動作」と読む。 慣れるまではdo記法をほどいて randomRIO (0, 3) >>= (\rnd -> putStr $ show rnd) に戻して考えるようにした方が分かりやすいかもしれない。 俺の手元ではコンパイルしたのもちゃんと動いたよ。
56 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 00:57:31 ] >>55 ( ´3`)<よくわかんなーい 乱数を生成する動作を返す関数があって、その動作が実行されてモノホンの数値になる瞬間がある気がするんだけど気のせいなのか? ちなみに The Glorious Glasgow Haskell Compilation System, version 6.6.1 ghc test.hs --makeでコンパイルしてtest.exe実行→処理帰ってこない
57 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 01:41:54 ] >>56 いや、Haskellプログラムは最初から最後まで動作をこねくりまわしてるだけで、 いつ実行されるかという話はあまり関係ない。 「ジャガイモの皮を剥く」というレシピと「茹でる」というレシピから 「ジャガイモの皮を剥いて茹でる」というレシピを合成する、という次元のことをやってる。 この作業をするとき、実際にいつレシピに基づいて料理が行われるかを気にする必要はない。 実際には、プログラムを起動すると即座にmainが「実行」されはじめて、 それに必要な分だけ「評価」が起こる訳だけど。
58 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 07:08:36 ] なるほどー レシピは完成品を作っちゃくれないってか
59 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 11:47:38 ] こねくり回し方を想像できない人は素人
60 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 19:57:03 ] Haskellの素人なのか園論の素人なのか数学の素人なのかなんの素人なのかさえ分からない俺はキングオブ素人 今日もまたわからないことがいっぱいでした…
61 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 20:16:10 ] この場合は処理系の素人
62 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 20:17:56 ] ちなみに、園論ではなく圏論(けんろん:category theory)
63 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 20:25:13 ] その・さとしさんが提案
64 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 20:31:53 ] >>63 誰?
65 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 20:50:21 ] >>64 園諭を提案した人
66 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 23:04:52 ] ハスケルルでメシ食ってる人いんの?
67 名前:デフォルトの名無しさん mailto:sage [2007/11/09(金) 00:37:52 ] 本業でやってる人はおそらくいない。(研究者除く)
68 名前:デフォルトの名無しさん mailto:sage [2007/11/09(金) 03:04:27 ] カリーでメシ食ってるのならいる
69 名前:デフォルトの名無しさん mailto:sage [2007/11/09(金) 07:50:26 ] GHC 6.8.1でコンパイルし直しただけで本当にプログラムが二割高速化してワラタ それから-O2をつけた場合のコンパイル速度が六倍になったけど、これは-fasmがデフォになったおかげだな
70 名前:デフォルトの名無しさん mailto:sage [2007/11/09(金) 21:01:59 ] お前ら コマンドライン引数から複数のテキストファイル名を取得してその中身を標準出力に出力するプログラム書いてみてくれ IO [String]が…[]外れねぇよチクショウorz
71 名前:デフォルトの名無しさん mailto:sage [2007/11/09(金) 21:22:15 ] import System.Environment main = do args <- getArgs mapM_ dump args where dump file = do content <- readFile file putStr content こんなの?
72 名前:デフォルトの名無しさん mailto:sage [2007/11/09(金) 21:30:54 ] そんなの… 俺とてつもなく頭悪い気がしてきた('A`)
73 名前:デフォルトの名無しさん mailto:sage [2007/11/09(金) 23:45:24 ] >>71 のを短く書けばこんな感じ import System.Environment main = getArgs >>= mapM_ ((putStr =<<) . readFile)
74 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 01:57:22 ] >>71 のをArrowで書けばこんな感じ mapA :: ArrowChoice a => a b c -> a [b] [c] mapA f = arr listcase >>> arr (const []) ||| (f *** mapA f >>> arr (uncurry (:))) where listcase [] = Left () listcase (x:xs) = Right (x,xs) main :: IO () main = runKleisli (Kleisli (const getArgs) >>> mapA (Kleisli readFile) >>> arr concat >>> Kleisli putStr) () -- mapAみたいに便利な関数は早く標準ライブラリに入れてほしい
75 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 12:58:22 ] >>74 モナドと組み合わせると恐ろしく単純にかけるようになる main = getArgs >>= mapM_ (readFile >>> putStr)
76 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 13:01:01 ] >>75 Kleisliをつけたり外したりがいらないか?
77 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 13:27:49 ] まあ、>>>の正体は f >>> g = g . f だからなぁ。
78 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 17:30:40 ] arrowベースのIOってないもんかね
79 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 22:17:13 ] Haskellで開発会社をやりたいという夢を持つ自分はタダのバカですか?
80 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 22:20:08 ] 実行しようとしない点でバカです。
81 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 22:25:52 ] >>80 何こいつスゴいかっこいいんだけど
82 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 22:26:01 ] >>79 保守できないに100ルピー
83 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 11:03:25 ] 部下がpoint-free styleで1000行くらいのバグ入りコードを提出 という悪夢を見てしまった
84 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 13:55:48 ] >>83 現在適当な粒度の関数に分解する鶴を開発中です
85 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 13:57:05 ] >>79 無責任名誉会長は俺ね。
86 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 19:07:03 ] >>70 素直にλを残した方が分かりやすいわな。 main = getArgs >>= mapM_ (\a -> readFile a >>= putStr)
87 名前:79 mailto:sage [2007/11/11(日) 19:39:30 ] しかし、Haskellなどの関数型言語専門会社っていうのは憧れます。 自分はまだ初心者でチュートリアル勉強している段階ですけど、この世界が 広がったら素晴らしいなぁと本気で思ってますよ。 私の現在の妄想は、最近メジャーになってきたWebサービスの関数型版。 住所 -> GoogleMapAPI -> 天気予報 -> 天気マーク付き地図
88 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 19:53:47 ] バカっつーか、中学生臭い
89 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 19:59:51 ] >>87 それは俗に言う「マッシュアップ」というやつではないか? 関数型言語と関係なくそこら辺の奴でも作れるぞ。
90 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 20:11:17 ] そうだな ただのマッシュアップだな masuidriveのブログとか見るといいような気がするよ そして >>71-77 ,86の諸氏よありがとう よく理解できないから明日色々試してみるわ… Haskell挫折しそう… 書いてて楽なのは分かるんだけど…分かるんだけど…
91 名前:79 mailto:sage [2007/11/12(月) 07:08:04 ] いや、マッシュアップを関数型でやってるのを見たいんだけど。 もうあるの?
92 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 11:01:32 ] プロシンあたりで誰か発表してるかも〜 とか無責任に書いてみる
93 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 16:47:36 ] >>86 そこまで来たらやっぱりこう書きたくなる main = getArgs >>= mapM_ ((>>= putStr) . readFile)
94 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 16:56:09 ] 好みが分かれるもんだな 俺はラムダ抽象が嫌いなのでwhere節を使う
95 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 19:48:05 ] >>94 お前の好みはhaskellには不向きだな。
96 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 20:14:14 ] そうか?俺がHaskell好きな理由の一つがこれなんだが where節みたいにローカル変数を使った後に定義できる言語は他にはCleanくらいしか知らない それに嫌いって言っても使うことは結構ある。>>86 みたいな例なら迷わずwhereを使うってだけで
97 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 20:58:37 ] >>96 関数の内部で関数を定義できる言語はいくらでもある。rubyとか。
98 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 21:06:16 ] それは知ってる。でも関数を「使った後に定義」はできんだろ
99 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 21:18:00 ] 使った後に定義ってどういう意味?
100 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 21:19:56 ] >>99 ソースコード上で定義が参照よりも後に現れること f x = g -- ここでgを使う where g = 2 -- ここでgを定義
101 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 21:26:38 ] int main(char args[][]){ owata(); } void owata(){ writefln("\(^o^)/"); }
102 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 21:27:46 ] 使った後に定義してるわけじゃないけど、遅延評価が便利って言いたいわけね。
103 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 21:28:18 ] >>101 >>98 はローカル関数の話な、誤解させてすまん
104 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 21:30:21 ] >>102 なんというエスパー
105 名前:96 mailto:sage [2007/11/12(月) 21:32:27 ] >>102 遅延評価はあまり関係ないと思う。あくまでコード上に現れる順序の問題 極端な話、正格な言語で f x = y where y = 2 が f x = let y = 2 in y -- このletは正格 の構文糖なだけでも俺には十分
106 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 22:26:37 ] Lisp 系だったらその手の構文糖は作り放題だけどね。 実際、昔 ELisp でそんな感じの macro 自作して使ってたし。
107 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 23:36:21 ] はいはい自慢はいいですよ
108 名前:デフォルトの名無しさん [2007/11/13(火) 00:18:43 ] 興ざめするから自慢とか言わないでくれよ…
109 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 12:48:47 ] なら、自己満
110 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 19:37:02 ] 初心者です。 今、いろんなテキスト漁って勉強中ですが、モナドのところ見てて不思議に思いました。 これって、早晩知らなくてもHaskellが書けるようになったりするんじゃないのでしょうか。 今はまだ途上なので、透過参照を維持できるように云々と理論的な面が表に強く出て ますけど、近いうちに標準のAPIからは隠蔽されていくということはないですか?
111 名前:デフォルトの名無しさん [2007/11/13(火) 19:37:31 ] それなら良いわ
112 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 19:42:46 ] >>110 >>73 をモナドを使わずに書いてください
113 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 19:57:53 ] >>110 歴史的にはどうか知らんが、モナドは参照透過性のために仕方なくあるわけじゃなくて、 道具として積極的に使われてる。だからHaskellでモナドが使えなくなることは考えられない。 モナドを知らなくてもIOを書けると良い、という話なら、現状でもできると思う。
114 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 20:22:01 ] 質問です >>93 をみてこんなの↓つくってみたんだけど、 main :: IO () main = getArgs >>= mapM_ ((>>= putStrLn.conv).readFile) >> getCPUTime >>= print where conv :: String -> String conv = unlines.(map ((map toLower).(filter (/= '\"')))).lines 最初に与えたファイルパスのぶんが読まれないっぽいんよ c:\Users\aiueo> main < c:\a.txt c:\b.txt と入力すると、b.txtの中身とCPUTimeだけが表示されるんだよね エロい人なぜだか教えてください
115 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 20:27:40 ] >>110 モナドを使わないと、実用的なHaskellのプログラムは書けない。 モナドの理論的な側面を詳しく知らなくとも、モナドを使うことはできる。 結論: モナドの理論的な側面は今は無視して、モナドを使ってHaskellのプログラムを書けばよろし。 理論的なことは後から少しずつ覚えていけばよろし。
116 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 20:29:38 ] >>114 「<」これはリダイレクション
117 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 20:30:00 ] >>114 だってそれa.txtは標準入力に与えられてるもんよ c:\Users\aiueo> main c:\a.txt c:\b.txt こーやれ
118 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 20:39:55 ] >>116 ,117 ありがとう!
119 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 21:09:22 ] ちょっとお前ら聞きたいんだけどさ なんで>>86 みたく書くんだ? main = mapM_ (\a -> putStr =<< readFile a) =<< getArgs でよくね?モナド使わないときとモナド使うときで読む方向違うのってやりにくくね? なんか理由あんの?おせーておせーて
120 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 21:14:55 ] 俺も時々下から順に実行されるdoが欲しくなる
121 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 21:25:47 ] >>113 >>115 ありがとうございます。"モナド"という言い方がよくありませんでした。Maybeとか リストのモナドは仰るように積極的に使われていると自分も思いました。 ただ、IOモナドがよく分からんのですね。特にIORefとか。この手のものは、単に 透過参照性を維持するためのテクニックと見えてしまいます。
122 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 21:34:19 ] >>119 だったら>>75 が自然に見えてくるだろう
123 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 21:38:12 ] でも、>>75 はコンパイル通らんぞw
124 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 21:41:42 ] >>123 処理系とそのバージョンは? Control.Arrowをインポートしたかどうか。
125 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 21:48:31 ] いや、明らかに型が合わんだろ… readFile :: String -> IO String putStr :: String -> IO String (>>>) :: (Arrow a) => a b c -> a c d -> a b d instance Arrow (->)
126 名前:125 mailto:sage [2007/11/13(火) 21:49:19 ] 間違えた putStr :: String -> IO () ね
127 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 21:52:41 ] >>121 参照透過性を壊さないでIOを実現するに当たって、現状よりマシなインタフェースがあるってこと?
128 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 23:40:51 ] >>124 無理やりコンパイル通せばこうなるぞ。 main = getArgs >>= mapM_ (readFile >>> (>>= putStr)) Kleisli使うのは俺はパスw
129 名前:デフォルトの名無しさん [2007/11/14(水) 01:19:08 ] 2次関数が苦手だったから関数言語なんて滅びてほしい