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/
601 名前:デフォルトの名無しさん mailto:sage [2017/05/28(日) 23:05:39.10 ID:Ga0OokE+.net] >>593 それ、質問者の言う splitAt で分けてからっていう方法と同じ
602 名前:デフォルトの名無しさん mailto:sage [2017/05/28(日) 23:14:43.47 ID:wvAEkP6f.net] >>590 >>593 ありがとうございます Data.IndexのsetAt関数の定義をそのまま使わせてもらおうと思います
603 名前:デフォルトの名無しさん mailto:sage [2017/05/28(日) 23:23:12.14 ID:Rx3nBVE8.net] リストのコピーって、(既にある)リストの各要素の格納先と同じアドレスを指すポインタを新規アロケートしてく感じですか? それとも一々要素までをもコピーするんですか?
604 名前:デフォルトの名無しさん mailto:sage [2017/05/29(月) 00:33:15.43 ID:21264BYs.net] コピーしてたらリストの意味無いからアドレスを新しく指してるんだと思う。 でないと、ソートとかメモリ幾らあっても足りなくなる。
605 名前:デフォルトの名無しさん mailto:sage [2017/05/29(月) 00:49:02.28 ID:21264BYs.net] >>594 SplitAtで分けると前方がリストになる。 (++)と(:)じゃ(:)のが効率が良い。 (++)は前方のリストが長くなると著しく遅くなる性質がある。
606 名前:デフォルトの名無しさん mailto:sage [2017/05/29(月) 01:12:03.29 ID:21264BYs.net] >>594 ちなみにsplitAtのやり方だとtake n zsの一番最後が更新したい場所になるので、initした上で++[a]++ysする必要がある。 setAt n a zs = init xs ++ [a] ++ ys .........................where (xs, ys) = splitAt zs Haskellでswap関数を作る7つの方法とか言うページ思い出したわ。。。
607 名前:デフォルトの名無しさん mailto:sage [2017/05/29(月) 01:13:40.94 ID:21264BYs.net] x splitAt zs o splitAt n zs
608 名前:デフォルトの名無しさん mailto:sage [2017/05/29(月) 06:42:46.07 ID:0mYha2aU.net] (++) (x:xs) ys = x : (++) xs ys setAt n a (x:xs) = x : setAt (n-1) a xs これを比較して前者が著しく遅いというのは嘘八百だな
609 名前:デフォルトの名無しさん mailto:sage [2017/05/29(月) 06:59:53.71 ID:Ny51uA9N.net] >>601 reverse関数をfoldl (\x -> x:ls) [] xsで書くのとreverse xs ++ [x]で作るのじゃ反転した文字列が生成される度に右から結合されて凄く遅い。 上の>>599 も、init xs ++ [a]で一旦結合して、++ ysの部分に来たらまたinit xs部分から結合が始まる。
610 名前:デフォルトの名無しさん mailto:sage [2017/05/29(月) 07:04:59.77 ID:Ny51uA9N.net] あ、逆か。 ysから始まってリストの先頭まで結合する。 出力する際には結局先頭から(:)伝いに辿って行くのでそう言う二度手間は避けた方がいい。
611 名前:デフォルトの名無しさん mailto:sage [2017/05/29(月) 07:20:56.98 ID:Ny51uA9N.net] ここで言う問題は、++ysそのものに害は無いけど、init xs ++ [a]で一旦先頭まで結合する処理が挟まってるってことね。
612 名前:デフォルトの名無しさん mailto:sage [2017/05/29(月) 07:35:03.41 ID:0mYha2aU.net] 実は++も右結合なんだよな だから init xs ++ [a] ++ ys を (init xs ++ [a]) ++ ys と解釈するのは絶対ダメ
613 名前:デフォルトの名無しさん [2017/05/29(月) 07:35:56.11 ID:Dokhp7Id.net] setAt i x xs = let (ys,_:zs) = splitAt (i-1) xs in ys ++ x : xs 別にこういう定義にすればいい でこれが遅いのは単にysの部分が2パスになるから
614 名前:デフォルトの名無しさん [2017/05/29(月) 07:39:00.53 ID:Dokhp7Id.net] >>606 ミス x : xsじゃなくてx : zs
615 名前:デフォルトの名無しさん mailto:sage [2017/05/29(月) 07:52:38.57 ID:KKAtyjp+.net] 別にそれでも良い。 (++)は取り扱い次第で遅くなるってだけ。
616 名前:デフォルトの名無しさん mailto:sage [2017/05/29(月) 15:03:33.95 ID:2+2L65e+.net] というわけで、Sequenceです
617 名前:デフォルトの名無しさん mailto:sage [2017/05/29(月) 20:13:36.52 ID:0mYha2aU.net] showで文字列を作るのは平気なのにリストを作ると遅い遅いと言われる現象 数学的というより人間工学っぽい
618 名前:デフォルトの名無しさん mailto:sage [2017/05/29(月) 20:46:32.77 ID:VknhjnwZ.net] 出現頻度の問題では?
619 名前:デフォルトの名無しさん mailto:sage [2017/05/29(月) 21:27:07.82 ID:0mYha2aU.net] リストを使う頻度はIOを使う頻度と関係ありそう IOを使う頻度は個人差が非常に大きい
620 名前:デフォルトの名無しさん mailto:sage [2017/05/29(月) 21:54:24.18 ID:2+2L65e+.net] 初心者はモナド変換で躓く
621 名前:デフォルトの名無しさん mailto:sage [2017/05/30(火) 04:05:18.67 ID:jc1LxPHe.net] 例外処理のベストプラクティスがよく分からないなー catchとかhandleでメイン処理、例外処理共に複数行になる時に、命令型のtry~catchみたいに無名関数での書き方ってどうなるんだろう 関数に切り出して呼ぶべし、なんかな? どっちかだけ複数行ならそっちをdoにしたら良いっていうのは分るんだけど
622 名前:デフォルトの名無しさん mailto:sage [2017/05/30(火) 05:14:25.23 ID:jc1LxPHe.net] パーレンで囲んだラムダは複数行いけるのな、見た目微妙だけど
623 名前:デフォルトの名無しさん [2017/05/31(水) 03:43:11.48 ID:ML3xxqnu.net] パーレン () ブラケット [] ブレース {}
624 名前:デフォルトの名無しさん mailto:sage [2017/06/03(土) 16:54:41.37 ID:c6fwatRb.net] f g n = gをn回合成した関数 みたいな関数のが欲しい
625 名前:デフォルトの名無しさん mailto:sage [2017/06/03(土) 17:14:18.00 ID:PKJ3i7am.net] f = (!! n) . (iterate g)
626 名前:デフォルトの名無しさん mailto:sage [2017/06/03(土) 18:46:29.60 ID:RovdiJA/.net] >>618 それって真面目なコードで使っていいのか? 融合変換で実質ループなのは知ってるけど そもそもこのレベルを勝手に抽象化していいものかどうか
627 名前:デフォルトの名無しさん mailto:sage [2017/06/03(土) 20:14:20.72 ID:lhcAcbkl.net] なんの問題もないと思うけど そもそも同じ関数の反復適用が iterate なんだから たいして抽象的でもない
628 名前:デフォルトの名無しさん mailto:sage [2017/06/03(土) 20:24:38.74 ID:lhcAcbkl.net] iterative f n = foldl1 (.) $ take n $ repeat f これより >>618 の方がわかりやすいと思う
629 名前:デフォルトの名無しさん mailto:sage [2017/06/03(土) 20:28:35.64 ID:lhcAcbkl.net] iterative f n = foldl' (.) id . map (const f) $ [1..n] とかでもいいか。そして iterate の方があきらかにわかりやすい。
630 名前:デフォルトの名無しさん mailto:sage [2017/06/04(日) 00:13:00.20 ID:zJIyEnOK.net] Cabalプロジェクトをstackでビルドできないだろうか? cabalをグローバルにインストールしたくないんだ
631 名前:デフォルトの名無しさん [2017/06/07(水) 04:45:18.83 ID:WOFnqCYP.net] haskellで○×ゲーム作りました(頑張った私を褒めてください) https://ideone.com/HHEWZv
632 名前:デフォルトの名無しさん mailto:sage [2017/06/07(水) 08:42:17.54 ID:gpLNw8mo.net] 勝利判定なんとかならんのかw
633 名前:デフォルトの名無しさん mailto:sage [2017/06/07(水) 10:28:15.63 ID:ZiMqMUeJ.net] ゲームとかアルゴリズムとかどうでもよくて、ここが可愛いってのがポイントだろ? ('o':'o':'o': _ : _ : _ : _ : _ : _ :_) -> True ( _ : _ :'x': _ :'x': _ :'x': _ : _ :_) -> True
634 名前:デフォルトの名無しさん mailto:sage [2017/06/07(水) 17:37:30.82 ID:goEom//K.net] 下は泣いてるミッフィーちゃんがクローン技術で失敗したような感じ
635 名前:デフォルトの名無しさん mailto:sage [2017/06/07(水) 22:12:38.86 ID:FEgyIbtW.net] 昔オセロ作ったけど、勝敗判定作るの忘れて延々パスし続けたわ main = void $ loop (player >=> ai) initBoard where loop :: (Board -> IO Board) -> Board -> IO Board loop f ib = loop f =<< f ib
636 名前:デフォルトの名無しさん mailto:sage [2017/06/08(木) 02:06:09.79 ID:3NnY77Pk.net] >>624 同じゲームでも人によって設計や実装が全然違ってて面白いな ○×ゲーム - a-sanの日記 - haskell https://haskell.g.hatena.ne.jp/a-san/20070115/p1 yasuabe blog: Haskell で三目並べ (2) yasutech.blogspot.jp/2012/03/haskell.html examples/TicTacToe.hs projects.haskell.org/operational/examples/TicTacToe.hs.html TicTacToe - HaskellWiki https://wiki.haskell.org/TicTacToe Tic-tac-toe in Haskell ・ GitHub https://gist.github.com/billdozr/3071732
637 名前:デフォルトの名無しさん mailto:sage [2017/06/11(日) 01:46:27.90 ID:vYdG9fRO.net] 開発環境としてleksahを入れてみたんですが、getLineのような標準入力が上手く動いてない気がします 実行しても入力出来るようにならず止まってしまうのですが、どうしたら入力出来るようになりますか?
638 名前: mailto:sage [2017/06/11(日) 05:15:07.62 ID:afWo9qoQ.net] 今気づいた! leksah ってHaskell逆読みじゃん!
639 名前:デフォルトの名無しさん mailto:sage [2017/06/11(日) 12:39:02.23 ID:hZZQfw5d.net] 月並な命名をされた月並なアプリ
640 名前:デフォルトの名無しさん mailto:sage [2017/06/11(日) 16:52:05.15 ID:3HVnXb8h.net] >>68 > ["aa", "bb", f ["cc", "dd"] ] = > ["aa", "bb", "cc", "dd"] > となるような関数fはどのように書けるでしょうか めちゃ遅レスでなんだけど、f [x, y] = x : [y] ではだめなの?
641 名前:デフォルトの名無しさん mailto:sage [2017/06/11(日) 17:45:34.43 ID:uxrAPwUF.net] >>633 自分でちゃんとテストしてみた?
642 名前:デフォルトの名無しさん mailto:sage [2017/06/11(日) 22:56:26.81 ID:3HVnXb8h.net] >>634 リストの定義から明らかだと思うのでテストはしていない
643 名前:デフォルトの名無しさん [2017/06/11(日) 23:16:23.58 ID:0ffmynih.net] >>635 リストの定義から明らかだが、>>69
644 名前:デフォルトの名無しさん mailto:sage [2017/06/11(日) 23:46:34.97 ID:QTMXbNo3.net] 驚き最小=テスト最小の法則
645 名前:デフォルトの名無しさん mailto:sage [2017/06/11(日) 23:54:46.06 ID:3HVnXb8h.net] >>636 何と何の型がどう合わない?
646 名前:デフォルトの名無しさん [2017/06/12(月) 00:18:12.16 ID:9+UoMkQw.net] テンプレート?
647 名前:デフォルトの名無しさん mailto:sage [2017/06/12(月) 01:00:35.16 ID:p/7lEol5.net] fを適用した結果の型が外側のリストの型と合わないってことでら
648 名前:デフォルトの名無しさん mailto:sage [2017/06/12(月) 01:38:16.98 ID:0O7XnA5J.net] たぶんshowの結果を評価する途中でunsafePerformIOすればいいんだな
649 名前:デフォルトの名無しさん mailto:sage [2017/06/12(月) 01:46:50.84 ID:4tiz7p+p.net] [ “aa”, “bb”, [“cc”,”dd”] ] の型がどうやって合うと思ったのだろうか。
650 名前:デフォルトの名無しさん mailto:sage [2017/06/12(月) 02:20:04.97 ID:DHBWzfrJ.net] 邪悪なことはするな
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]] となるような関数です