1 名前:デフォルトの名無しさん mailto:sage [2013/01/21(月) 02:16:16.07 ] haskell.org ttp://www.haskell.org/ 日本語サイト ttp://www.sampou.org/cgi-bin/haskell.cgi ttp://www.shido.info/hs/ 過去ログ 関数型プログラミング言語Haskell Part1 ttp://pc.2ch.net/tech/kako/996/996131288.html Part2 ttp://pc2.2ch.net/test/read.cgi/tech/1013846140/ Part3 ttp://pc8.2ch.net/test/read.cgi/tech/1076418993/ Part4 ttp://pc8.2ch.net/test/read.cgi/tech/1140717775/ Part5 ttp://pc8.2ch.net/test/read.cgi/tech/1149263630/ Part6 ttp://pc11.2ch.net/test/read.cgi/tech/1162902266/ Part7 ttp://pc11.2ch.net/test/read.cgi/tech/1174211797/ Part8 ttp://pc11.2ch.net/test/read.cgi/tech/1193743693/ Part9 ttp://pc11.2ch.net/test/read.cgi/tech/1211010089/ Part10 ttp://pc12.2ch.net/test/read.cgi/tech/1231861873/ Part11 ttp://pc12.2ch.net/test/read.cgi/tech/1252382593/ Part12 ttp://hibari.2ch.net/test/read.cgi/tech/1272536128/ Part13 ttp://hibari.2ch.net/test/read.cgi/tech/1286706874/ Part14 ttp://hibari.2ch.net/test/read.cgi/tech/1299385928/ Part15 ttp://hibari.2ch.net/test/read.cgi/tech/1310199414/ Part16 ttp://toro.2ch.net/test/read.cgi/tech/1317958045/ Part17 ttp://toro.2ch.net/test/read.cgi/tech/1325510368/ Part18 ttp://toro.2ch.net/test/read.cgi/tech/1331902463/ Part19 ttp://toro.2ch.net/test/read.cgi/tech/1340760070/ Part20 ttp://toro.2ch.net/test/read.cgi/tech/1350428908/
46 名前:デフォルトの名無しさん mailto:sage [2013/02/06(水) 21:22:00.54 ] いちおうMaybeモナドすげEEEEEEってのはわかったつもりなんだけどさ モナド使うとなんでIOの副作用が分離されるの ? IOってところに環境のいろんなところが入っているから それをひきずり回しているからIOじゃないところは純粋であるって説明 どっかで読んだんだけど、具体的にはどうやってるの ? おしえてキボンヌ
47 名前:デフォルトの名無しさん [2013/02/06(水) 21:34:07.28 ] 指定したN番目の値を返す関数を作りたいのですが、上手く出来ません。 例えば、nthElementIs [1,2,3,4] 3 > 3見たいにしたいです。 isTrue :: Int -> Bool isTrue number | number > 0= False | otherwise= True nthElementIs :: [a] -> Int -> a nthElementIs list number = case (list) of [] -> case (number) of 0 -> [] otherwise -> error"okh" (x:[]) -> case (number) of 1 -> x otherwise -> error"z" (x:xs) -> case (number) of isTrue -> error"df" otherwise -> nthElementIs xs (number - 1)
48 名前:デフォルトの名無しさん mailto:sage [2013/02/06(水) 21:36:19.56 ] >>46 どうやってという疑問は比較的簡単で Stateモナドで状態を引きずり回しているのと同じように RealWorldを引きずり回しているのが IO
49 名前:デフォルトの名無しさん mailto:さげ [2013/02/06(水) 21:39:03.05 ] 無限リストなの?
50 名前:デフォルトの名無しさん mailto:sage [2013/02/06(水) 22:10:30.55 ] >>47 よーしパパそれほどHaskellerじゃないけど調子に乗って習作書いちゃうぞー nthElementIs :: [a] -> Int -> a nthElementIs (x:xs) num | num == 1 = x . | num > 1 = nthElementIs xs (num - 1) これじゃいかんの ? 不適なデータが来ても何とかするなら nthElementIs :: [a] -> Int -> Maybe a nthElementIs [] _ = Nothing nthElementIs (x:xs) num | num < 1 = Nothing . | num == 1 = Just x . | num > 1 = nthElementIs xs (num - 1) とか
51 名前:デフォルトの名無しさん [2013/02/06(水) 22:20:12.67 ] >>50 ありがとうございます。 コードがすっきり分かり易いです。 エラー書くよりはMaybe使った方がやはりいいのでしょうか? 後、ガードとcaseの使い分けはあるのでしょうか? 聞いてばっかですいません。
52 名前:デフォルトの名無しさん mailto:sage [2013/02/06(水) 22:23:54.11 ] >>50 はものすごく教科書的でいいね。 nthElementIs xs num = last . take num $ xs 俺ならこの質問されたらめんどくさいから一行でこう書くわ 駄目な大人になってしまった
53 名前:デフォルトの名無しさん mailto:sage [2013/02/06(水) 22:37:16.96 ] nthElementIs xs n = xs!!(n-1)
54 名前:デフォルトの名無しさん mailto:sage [2013/02/06(水) 22:41:13.31 ] >>53 でFA これ以外の正解はない
55 名前:デフォルトの名無しさん mailto:sage [2013/02/06(水) 22:46:36.68 ] 明らかに学習目的なのに既存の関数を使って正解って… あとインデックスは0から開始するように習慣づけるべきだと誰も指摘しないことに驚いた
56 名前:デフォルトの名無しさん mailto:sage [2013/02/06(水) 22:52:17.68 ] >>46 分離したというけど、無関係ではないよね IOの中では関数を適用できるが、関数の中ではIOを実行できない、という関係 コールバック関数を自分でコールできないみたいな状況に似ている
57 名前:デフォルトの名無しさん mailto:sage [2013/02/06(水) 22:56:07.24 ] 既存の関数使わないでどう答えろと (==)も(<)も(>)も(!!)も、全部既存の関数だぞ
58 名前:デフォルトの名無しさん mailto:sage [2013/02/06(水) 23:20:28.47 ] monadだから分離されているというべきなのか。 IOの型修飾を外すには、(>>=)するしか無いから分離されているというか、、、
59 名前:50 mailto:sage [2013/02/06(水) 23:51:46.77 ] >>51 > エラー書くよりはMaybe使った方がやはりいいのでしょうか? > 後、ガードとcaseの使い分けはあるのでしょうか? すまん。自分も習いはじめでよくわからんとです。 >>52 教科書読んだばかりですから !! 一流のHaskellerになると関数合成ばしばし使うのですね。 自分、関数合成にまだ発想が行きません。 便乗質問ですが、ピリオドとダラーの使い分けなんですけど、 nthElementIs xs num = last . take num $ xs も nthElementIs xs num = last $ take num $ xs も nthElementIs xs num = last $ take num xs も結果は同じなのですがどう使い分けてます ? 本来なら(引数の順番さ000え逆だったら、nthElementIs num xsだったら) nthElementIs num = last . take num って書きたかったのでしょうけど >>55 > あとインデックスは0から開始するように習慣づけるべきだと誰も指摘しないことに驚いた そうしなければいけない何らかの事情があるのかと思ってた ((!!)を使うといけないのもエラー処理のためとか今後の拡張とかの理由かと思ってた)
60 名前:デフォルトの名無しさん mailto:sage [2013/02/06(水) 23:55:00.06 ] >>57 「既存の(ほぼ答えそのものの)関数を使って…」って書いたら満足だったか? ていうか、よく見たら思った以上に酷い回答ばっかだった まず、「is」が付く名前は慣習的にBoolを返すものだから、「nthElement」か単に「nth」とすべき。 >>52 はありえない >>50 は (nthElement [] n) がNothingを返すのはいいが、 (nthElement [1,2,3,4] -1) などは明らかにプログラミングエラーなのだからエラーにするべき。 (他の言語なら最後の要素を返すのも考えられるが) そうしないと潜在的なバグがコードに紛れ込み、かえって品質を落とすことになる。 入門書の最初の方に出てくるような例なんだから、これくらいまともに回答してくれよ
61 名前:デフォルトの名無しさん mailto:sage [2013/02/07(木) 00:37:35.34 ] 人に文句言ってばかりで自分では何もしないカスがいるみたいだから、 俺が代わりにPreludeに載ってる!!の例から丸写ししてやる。 nthElement :: [a] -> Int -> a nthElement xs n | n < 1 = error "nthElement: negative index" nthElement [] _ = error "nthElement: index too large" nthElement (x:_) 1 = x nthElement (_:xs) n = nthElement xs (n - 1)
62 名前:デフォルトの名無しさん mailto:sage [2013/02/07(木) 00:52:21.07 ] 丸写しして気づいたけど、2chでの回答としては>>53 が一番の正解で間違いないね ほぼ答えそのものの関数があるならそれを示せばいいだけだ。わざわざ転記する必要ねーじゃん
63 名前:デフォルトの名無しさん mailto:sage [2013/02/07(木) 01:08:02.48 ] >>61 酷いと言われて悔しかったのはわかるが、実際にいちばんまともなコメントをしているのは自分だと思うぞ。 名前から「Is」を削ったのは納得したからじゃないの? (インデックスをわざわざ1から開始にするのは意味がわからないが…) >>62 それなら答えは(!!)を使えということだろ。 あるいはソースへのリンクを貼るか www.haskell.org/ghc/docs/latest/html/libraries/base-4.6.0.1/src/GHC-List.html#%21%21
64 名前:デフォルトの名無しさん mailto:sage [2013/02/07(木) 01:17:45.78 ] 病院池
65 名前:デフォルトの名無しさん mailto:sage [2013/02/07(木) 01:27:36.33 ] >実際にいちばんまともなコメントをしているのは自分だと思う 実際に一番まともなコメントは>>63 以外にないと思うぞ。マジで。 名前は突っ込まれたから変えたけど正直問題の本質と関係ないからどうでもいいし >インデックスをわざわざ1から開始にするのは意味がわからない 問題読み直したら? >それなら答えは(!!)を使えということだろ。 だからそれが>>63 で既出だって話。ぐだぐだ書いてる俺らより余程簡潔にまとめてるし、 ソースのリンクなんか貼らなくてもPreludeのソースなんてド素人でも見つけられる。
66 名前:デフォルトの名無しさん mailto:sage [2013/02/07(木) 01:28:48.39 ] 安価ミス。>>63 じゃなくて>>53 ね ×実際に一番まともなコメントは>>63 以外にないと思うぞ。 ○実際に一番まともなコメントは>>53 以外にないと思うぞ。 ×だからそれが>>63 で既出だって話。ぐだぐだ書いてる俺らより余程簡潔にまとめてるし、 ○だからそれが>>53 で既出だって話。ぐだぐだ書いてる俺らより余程簡潔にまとめてるし、
67 名前:デフォルトの名無しさん mailto:sage [2013/02/07(木) 01:31:57.55 ] >>62 あなたがそれを一番の正解と判断するに至った価値基準は? それはあなた以外の人も持っていて当然のもの? それ以外の価値基準が存在しうることは理解してる?
68 名前:デフォルトの名無しさん mailto:sage [2013/02/07(木) 06:04:09.76 ] なんかここ怖い
69 名前:デフォルトの名無しさん mailto:sage [2013/02/07(木) 07:11:57.30 ] 基地外隔離スレだから仕方ない
70 名前:デフォルトの名無しさん mailto:sage [2013/02/07(木) 07:26:24.38 ] >>65 ,66 なんでそんなに切れてるわけ? >>47 を見れば初学者なのは一目瞭然なんだから、インデックスは0から始めるものだと教えてやるのは当然だし、 どう考えても争うような本質的な問題じゃないだろ? > ソースのリンクなんか貼らなくてもPreludeのソースなんてド素人でも見つけられる。 リンクを貼るの難しそうだしね。無理言って悪かったよ。
71 名前:デフォルトの名無しさん mailto:sage [2013/02/07(木) 07:26:39.08 ] Haskell怖いです(震え声)
72 名前:デフォルトの名無しさん mailto:sage [2013/02/07(木) 07:30:47.90 ] Haskellは怖くないよ >>47 とかたぶんFizzBuzz並に簡単な問題 それさえもできない人が何故か回答してるからおかしくなってるだけで
73 名前:デフォルトの名無しさん mailto:sage [2013/02/07(木) 07:55:12.22 ] nth elementの取り出しなんて、preludeのソース詠めばいいだろ
74 名前:デフォルトの名無しさん mailto:sage [2013/02/07(木) 08:30:01.16 ] どうみても頭がおかしいのは>>60 ひとり
75 名前:デフォルトの名無しさん mailto:sage [2013/02/07(木) 10:25:36.22 ] 入門書読んだ後は、!!とか自作して遊んでたな。。。(遠い目)
76 名前:デフォルトの名無しさん mailto:sage [2013/02/07(木) 18:35:12.00 ] プログラミングhaskell 8章まで来たけど、いよいよ全く意味がわからなくなって挫折しそうボスケテ!
77 名前:デフォルトの名無しさん mailto:sage [2013/02/07(木) 19:13:34.93 ] 8章は載ってるコードじゃ動かないし、その後の章の知識が必要だから初見で理解するのはたぶん無理だろう 理解できると一番面白い章だけど、最初は適当に読み流した方がいい
78 名前:デフォルトの名無しさん mailto:sage [2013/02/07(木) 20:39:42.42 ] 8章から難易度がスコーンと上がるからな すごいHの方に浮気するのもアリだと思う
79 名前:デフォルトの名無しさん mailto:sage [2013/02/07(木) 21:16:21.92 ] 個人的にはすごいHaskellの方が難しいと思う とくに序盤は
80 名前:デフォルトの名無しさん mailto:sage [2013/02/08(金) 01:55:53.33 ] RWHで挫折してまたRWHに戻ってくるまでが勉強です
81 名前:デフォルトの名無しさん [2013/02/08(金) 13:22:59.19 ] dammy
82 名前:デフォルトの名無しさん mailto:sage [2013/02/09(土) 12:25:40.88 ] >>77 8章はPreludeのdo,returnとかが邪魔してコード通り動かないよなw とりあえずdo表記を使わず、Preludeにある関数は名前を変えて なんとか練習問題まで終わらせたけど・・・。 9章の電卓も期待した動きと違う。主に遅延評価のせいだと思うけど。 入力した式が評価されるまでputStrの実行も遅延させられるみたいで、 電卓のテンキー(飾り)が表示されない・・・。 俺は練習問題に関してはここで心が折れたw 本文は、10章まで読んだけど、11章からは応用問題みたいだから 後でいいやと読むのを止めたw
83 名前:デフォルトの名無しさん mailto:sage [2013/02/09(土) 18:22:47.83 ] Haskellの最初の挫折ポイントはモナド 次の挫折ポイントが値の直接変更はSTモナド内で引きこもってやるということ 次の挫折ポイントがモナド変換
84 名前:デフォルトの名無しさん mailto:sage [2013/02/09(土) 19:15:19.99 ] モナドって、"最初の"挫折ポイントか? 私は、まだモナド山に入山してさえいない。その前でちょっと挫折気味。 今、プログラミングHaskell 13章を読んでいる最中。 すごいHaskellはアダプティブファンクターのところで止まっている。 プログラミングHaskell を読み終わったら、すごいHaskellのアダプティブファンクター 〜モナドのところに進んでみる。
85 名前:デフォルトの名無しさん mailto:sage [2013/02/09(土) 19:19:40.65 ] adaptive functor!
86 名前:デフォルトの名無しさん mailto:sage [2013/02/09(土) 20:58:26.45 ] >アダプティブファンクター 挫折した感がものすごく良く伝わってくる
87 名前:デフォルトの名無しさん mailto:sage [2013/02/09(土) 21:32:25.92 ] 挫折ポイントはいっぱいある。 型クラス、型構築子、データ構築子などの独特な型の世界が 行く手を阻んでいる。 ついでに型でエラーが出まくって慣れないと 何のエラーかよくわからんのがなぁ。