1 名前:デフォルトの名無しさん mailto:sage [2017/01/15(日) 23:43:54.28 ID:Vh4eztBk.net] 関数型プログラミング言語 Haskell について語るスレです。 haskell.org (公式サイト) www.haskell.org/ 前スレ 関数型プログラミング言語Haskell Part28 echo.2ch.net/test/read.cgi/tech/1428597032/
651 名前:デフォルトの名無しさん [2017/06/12(月) 02:47:23.94 ID:q+c9m0UT.net] >>638 文字列型の中に文字列のリスト受け取って文字列を返す関数型が混じってる。
652 名前:デフォルトの名無しさん mailto:sage [2017/06/12(月) 09:44:54.21 ID:4tNZZp5I.net] >>644 それは違う。関数型が混じってるんじゃない。 >>642 ["a", "b", ["c", "d"]] = "a" : ("b" : ["c", "d"]) = "a" : ("b" : ("c" : "d")) = ["a", "b", "c", "d"] じゃないの?
653 名前:デフォルトの名無しさん mailto:645 [2017/06/12(月) 09:53:23.55 ID:4tNZZp5I.net] >>642 自己解決しますたw nilをきちんと入れてなかったみたい。
654 名前:デフォルトの名無しさん [2017/06/12(月) 17:07:14.08 ID:uTHinYqc.net] >>645 関数自体も値なのだが。。。 仮に返り値だとしても、文字列のリストにさらに文字列のリストが入ってるので型が合わない。 ["a","b",["c","d"]] ="a":"b":["c","d"]:[] --["c","d"]が一つの値なので、文字列じゃない!!とエラーになる。
655 名前:デフォルトの名無しさん mailto:sage [2017/06/12(月) 17:22:26.96 ID:pxvA8Fxv.net] なんでここでnilの話になるんですか?
656 名前:デフォルトの名無しさん mailto:sage [2017/06/12(月) 18:54:07.23 ID:rXVGv3m5.net] どうしてもできないときは、それはする価値がないのだ = 何かをしたくて、その手段としてそれをしようとしているが、実は何かはそれでなく別の方法でより自然に実現できることが多い。無理矢理その手段を開発する価値が本当にあるのか、もう一度考えてみよう
657 名前:デフォルトの名無しさん mailto:sage [2017/06/12(月) 20:01:13.71 ID:4tiz7p+p.net] GHCi で ["aa", "bb", ["cc", "dd"]] を評価してみれば一発だろうに • Couldn't match expected type ‘Char’ with actual type ‘[Char]’ • In the expression: "cc" In the expression: ["cc", "dd"] In the expression: ["aa", "bb", ["cc", "dd"]]
658 名前:デフォルトの名無しさん mailto:sage [2017/06/12(月) 21:30:08.56 ID:4tNZZp5I.net] >>647 > ["a","b",["c","d"]] > = "a":"b":["c","d"]:[] --["c","d"]が一つの値なので、文字列じゃない!!とエラーになる。 文字列または文字列のリストからなるリストというのはあり得るでしょう? その場合ならエラーではないはず >>649 > どうしてもできないときは、それはする価値がないのだ いまの場合、どうしてもできない証明はどうするんだろう? >>650 > GHCi で ["aa", "bb", ["cc", "dd"]] を評価してみれば一発だろうに それだけではその評価が本当に正しいかどうかが分からない
659 名前:デフォルトの名無しさん mailto:sage [2017/06/12(月) 22:36:06.43 ID:ejDn/VSN.net] >>651 > 文字列または文字列のリストからなるリストというのはあり得るでしょう? 文字列というのが String 型を指していて、文字列のリストというのが [String] 型を指しているのであれば、 文字列または文字列のリストからなるリストという型は「あり得ません」。 なぜなら、Haskell には「型A または 型B」という型は存在しないからです。 (data T = D String | E [String] の型は T であって、D や E ではない) > いまの場合、どうしてもできない証明はどうするんだろう? なぜ「証明」を求めるのでしょうか。 Haskell だとこれはできないよと言われ、簡単な理由を説明された時、 あなたはいつもその証明を求めるのですか。 今回の問題に限って求めているのであれば、その理由を説明してください。 理由によっては、あなたが納得できる証明以外の説明ができるかもしれません。 というのも、できないことの証明を本当にしようとすると、かなり難しいからです。 きっと構文規則や意味論にまで話が及びます。 そんな証明できる人は稀ですし、できる能力があっても、したくないでしょう。 > それだけではその評価が本当に正しいかどうかが分からない あなたの場合、「正しい」とは何を意味するのでしょうか。 >>650 が言っているのはきっと、GHCi で試してみれば「構文エラーであることが分かる」、 ということだと思いますよ。 それが正しいのか分からないというのは、GHC は信用できないということですか。
660 名前:デフォルトの名無しさん mailto:sage [2017/06/12(月) 22:39:18.30 ID:4tiz7p+p.net] >>651 https://paiza.io/projects/TpKm5_4fBEc7_YoKQIeKJQ こういうのがお望み? いずれにせよ List のデータコンストラクタ(:)を持ち出した >>633 は救済できんが。
661 名前:デフォルトの名無しさん mailto:sage [2017/06/12(月) 22:48:23.36 ID:cqbaGfvU.net] もしかして本当に欲しかったもの: [["aa"], ["bb"], ["cc", "dd"]]
662 名前:デフォルトの名無しさん mailto:sage [2017/06/12(月) 22:49:39.74 ID:4tiz7p+p.net] https://paiza.io/projects/4geVOsfwAnMedzLfkbEDpw こっちのほうがパラメータ多相でいいか。
663 名前:デフォルトの名無しさん mailto:sage [2017/06/12(月) 22:58:41.14 ID:4tiz7p+p.net] ちなみに、自分自身を要素の型とするかのような「ネストしたリスト」のようなデータ構造(というかinfnite typeのまがいもの)自体はときどき使いたくなるので簡単なライブラリを書いたことはある。そういやOCamlは オプショナルだが infnite type 扱えるんだったっけ??
664 名前:デフォルトの名無しさん mailto:sage [2017/06/12(月) 23:23:51.05 ID:4tNZZp5I.net] >>652 > なぜなら、Haskell には「型A または 型B」という型は存在しないからです。 「今のHaskell」には存在しないということね? こっちは今のではなく本来のに興味があるので。 > Haskell だとこれはできないよと言われ、簡単な理由を説明された時、 > あなたはいつもその証明を求めるのですか。 簡単な理由でよいのだが、「今そうなってるから」は興味がない > あなたの場合、「正しい」とは何を意味するのでしょうか。 > >>650 が言っているのはきっと、GHCi で試してみれば「構文エラーであることが分かる」、 > ということだと思いますよ。 さっきも言ったが、「今そうなってる」というのは 「正しい」とは異なる
665 名前:デフォルトの名無しさん mailto:sage [2017/06/12(月) 23:32:25.99 .net] 方法が存在しないことの証明って悪魔の証明でないの? できると主張する側ができることを証明しないとダメだよ 痴漢の言いがかりをつけられて、『痴漢していないことを証明しない限り有罪な』って裁判官に言われて納得できる?
666 名前:デフォルトの名無しさん mailto:sage [2017/06/12(月) 23:39:48.75 ID:4tiz7p+p.net] >>657 はできるという根拠をコードで示せばいい。 Haskell 2010 に従ったコードで、しかしGHCが不当にも 型検査で排除するというような、そういうコードを示せば 話はたちまちに解決する
667 名前:デフォルトの名無しさん mailto:sage [2017/06/12(月) 23:42:32.96 ID:4tiz7p+p.net] [“aa”, [“bb”,”cc”]] について Haskell2010 の構文規則をを充足するような Haskellの型をつけてくれればいい
668 名前:デフォルトの名無しさん mailto:sage [2017/06/12(月) 23:43:46.21 ID:ejDn/VSN.net] >>657 みんな、特に断りがなければ今のHaskellについて質問したり語ったりしています。 なので、そうでなければ、初めにちゃんと断っておかないと、話が合わなくなります。 また、本来のHaskellとは何かも説明しておかないと、これまた話が合いません。 私は今のところ、今のHaskellでアプリを作ることに興味が向いているので、 そうではない議論からは抜けさせてもらいます。 >>658 方法の存在を仮定した場合に矛盾がおきることを示すことで、方法の非存在を示すやり方もあります。 数学(厳密な論理)の舞台に上げられるテーマであれば友好的な手です。 (面倒かどうかは別にして)
669 名前:デフォルトの名無しさん mailto:sage [2017/06/12(月) 23:48:33.05 ID:ejDn/VSN.net] >>661 うぁ、恥ずかしい、友好的な手って何だよ。 有効な手、ね。 >>659 彼、今のHaskellには興味ないそうですよ。
670 名前:デフォルトの名無しさん mailto:sage [2017/06/12(月) 23:48:35.55 ID:PpCA4OTT.net] 定義の証明をしろってことか 1の次の数は2であることを証明しろ的な つまり1=2は間違いとは言えないのだ
671 名前:デフォルトの名無しさん mailto:sage [2017/06/12(月) 23:59:06.10 ID:4tiz7p+p.net] >>663 >1の次の数は2であることを証明しろ的な >つまり1=2は間違いとは言えないのだ Succ 1 = 2 とか普通にPAで証明できるけど……
672 名前:デフォルトの名無しさん mailto:sage [2017/06/13(火) 00:09:20.22 ID:kWBme6H8.net] 本来のHaskellってなんですか
673 名前:デフォルトの名無しさん [2017/06/13(火) 00:57:22.00 ID:12SNvyK/.net] LISPベースのリスト
674 名前:デフォルトの名無しさん [2017/06/13(火) 11:30:18.72 ID:OES2L0YQ.net] >>651 それぞれのリストはあるけど、両方の型を持ったリストはない。 リストがいっぺんに受け取れる型は一つだけ。 ghciで拒否られたらそれまでじゃね? 何か作りたいわけじゃないって事? 下で将来のHaskellとか語ってるっぽいけど、今作れないでいつ作るの。 >>645 見るに最終的に欲しいのは ["a","b","c","d"] だろ? f ["a","b"] ["c","d"] = ["a","b"] ++ ["c","d"] = ["a"] ++ "b":["c","d"] = [] ++ "a":"b":["c","d"] = ["a","b","c","d"] じゃあダメなのか? 手段にこだわるより、目的果たす事考えようぜ。
675 名前:デフォルトの名無しさん mailto:sage [2017/06/13(火) 12:23:55.30 ID:JgnP6kSF.net] >>658 > 方法が存在しないことの証明って悪魔の証明でないの? そんなことないよ。不可能性の証明なんて数学では普通にあるでしょ >>661 > 特に断りがなければ今のHaskellについて質問したり語ったりしています。 スレタイは「今の」とはなっていない。「今の」「Haskell」に限るとつまらない 「関数型プログラミング言語」 の方がおもしろい。ここは「関数型プログラミング言語」がテーマと認識している。(俺はね) 「今の」「Haskell」は単にその一つ > また、本来のHaskellとは何かも説明しておかないと、これまた話が合いません。 本来の関数型プログラミング言語程度の意味。それはみんな意識してるでしょ? >>667 > それぞれのリストはあるけど、両方の型を持ったリストはない。 それは今のHaskellについた制限のようなものでしょ? > f ["a","b"] ["c","d"] > = ["a","b"] ++ ["c","d"] > = ["a"] ++ "b":["c","d"] > = [] ++ "a":"b":["c","d"] > = ["a","b","c","d"] > > じゃあダメなのか? それではもとの問題と違うし、スマンが興味わかんわ
676 名前:デフォルトの名無しさん [2017/06/13(火) 13:10:39.07 ID:s+JNd9SI.net] >>668 将来も今も["a","b","c","d"]は[String]って型で表現できるけど、 ["a","b",f ["c","d"]]はどういう型で表現するのさ? こう表現出来るってのが無いと、ただ単に型に対する意識が低いだけのお馬鹿さんだよ?
677 名前:デフォルトの名無しさん [2017/06/13(火) 13:17:22.94 ID:s+JNd9SI.net] 大体、複数に型を纏めるんならタプル使えよ。 (["a","b"], f ["c","d"]) fが部分適用してない、値を返す関数なら結果の型が入るし、部分適用で関数としてタプルに入ってるなら何か受け取って何か返す関数の型がタプルにに入る。
678 名前:デフォルトの名無しさん mailto:sage [2017/06/13(火) 14:08:02.45 ID:pIEcxV3Y.net] nilわすれてるってのはさ、 [a, b, c, d] と a : b : c : d : [] が等価ってことでさ、 この末尾の:[]を忘れたらあかんってことじゃないの?
679 名前:デフォルトの名無しさん mailto:sage [2017/06/13(火) 14:26:42.82 ID:JgnP6kSF.net] >>669 そこのfはどういう関数型という想定?
680 名前:デフォルトの名無しさん mailto:sage [2017/06/13(火) 15:33:15.95 ID:kWBme6H8.net] 自分の間違いを認められず引くに引けなくなってるだけなんじゃないの
681 名前:デフォルトの名無しさん [2017/06/13(火) 18:11:35.28 ID:XoC5HvTL.net] >>672 >>668 に聞いてくれ。 そもそもどんな型でも文字列が返ってくる以外は入れられない。 f = concat ["a","b",f ["c","d"]] =["a","b","cd"] --これは>>668 のやりたいことでは無い。 こう言うの以外は現行で受付られないが、それ打破するリストの型表現が存在出来るなら、将来実装されるかもな。
682 名前:デフォルトの名無しさん mailto:sage [2017/06/13(火) 18:19:50.97 ID:pvAx0DQv.net] fは引数でもない外側のリストを無理やり拡張するのか……おぞましいな そんな実装されたらHaskell見限るわ
683 名前:デフォルトの名無しさん [2017/06/13(火) 18:35:46.29 ID:XoC5HvTL.net] だよな。 だからこそmapとかの関数作りやすいのに、そんな変な機能将来に渡って欲しいとは思わん。 入力->出力が素直だからこその関数プログラミングだってのに。 欲しい最終データが手に入れば良いのに、>>668 は手段と目的が逆転してんだよ。
684 名前:デフォルトの名無しさん mailto:sage [2017/06/13(火) 19:30:15.82 .net] どうしてもそれができないときは、本当にそれが必要不可欠なのか、もう一度よく考えてみよう
685 名前:デフォルトの名無しさん mailto:sage [2017/06/13(火) 21:22:18.24 ID:JgnP6kSF.net] >>669 > ["a","b",f ["c","d"]]はどういう型で表現するのさ? 関数fの型によるけどその出力がStringなら["a","b",f ["c","d"]] の型はもちろん[String]だね。 >>674 > そもそもどんな型でも文字列が返ってくる以外は入れられない。 結局、今のHaskellでは、["a", "b", ["c", "d"]] のような表現はできないと言ってるだけね? 関数型言語としてなぜそんな表現力を制限するのか分からん。どういう場合に使いたくなるかは知らんが。 >>676 > 入力->出力が素直だからこその関数プログラミングだってのに。 入力->出力が素直ってどういうこと? 自然変換のことじゃないよね?www 関数プログラミングは入力->出力になってればそれで十分だと思うが >>68 > ["aa", "bb", f ["cc", "dd"] ] = > ["aa", "bb", "cc", "dd"] > となるような関数fはどのように書けるでしょうか 結局もとのこの問題について、“一般の関数型言語”でのfの不可能性をだれも論証できないのかな? (要点さえ分かれば簡略でよいが)
686 名前:デフォルトの名無しさん mailto:sage [2017/06/13(火) 21:34:21.04 ID:BDZwTNDo.net] 型は単に「欲しい最終データが手に入ればよい」っていうよりは ある種の性質がコンパイル時に保証されてるってのがありがたい エンバグも検出しやすい 他の言語だと[Any] なListがあったりするけど(例えばScala) よくあんなの使うなーって思う >>678 > ["aa", "bb", f ["cc", "dd"] ] = > ["aa", "bb", "cc", "dd"] これはリテラルでこう書いてる以上、 fがどんな値を返そうと 左辺は要素が3のリストで右辺は要素が4のリストだから パターンマッチに成功するわけない
687 名前:デフォルトの名無しさん mailto:sage [2017/06/13(火) 21:39:23.64 ID:Qd0f53fz.net] >>678 ここにいる人たちは俺もあんたも含めて誰も証明できないことは、 いままでの一連のレスですでに分かっているはず。 あんたの投げかけた議論に誰もあんたの望むようには応えられないことも分かっただろ。 あんたの話はhaskellという小さな枠組みを遥かに越えてるんだよ。 いい加減スレチだってことに気づこうよ。 頼むから、一般の関数型言語における可能性や証明の議論は大学でもっと頭のいいヤツらとしてくれ。
688 名前:デフォルトの名無しさん mailto:sage [2017/06/13(火) 21:43:22.47 ID:RNIsqaqt.net] 中途半端な数学屋なんて全然怖くないのに 数学系と聞いて逃げるHaskellプログラマ大杉
689 名前:デフォルトの名無しさん mailto:sage [2017/06/13(火) 23:14:18.88 ID:qhE8awpR.net] とりあえずこんなもんでどう? https://ideone.com/wMOghJ
690 名前:デフォルトの名無しさん mailto:sage [2017/06/13(火) 23:32:43.89 ID:qhE8awpR.net] どうせならFoldableにすりゃよかったな ま、いっか
691 名前:デフォルトの名無しさん mailto:sage [2017/06/13(火) 23:59:28.85 ID:pYqK9vAB.net] Haskell の枠組みにとらわれないなら、自分専用関数型言語の 文字列リテラルを 682 が示した Nest みたいに自由に定義すればいいもんな これで解決だ
692 名前:デフォルトの名無しさん mailto:sage [2017/06/14(水) 00:01:03.56 ID:ZT/uD64c.net] ideoneやpaiza.ioのようにhaskellコードのコンパイルと実行を同時にしてくれるようなローカルアプリはありますか? 補完とかはなくてもいいですし、exeも生成しなくていいのですが
693 名前:デフォルトの名無しさん mailto:sage [2017/06/14(水) 00:24:00.03 ID:VydZF3sS.net] ["aa","bb",f["cc","dd"]]=["aa","bb","cc","dd"]なるfが存在しないことは、 チャーチ・ロッサー性で説明できる。 チャーチ・ロッサー性は、簡単に言うと、計算の順番を変えても 最終的な計算結果が変わることが無いという性質。 もし上記のようなfがあるとすると、以下の2つの式の計算結果が同じでなければならない。 なぜなら、これら2つの式は、一番内側のfを先に計算するかどうかの違いしかないから。 null(tail(tail(tail ["aa","bb",f["cc","dd"]]))) null(tail(tail(tail ["aa","bb","cc","dd"]))) しかし、計算すればわかるが、上はtrueで下はfalseになるので矛盾する。 よってfは存在し得ない。 本当は、型なしラムダ計算に落としこんでからやる必要があるけど、 (型なしラムダ計算にチャーチ・ロッサー性があることは証明済み) 骨子としてはこんな感じ。
694 名前:デフォルトの名無しさん [2017/06/14(水) 00:35:10.46 ID:Ei72hKB9.net] 要するにLispのマクロの ,@ みたいな展開をしたいってことか?
695 名前:デフォルトの名無しさん mailto:sage [2017/06/14(水) 02:36:17.24 ID:jR7LtVt0.net] >> 683 まあ、こういうデータ構造なんか既視感あるよなと思ったら、リストじゃなくてツリーだよね つうか Data.Tree がまんまそれ
696 名前:デフォルトの名無しさん mailto:sage [2017/06/14(水) 05:34:36.84 .net] >>681 ↑ この人強そう
697 名前:デフォルトの名無しさん [2017/06/14(水) 09:21:04.82 ID:Zur2LRZk.net] >>678 >関数fの型によるけどその出力がStringなら["a","b",f ["c","d"]] の型はもちろん[String]だね。 そこまで分かってて、f ["c","d"]が単一のStringにならざるを得ない。 つまり ["a","b","c","d"] ではなく、 ["a","b","cd"] の様な単一の値としてしか返りようがないって分かるだろ。 あれか、複数の値を返せってか。 従来の値が欲しい方はどうすんだよ。
698 名前:デフォルトの名無しさん mailto:sage [2017/06/14(水) 09:53:35.84 ID:dwFQOh88.net] >>679 > 他の言語だと[Any] なListがあったりするけど(例えばScala) > よくあんなの使うなーって思う その例は極端すぎる。Anyは論外。型の否定と
699 名前:ッじ。(Scalaも推奨はしてないと思うが) > fがどんな値を返そうと左辺は要素が3のリストで ふつうに考えてそうだよね。 そこを以下のように暗算して、できるかと思っちゃった。 f[x, y] = x : [y] とすると、 [a, b, f[c, d]] = a : b : (c : [d]) = a : b : (c : d : []) = a : b : c : d : [] = [a, b, c, d] >>680 というわけで、ここは俺が暗算で頭の体操してミスってた。 優しく拒否してもらったがスマンw >>686 > ["aa","bb",f["cc","dd"]]=["aa","bb","cc","dd"]なるfが存在しないことは、 > チャーチ・ロッサー性で説明できる。 折角だが今の件はチャーチ・ロッサー性(合流性)は関係ないと思う。 合流性以前の到達性が問題なので。 [] [ここ壊れてます]
700 名前:デフォルトの名無しさん mailto:sage [2017/06/18(日) 12:36:58.87 ID:P8yIezdD.net] 配列xsとysと引数を2つ取る関数gがあって、 f g xs ys = map (\x -> map (g x) ys ) xs となるような関数fってあったりしますか? 例えば f (+) [1,2,3] [4,5,6] = [ [5,6,7], [6,7,8], [7,8,9]] となるような関数です
701 名前:デフォルトの名無しさん mailto:sage [2017/06/18(日) 12:50:16.34 ID:aJwV86NO.net] >>692 hoogle で調べてみても、それっぽいものが見当たりませんね。 少なくとも標準ライブラリにはありません。 なので、その定義に自分で適当に名前を付けて使ってください。
702 名前:デフォルトの名無しさん mailto:sage [2017/06/18(日) 12:56:47.67 ID:P8yIezdD.net] >>693 ありがとうございます ないならないで問題ありません たまに使うのですが、既にあるならわざわざ定義するのも無駄だなと思っただけなので
703 名前:デフォルトの名無しさん mailto:sage [2017/06/18(日) 15:28:29.26 ID:sgvQsVTs.net] >>692 f g xs ys = concatMap (¥x -> map (g x) ys ) xs でいいなら(つまりリストを1段階潰していいなら)あるよ。 g <$> xs <*> ys がその答え。
704 名前:デフォルトの名無しさん [2017/06/18(日) 17:41:11.73 ID:VE2N9ory.net] >>692 zipWithに配列の配列渡せば行けるか?と書いてみた。 zipWith (map.(+)) [1,2,3] $ repeat [4,5,6] うん。 素直に関数作った方がいいね。 リスト内包表記なら分かりやすいと思う。 f g xs ys = [map (g x) ys | x <- xs]
705 名前:デフォルトの名無しさん [2017/06/18(日) 17:41:54.37 ID:VE2N9ory.net] x配列の配列 oリストのリスト
706 名前:デフォルトの名無しさん mailto:sage [2017/06/18(日) 22:40:07.66 ID:3urB1Yg8.net] これで行けるよ。 f x = fmap . (. (:[])) . liftA2 x f (+) [1,2,3] [4,5,6] [[5,6,7],[6,7,8],[7,8,9]]
707 名前:デフォルトの名無しさん mailto:sage [2017/06/19(月) 05:32:16.99 ID:DP5W49kg.net] そういう関数ってすでにある?って質問なのにオレオレ実装載せてく人たち…
708 名前:デフォルトの名無しさん mailto:sage [2017/06/19(月) 06:40:21.02 ID:iu3OXdki.net] しかも、質問者の実装が一番素直で分かりやすい
709 名前:デフォルトの名無しさん mailto:sage [2017/06/19(月) 07:45:05.62 ID:f7LtpRLv.net] 隙あらば実装 いや、プログラム板ではそれでいいんじゃないか。
710 名前:デフォルトの名無しさん mailto:sage [2017/06/19(月) 10:22:09.65 ID:Gx/WCs0N.net] 組み込みの関数でラムダ式を隠蔽してしまうことには意味があるんじゃないか ところで質問者の例だと結果が可換なのでそうじゃない例の方が良かったのでは f (+) [1, 2, 3] [1, 3, 5] -> [[2,4,6],[3,5,7],[4,6,8]] f (+) [1, 3, 5] [1, 2, 3] -> [[2,3,4],[4,5,6],[6,7,8]] とか
711 名前:デフォルトの名無しさん mailto:sage [2017/06/19(月) 10:46:07.27 ID:6iW/OLTz.net] >>702 それならば、あなたはどのような意味を見いだしたのかまでちゃんと言わないと。 何にどのような意味を見いだすかは人それぞれですし。 私は、ソースは人間が読みやすい事に最大の意味を見いだします。 なので、計算結果を容易に想像できるという点で、 >>692 や >> 696 の下の定義は好きですね。
712 名前:デフォルトの名無しさん mailto:sage [2017/07/01(土) 02:37:46.49 ID:JHLae2yG.net] IOモナドは命令書という喩えが一番しっくり来た
713 名前:デフォルトの名無しさん [2017/07/01(土) 08:12:10.07 ID:yvgbUlYU.net] IOモナドっつーか、モナドは難しく考えんで良いだろと。 IO String >>= String IO String >> は結果を捨てる。>>= ¥_ -> の略記。 return String ってしたらIOなString返るから、return使えばモナドの途中で純粋な関数で加工出来る。 それがIOモナドにも具体的な型にも依存しない汎用的な表現が m a >>= a ってだけ。 これだけ覚えれば使うにゃ十分だし、使ってるうちにただの型クラスやってわかる。 結局型クラスも型を受け取れる型ってだけで、ただの型でもあるから、純粋関数の結果としてString返すと、IO StringとStringは型が違うよって怒られる。 だからIO Stringにする為にIO Stringな関数か、return使いましょうってだけ。 具体的な型を考えれば何のことはない。 returnはそう考えればまあ自然なんだが、リターンってよりレシーブって印象。
714 名前:デフォルトの名無しさん [2017/07/01(土) 09:35:49.67 ID:yvgbUlYU.net] main = getLine >>= return.tail >>= putStrLn getLine 一行入力でIO String生成。 >>= getLineに生成されたIO StringをStringとして右辺に渡す。 return.tail tailは受け取ったStringの先頭を省く。 そのままだとStringのままで、IO Stringを受け取る次の>>=に渡せないので、returnでStringをIO Stringにして返す。 >>=(2番目) 最終出力のputStrLnに向けてIO StringをStringにして渡す。 putStrLn 受け取ったStringを改行付き出力。 説明のために長く書いたけど、型を揃えれば良いって分かればこうも書ける。 main = getLine >>= putStrLn.tail 何もないところからIOを生成するmain = 直後の関数以降は基本的に純粋な型を受け取ってIOな型を返せばコンパイラ通るので、何の役にも立たないけどこれもコンパイル通る。 main = getLine >>= return.tail putStrLnも関数である以上、何らかの値を返してるので見ようと思えば見れる。 main >>= putStrLn.tail >>= print ()にIOを付けたIO ()が返ってると分かる。
715 名前:デフォルトの名無しさん mailto:sage [2017/07/01(土) 10:27:56.55 ID:8Dk+ywm5.net] IOと純粋関数の関係がどうしても理解できなかったけどwiki読んだらやっとわかったからオススメ https://wiki.haskell.org/IO_inside
716 名前:デフォルトの名無しさん mailto:sage [2017/07/03(月) 20:20:17.13 ID:n7+jlCYi.net] stack使ってるのですが、openFileでカレントディレクトリ以外のファイルを指定って出来ないんですかね?
717 名前:デフォルトの名無しさん [2017/07/03(月) 20:31:50.76 ID:UwBLUxpl.net] stack関係あったっけ? 何となく¥を¥¥ってしてないだけじゃないかと予想。
718 名前:デフォルトの名無しさん mailto:sage [2017/07/08(土) 21:56:26.43 ID:A29giBA8.net] タプル作ろうと思ってHoogleで f :: a -> b -> (a, b) f a b = (a, b) となるような関数探したら見つからないんだけどもしかしてない? 割と使いそうなイメージなんだけど
719 名前:デフォルトの名無しさん mailto:sage [2017/07/08(土) 22:11:48.22 ID:TJZt+GMQ.net] どういうときに使いたいのさ curry/uncurry ならたまに使うけど
720 名前:デフォルトの名無しさん mailto:sage [2017/07/08(土) 22:18:49.21 ID:ZOCy/rmL.net] これで https://wandbox.org/permlink/bSFTBbmr9cQGguSw
721 名前:デフォルトの名無しさん mailto:sage [2017/07/08(土) 22:48:00.26 ID:Tq0FsZsH.net] >>710 タプルコンストラクタ $ ghci GHCi, version 8.0.2: www.haskell.org/ghc/ :? for help Prelude> :t ((,)) ((,)) :: a -> b -> (a, b)
722 名前:デフォルトの名無しさん mailto:sage [2017/07/08(土) 22:53:26.22 ID:AXnSyqoB.net] >>713 おお、まさにこれです ありがとうございます
723 名前:デフォルトの名無しさん [2017/07/10(月) 01:15:03.97 ID:IPU+pjhL.net] すみません traceデバッグについてですが ある変数に色とかで印を付けて IOとは別の専用簡易コンソールに出力表示とか 簡単に出来ない物でしょうか。
724 名前:デフォルトの名無しさん mailto:sage [2017/07/15(土) 19:13:14.12 ID:bXz+G42e.net] GHC 8.2 で実装予定の backpack なるものが一体 現在のどのような問題をどのように解決することを目指したものか、 分かる方いますか? どうも、モジュールシステムの拡張みたいですが...
725 名前:デフォルトの名無しさん [2017/07/17(月) 23:01:46.61 ID:4tJqH+Y+.net] ご冥福
726 名前:デフォルトの名無しさん mailto:sage [2017/07/18(火) 03:45:58.72 ID:6+yJKiYC.net] すぐりって読むのだと思ってました
727 名前:デフォルトの名無しさん [2017/07/19(水) 22:41:31.74 ID:BqP8obNe.net] https://twitter.com/tanakh/status/886624071005294592 これ?
728 名前:デフォルトの名無しさん mailto:sage [2017/07/21(金) 21:39:30.54 ID:kkMUVecO.net] 文字列のリストがあって、それぞれの要素を順番にputStrLnするだけならmapM_よりtraverse_の方がいいですか?
729 名前:デフォルトの名無しさん mailto:sage [2017/07/22(土) 10:13:22.40 ID:/BTLbKbr.net] Haskellerなんですぐ死んでしまうん
730 名前:デフォルトの名無しさん mailto:sage [2017/07/22(土) 11:57:08.36 ID:/9K4Ed3n.net] えぇ・・・
731 名前:デフォルトの名無しさん mailto:sage [2017/07/22(土) 14:53:16.39 ID:4NLvcjES.net] 必要以上に多相にしたり制約を弱めるのは典型的な bad practice concat のかわりに join 使ったりしないでしょ
732 名前:デフォルトの名無しさん mailto:sage [2017/07/22(土) 14:54:33.27 ID:4NLvcjES.net] ライブラリコード書くときには可能な限り型クラス制約を弱めて多相に 利用するコードではむしろ反対に
733 名前:デフォルトの名無しさん mailto:sage [2017/07/22(土) 17:58:06.65 ID:1dVz8HPB.net] >>723 つまりtraverse_の方がいいって認識でいいですか?
734 名前:デフォルトの名無しさん mailto:sage [2017/07/22(土) 19:58:53.32 ID:AuEOuo+E.net] Haskellerはマジでメンヘラが多い
735 名前:デフォルトの名無しさん mailto:sage [2017/07/22(土) 22:29:16.45 ID:wIG0mEjF.net] パフォーマンスモニターを提供する ekg というライブラリがあるんだが、 これ、なかなか凄いな。 統計情報がHTTPプロトコルでリアルタイムに提供されるから、 モニタリング専用のアプリを使わずとも普通のブラウザで見れる。 カウントするものをプログラムの中で定義することもできるみたいだし、 けっこう本格的だ。 パフォーマンスチューニングが捗りそう。 ちなみに、俺はこのライブラリの存在をここで知った。 www.stephendiehl.com/posts/production.html このブログポストに商業アプリ制作にHaskellを使う際の心得みたいなことが書かれていて、 Performance and Monitoring の項で ekg が紹介されている。 このブログの他のポストもなかなか面白いから暇人は読んでみるといいよ。
736 名前:デフォルトの名無しさん mailto:sage [2017/07/23(日) 00:17:34.21 ID:m+ryfkmk.net] >>725 ちょい待ち >>723 や >>724 のアドバイスに従うなら、そこは mapM_ でしょ
737 名前:デフォルトの名無しさん mailto:sage [2017/07/24(月) 20:13:14.08 ID:Rqhmx9U8.net] 他の言語の書き方が良くなると聞いて始めてみたが、難しい・・・ というか今のとこ恩恵が分かんない^^;
738 名前:デフォルトの名無しさん mailto:sage [2017/07/24(月) 20:20:07.13 ID:RBhDn3mI.net] 他言語の書き方は俺は良くなったな
739 名前:デフォルトの名無しさん mailto:sage [2017/07/24(月) 21:03:53.98 ID:h3biSAhr.net] 過去何度か似たような質問や意見が出てるが、 今までこういう書き方だったのがHaskellのお陰でこう改善された、 という具体例が挙がった試しがない。 改善例が載っているブログなどの紹介すらない。 俺の中では、前後の違いを明確に説明できないものは改善とは認められない。 原因がはっきりしない事はあるだろうが、改善したと言うからには 少なくとも違いははっきりと説明してほしい。 それができないと言う事は、きっと違いが説明できないほど微妙で曖昧な変化を 改善と言っているのだろう。
740 名前:デフォルトの名無しさん mailto:sage [2017/07/24(月) 21:22:17.61 ID:emVJufwa.net] いやそんなの最初からちゃんとやれよと思うかもしれんが非関数型の言語を触っているときに比べて入出力をはっきりと意識するようにはなった 特に動的型付けだと何も考えなくても動くだけのものは作れてしまうからな
741 名前:デフォルトの名無しさん mailto:sage [2017/07/24(月) 21:27:21.43 ID:jM5xaigZ.net] 大リーグ養成ギブスはめられてるような気持ち
742 名前:デフォルトの名無しさん mailto:sage [2017/07/24(月) 21:56:08.66 ID:RBhDn3mI.net] >>731 /: : : : : __: :/: : ::/: : ://: : :/l::|: : :i: :l: : :ヽ: : :丶: : 丶ヾ ___ /;,, : : : //::/: : 7l,;:≠-::/: : / .l::|: : :l: :|;,,;!: : :!l: : :i: : : :|: : ::、 / ヽ /ヽヽ: ://: :!:,X~::|: /;,,;,/: :/ リ!: ::/ノ l`ヽl !: : |: : : :l: :l: リ / そ そ お \ /: : ヽヾ/: : l/::l |/|||llllヾ,、 / |: :/ , -==、 l\:::|: : : :|i: | / う う 前 | . /: : : //ヾ ; :|!: イ、||ll|||||::|| ノノ イ|||||||ヾ、 |: ::|!: : イ: ::|/ な 思 が /: : ://: : :ヽソ::ヽl |{ i||ll"ン ´ i| l|||l"l `|: /|: : /'!/l ん う ∠: : : ~: : : : : : : :丶ゝ-―- , ー=z_ソ |/ ハメ;, :: ::|. だ ん i|::ハ: : : : : : : : : : : 、ヘヘヘヘ 、 ヘヘヘヘヘ /: : : : : \,|. ろ な |!l |: : : : : : : : :、: ::\ 、-―-, / : : :丶;,,;,:ミヽ う ら 丶: :ハ、lヽ: :ヽ: : ::\__ `~ " /: : ト; lヽ) ゝ レ `| `、l`、>=ニ´ , _´ : :} ` / ,,、r"^~´"''''"t-`r、 _ -、 ´ヽノ \ノ / お ・ ,;'~ _r-- 、__ ~f、_>'、_ | で 前 ・ f~ ,;" ~"t___ ミ、 ^'t | は ん ・ ," ,~ ヾ~'-、__ ミ_ξ丶 | な 中 ・ ;' ,イ .. ヽ_ ヾ、0ヽ丶 l / ( ;":: |: :: .. .`, ヾ 丶 ! \____/ ;;;; :: 入:: :: :: l`ー-、 )l ヾ 丶 "~、ソ:: :い:: : \_ ノ , ヾ 丶
743 名前:デフォルトの名無しさん mailto:sage [2017/07/24(月) 22:18:09.60 ID:Dtg+FNV7.net] 俺は大幅に改善されたので満足です
744 名前:デフォルトの名無しさん mailto:sage [2017/07/24(月) 22:30:09.86 ID:DrMH5w+T.net] はすける始めたら彼女とセフレが出来ました!
745 名前:デフォルトの名無しさん mailto:sage [2017/07/25(火) 00:51:32.66 ID:oURyYS1P.net] デザインパターンのようなものが自然に学べる(要出典) >>732 IOモナドを学んでしまうとvoidとかなんやねん!て気持ちになる
746 名前:デフォルトの名無しさん mailto:sage [2017/07/25(火) 02:18:19.45 ID:kRJD7bjt.net] IO () ← なんやねん!
747 名前:デフォルトの名無しさん mailto:sage [2017/07/25(火) 11:48:16.84 ID:QpQhPQ2k.net] 空のタプルやね 引数にタプル使わないけど戻り値には使う 他の言語では最も書きにくいパターンを敢えて書く
748 名前:デフォルトの名無しさん mailto:sage [2017/07/27(木) 03:54:31.04 ID:iGcNC8dh.net] 空のタポゥってvoidに相当するんでないのって訊いてんの!
749 名前:デフォルトの名無しさん mailto:sage [2017/07/27(木) 07:51:05.82 ID:y/+6hAIl.net] 例えばIO ()なら空のタプル自体は要らなくとも「IOという文脈に包まれている」という情報は欲しい 遅延評価がデフォのHaskellで実行順序 を保証するためにはそれらのIOを繋げる必要がある voidは何も返さないからそれができない こんな感じで値そのものに意味はなくとも「それとセットになっている何か」が欲しいとき空のタプルを使うことが多い
750 名前:デフォルトの名無しさん mailto:sage [2017/07/27(木) 08:18:47.17 ID:iGcNC8dh.net] 空タプルはvoidなんじゃないかっていってるの! voidが無いなんて嘘っぱちだろっていってるの! 実質 IO void やろってゆってんの!
751 名前:デフォルトの名無しさん mailto:sage [2017/07/27(木) 08:24:32.65 ID:UvZuKEGA.net] 物狂いか