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の仕様により、行頭の半角スペースは表示されません。 コードをインデントしたいときは、代わりに または全角スペースを使うことができます。
2 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 20:28:45 ] 関連書籍 ・Introduction to Functional Programming Using Haskell www.amazon.co.jp/exec/obidos/ASIN/0134843460/ ・Haskell: The Craft of Functional Programming www.amazon.co.jp/exec/obidos/ASIN/0201342758/ ・The Fun of Programming www.amazon.co.jp/exec/obidos/ASIN/1403907722/ ・The Haskell School of Expression: Learning Functional Programming Through Multimedia www.amazon.co.jp/exec/obidos/ASIN/0521644089/ ・入門Haskell item.rakuten.co.jp/book/1794880/ ・ふつうのHaskellプログラミング item.rakuten.co.jp/book/4052963/
3 名前:デフォルトの名無しさん [2007/10/30(火) 20:28:50 ] 2
4 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 20:29:36 ] 関連スレ ・関数型言語Part IV pc8.2ch.net/test/read.cgi/tech/1083649982/ ・【数学者】Haskellはクソ言語【オナニー】 pc8.2ch.net/test/read.cgi/tech/1128011645/ ・純粋関数型言語Concurent Clean pc8.2ch.net/test/read.cgi/tech/1075629340/ ・関数型言語ML(SML, OCaml, etc.), Part 4 pc8.2ch.net/test/read.cgi/tech/1133003340/ ・Lisp Scheme Part16 pc11.2ch.net/test/read.cgi/tech/1172404795/ ・【入門】CommonLispその2【質問よろず】 pc8.2ch.net/test/read.cgi/tech/1140012484/ ・Emacs Lisp 2 pc8.2ch.net/test/read.cgi/tech/1068467385/
5 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 20:30:11 ] ・日本語の扱いについて Haskell98によると、Charは一つのUnicode文字を表す(6.1.2)。 これに従って、比較的新しいHugsやGHC(6.4系を含む)ではCharは32ビット整数になっている。 ただし、どちらも入出力に際しての変換が完全でない。具体的には、 ・ソースコード中の文字列リテラル ・System.IOライブラリでの入出力 が問題になる。 1. GHC6.4.2以前 ソースコード・入出力ともLatin-1を仮定する。Latin-1ではバイト値と コードポイントが一致するので、入力時には外部エンコードの各バイトがそのままCharに 入り、出力時にはCharの下位8ビットのみが出力されるような実装になっている。 このため、あるエンコーディング(Latin-1とは限らない)の入力をgetLineで受け取り、 それをそのままputStrで表示すれば、入力時とおなじエンコードにおいて正しく表示される。 これを利用して、[Char]を、本来のコードポイントの列としてではなく、特定のエンコードの下での バイト列として使うことができる。ただし文字列リテラルについては、GHCはLatin-1として 不正な文字を受け付けないので、EUC-JPのような例外を除くと、単純にリテラルを使うことはできない。 2. GHC6.6 ソースコードにはUTF-8、入出力にはLatin-1を仮定する。このため、EUC-JPでリテラルを直に 書くことはできない。 (続く)
6 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 20:30:47 ] (続き) 3.最近のHugs(非WindowsかつCのwchar_tがUnicodeの環境、というかLinux) ソースコード・入出力ともロケールのエンコードを利用する。 4.最近のHugs(Windows) ソースコード・入出力ともLatin-1を仮定する。ただし文字列リテラルにShift-JISを使ってもエラーにならない。 5.最近のHugs(それ以外) 未調査。 ・結局どうするか。 規格どおりにCharにUnicodeを入れるか、Charを単なるバイトとして扱うかの二択。 i. CharをUnicodeとして扱う (3)以外の場合入出力で変換が必要。(2)または(3)以外の場合文字列リテラルでは 明示的なエスケープ(たとえば"\22234")が必要。 ii. Charをバイトとして扱う (3)ではファイルをバイナリモードで開くなどの対策が必要。(1)でEUC-JPを使う場合と(4) を除き文字列リテラルでは明示的なエスケープ(たとえば"\143\153")が必要。 lengthやisAlphaのような関数、およびwin32パッケージの関数(win32API)が正しく動作しない。
7 名前:1 mailto:sage [2007/10/30(火) 20:33:11 ] テンプレはここまで。 前スレが終わってからしばらく建ってなかったので建てました。 初めてスレ建てしたので、行き届かないところがあったらごめんなさい。
8 名前:デフォルトの名無しさん [2007/10/30(火) 21:15:53 ] 乙一
9 名前:デフォルトの名無しさん [2007/10/31(水) 01:00:13 ] 一乙
10 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 01:32:18 ] 4日くらい前にHaskell初めてふつけるは2回読んだんだけどモナドのとことかがよくわかんないレベルの俺が練習のためにcatコマンドの各オプションの関数作ってみた ttp://uproda11.2ch-library.com/src/1141095.hs.shtml PASS:mu であげてみたので、「この手続き脳が!」とか「貴様はなんもわかっちゃいねぇ!」とかってアドバイスしてくれると嬉しいです あとフリーポイントスタイルの関数定義で hogehoge = abc $ def $ ghi hogehoeg = abc.def.ghi ↑がダメで↓がOKなのが何故なのか理解できない .は関数合成用で$は部分適用用なの?Hoogleとかみてもよくわかんなかった
11 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 02:08:52 ] >>10 直した方がいいところはいろいろあるけどまずは簡単なところを一つ。 combinateStr = zipWith (++) Preludeモジュールに入っている関数を一通り読んでおくと勉強になるよ。
12 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 07:06:57 ] >>11 あんがとー読んでみる
13 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 10:20:02 ] abc $ def $ ghi は abc(def (ghi)) と書くのと同じなので、 ghiがdefの引数になってしまう。 一方abc . def . ghi は \ x -> abc(def(ghi x))
14 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 17:00:34 ] >>10 headとかdrop 1とか使うよりパターンマッチの方が楽だぜ groupEmptyLine :: [String] -> [String] groupEmptyLine ls = case ls of [] -> [] []:[]:rest -> groupEmptyLine ([]:rest) line:rest -> line : groupEmptyLine rest createLineNumber :: Int -> [String] -> [String] createLineNumber n ls = case ls of [] -> [] []:rest -> [] : createLineNumber n rest line:rest -> (fillSpace 6 n ++ ":" ++ line) : createLineNumber (n + 1) rest
15 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 18:08:02 ] createLineNumber n ls = snd $ mapAccumL f n ls where f n "" = (n, "") f n line = (n+1, fillSpace 6 n ++ ":" ++ line)
16 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 18:13:54 ] mapAccum*の引数順と渡す関数の戻り値の順序が覚えられねえ
17 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 20:22:23 ] >>13 よくわかんねー ためしに↓をコンパイルしてみたら怒られなかった件 …アレ? main = do cs <- getArgs putStr $ test2 $ unlines cs test1 = abc $ def $ ghi test2 = abc.def.ghi abc cs = cs def cs = cs ghi cs = cs >>14 かっけー! なるほどー 今日一日綺麗にかけねーなーって悩んでたのがバカみたいだ >>15 今日勉強してたんだけど foldr←何やってるかはわかるけど何が嬉しいかはわからない mapAccumL←意味がわからない だったんだぜ… Hoogleで見てみてもまず引数の型に何が書いてあるかもわかんなかったんだぜ… accってなんだ…
18 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 20:53:29 ] >>17 Hoogleもいいけど、こっちのリファレンスなら使用例ものってるよ www.zvon.org/other/haskell/Outputglobal/index.html
19 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 21:16:09 ] >>17 それはabc,def,ghiが全部a->a型だから通る。 例えばdef, ghiの型がInt -> Intだったらdef $ ghiってのは 引数がInt型の関数defにInt->Int型の引数ghiを突っ込むことになるので Int ≠ Int->Intってことで型エラーになる。
20 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 21:41:32 ] >>17 foldrは演算子を使ってリストを潰したいときに使う。 foldr (+) 0 [1,2,3,4] = 1+(2+(3+(4+0))) 他にも、 foldr (*) 1でリスト要素の積 foldr (&&) Trueでリスト要素のAND foldr max 0で0を下限とした最大要素 foldr union emptyで複数の集合の和集合 foldr (.) idで複数の関数の合成 など応用いっぱい。 accてのはただの型変数の名前で、aとかbとかと一緒。
21 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 22:43:13 ] >>18 今夜うちにきて妹をファックしていいぜ >>19 よくわからんからあとでよく考えてみる… >>20 なんか使いこなせば幸せになれる代物らしいことは分かった お前らありがとな またスレに話題がないときにでも構ってくれ ノ
22 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 23:29:45 ] >>17 mapAccumL のイメージ図 www.lab2.kuis.kyoto-u.ac.jp/~hanatani/tdiary/?date=20040715
23 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 08:01:37 ] >>20 どれもfoldrよりfoldr1のが楽そうだな
24 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 08:07:22 ] >>23 maxの例はそうだけど、それ以外は空リストでも問題なく扱えるfoldrの方が使いやすくないか?
25 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 08:10:09 ] >>24 なるほど。納得
26 名前:デフォルトの名無しさん [2007/11/01(木) 12:49:18 ] Haskellオワタ・・・ 所詮おもちゃ言語か 23 名前:デフォルトの名無しさん[sage] 投稿日:2007/11/01(木) 04:45:00 darcsのスケーラビリティは改善したか? 百メガ程度のソースで、2Gでもメモリ不足でコケてどうにもならなくて泣いた。 Haskell勉強中だから応援してはいるが、Haskellユーザ以外で使ってる奴いるのか? 25 名前:デフォルトの名無しさん[] 投稿日:2007/11/01(木) 05:12:27 >>23 あれはdarcsを位置から作り直さないと直りそうもないんだけどwww そこまでやる気あるのかな 28 名前:デフォルトの名無しさん[sage] 投稿日:2007/11/01(木) 12:47:17 >>23 それはdarcsではなくHaskellが悪い。 Haskellでは文字列のメモリ効率が悪すぎるから、あまり大きな文字列は扱えない。
27 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 13:25:07 ] オワタもなにも既出なんだが。 今頃気づいたのか?
28 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 20:13:54 ] 100MBのソースコンパイルってすげーなw 誰かsequenceの説明してくれないか? モナドがなんで便利そうなのかイメージ的にはわかったんだけど、なんでもいいけどなんかモナドをリストにして扱いたいのの具体例が思いつかね
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^)/"); }