[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2ch.scのread.cgiへ]
Update time : 07/21 14:46 / Filesize : 290 KB / Number-of Response : 1014
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

関数型プログラミング言語Haskell Part30



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/

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]
物狂いか

752 名前:デフォルトの名無しさん mailto:sage [2017/07/27(木) 11:08:02.42 ID:BU4hr0QJ.net]
IO () はIOモナドの中にしか現れられないが
他言語のvoidはその辺の関数に普通に紛れ込めてしまう
もちろん通常は規約とかデザインパターンなどで読みやすく気をつけるわけだけど
IOモナドならそういう意図しない副作用が無いことを
型レベルで保証してくれてありがたい



753 名前:デフォルトの名無しさん mailto:sage [2017/07/27(木) 11:45:48.74 ID:tePeK+XY.net]
集合論でいうと()型の値の集合は空集合ではない
デザインパターンでいうとSingleton

だがvoidはSingletonではない
そもそもvoidはオブジェクトか?

754 名前:デフォルトの名無しさん mailto:sage [2017/07/27(木) 13:52:35.44 ID:cb3Opfj1.net]
Haskellにおいてユニット型の値は () とボトムの2つ。

755 名前:デフォルトの名無しさん mailto:sage [2017/07/27(木) 15:38:01.66 ID:tePeK+XY.net]
ボトムは正規形になっていない式ではないのか
途中の式のことを値といっていいのか

756 名前:デフォルトの名無しさん mailto:sage [2017/07/27(木) 16:36:16.86 ID:cb3Opfj1.net]
>>747
https://wiki.haskell.org/Bottom

> Bottom is a member of any type, even the trivial type () or the equivalent simple type:
>
> data Unary = Unary

757 名前:デフォルトの名無しさん mailto:sage [2017/07/27(木) 18:13:58.43 ID:tePeK+XY.net]
value of any typeとは言っていない

758 名前:デフォルトの名無しさん [2017/07/27(木) 18:57:57.46 ID:TN85Uszo.net]
>>747
関数を返す関数もShowのインスタンスじゃ無いから表示出来ないだけで値として扱われてるし、途中の式も値として扱われるなら扱って良いんじゃ無い?

759 名前:デフォルトの名無しさん [2017/07/27(木) 19:03:38.43 ID:TN85Uszo.net]
>>742
IO ()は出力関数の(どうせ捨てられる)値として便宜上付けてるだけだしなぁ。。。
別にIO Stringで毎回"Hello"とか返したっていいのをIO ()にしてるだけ。
受け取る意味はないけど、受け取って表示だって出来る。
そう言う意味じゃvoidとは言い難いな。

760 名前:デフォルトの名無しさん mailto:sage [2017/07/27(木) 19:18:08.33 ID:20Yx27ly.net]
一体彼は何を躍起になってるんだろうか

761 名前:デフォルトの名無しさん mailto:sage [2017/07/27(木) 20:05:00.63 ID:egT7olKo.net]
>>749
型を集合とみなしたときの元(member)をずっと型が取り得る値(value)だと思い込んでた。

違うのか。
それは済まなかった。

私のレスは無視してくれ。

762 名前:デフォルトの名無しさん mailto:sage [2017/07/27(木) 22:06:59.31 ID:vZOWG5O9.net]
まあ確かに⊥を値と認めない流儀はあるからなあ



763 名前:デフォルトの名無しさん mailto:sage [2017/07/27(木) 22:15:49.20 ID:vZOWG5O9.net]
任意の型aに対して、()型の値(≠⊥)を返す関数 :: a -> () はただひとつ

f _ = ()
つまり const ()

しかないので、「void型を返す関数」が(パラメータ多相を除いて)
一意に決まるということを受け入れるという自殺的蛮勇がないなら
void 型と ()型を同視することはできない

764 名前:デフォルトの名無しさん mailto:sage [2017/07/29(土) 00:23:19.35 ID:4ZTKGS6D.net]
ゲーム作りてえなあ

765 名前:デフォルトの名無しさん mailto:sage [2017/07/29(土) 01:03:41.38 ID:e8mE+qrd.net]
raincatは全ステージクリアした
スペランカー並みに弱い猫だなあれ

766 名前:デフォルトの名無しさん mailto:sage [2017/07/29(土) 11:39:03.53 ID:kqaT8BL8.net]
遅延評価でグラフィック描画して何か嬉しいことあるん?

767 名前:デフォルトの名無しさん mailto:sage [2017/07/29(土) 12:15:52.61 ID:SWzA4YZp.net]
deleteを遅延するガベコレだけで邪魔臭いんだが
毒食わば皿までとnewも遅延するみたいな感じ

768 名前:デフォルトの名無しさん mailto:sage [2017/07/29(土) 20:11:41.20 ID:bMHI66Oo.net]
GHCランタイムシステムのガベコレって、人間が操作するなら必ずここで一瞬停まるから、この瞬間にちょっとだけガベコレしといてねっていう細かい調整はできないの?

とにかく食い尽くしてもうなくなったら、解放可能な記憶域ないか、ようやく探し始めるしか能がないの?

769 名前:デフォルトの名無しさん mailto:sage [2017/07/29(土) 21:04:34.50 ID:Txodz0Ts.net]
>>760
標準ライブラリにGCを促す関数がある

770 名前:デフォルトの名無しさん mailto:sage [2017/07/29(土) 21:13:59.96 ID:GuKX0EtE.net]
メモリー管理が陽に出てこないGC言語でGCについて語るAPIが存在するのも美しくないな
待機型処理の内部に組み入れられないんだろうか

771 名前:_ [2017/07/29(土) 21:43:41.58 ID:z3bKXBTm.net]
ghc 8.2.1リリース
age

772 名前:デフォルトの名無しさん mailto:sage [2017/07/29(土) 22:00:35.21 ID:ezVHy3/u.net]
実行頻度不明なのに強制GCしたらGCのオーバーヘッドに食い尽くされる可能性あるやろ
人力か機械学習でGCポイント探すしかないわ
線形型はよ



773 名前:デフォルトの名無しさん mailto:sage [2017/07/29(土) 22:05:39.73 ID:EGnuLLJd.net]
Numeric Prelude標準モードできねえかな

774 名前:デフォルトの名無しさん mailto:sage [2017/07/30(日) 18:38:08.27 ID:Qtbkg44k.net]
いつになったらGHCのコードに型を記述するんだよ
あんなコードじゃ常に参加してる奴しか解読出来ないだろ

775 名前:デフォルトの名無しさん mailto:sage [2017/08/02(水) 14:19:58.09 ID:nRMWmSFr.net]
デバッグで行単位で進める、
変数の値を都度観察できる、みたいなエディタというかIDEってありますかね?

776 名前:デフォルトの名無しさん mailto:sage [2017/08/02(水) 15:25:19.26 ID:D+JhlBxR.net]
デバッグで苦しんだことがないから分からないが
観察するべき実行時エラーが出るものなのか
必死に型を記述した結果がこれか

777 名前:デフォルトの名無しさん mailto:sage [2017/08/02(水) 15:33:23.39 ID:W2G2gcC4.net]
>>767
ghciのデバッガじゃいかんの?

778 名前:デフォルトの名無しさん mailto:sage [2017/08/02(水) 23:16:44.52 ID:Fofa317S.net]
>>768
>>769
いや、型は合ってんだけど画像いじってて行列の合計数が合わんとか、出来映えがおかしいとかそういうの。途中でどうなってるのか観察したい。
emacsのREPLでちまちま動かして確認してんだけど面倒いなって。

途中でブレークポイント設定とかGHCにあるっぽいのは見たけど、そちらをもう少し当たるのが正解ですかね。

779 名前:デフォルトの名無しさん mailto:sage [2017/08/03(木) 00:12:26.54 ID:Ip+Lj8Tk.net]
純粋関数のprintデバッグができるDebug.Traceとかどうですか

780 名前:デフォルトの名無しさん mailto:sage [2017/08/03(木) 07:59:11.85 ID:d2xIcHkQ.net]
プログラミング初心者だけど将来Haskell用のデバッガを作るのが夢です

781 名前:デフォルトの名無しさん mailto:sage [2017/08/03(木) 08:47:54.62 ID:jTGWEJQg.net]
ジーニアス英和辞典 第五版にぴったりの例文があった
Passion without action ismerelya dream.

782 名前:デフォルトの名無しさん mailto:sage [2017/08/03(木) 08:53:44.89 ID:z5sKoHNx.net]
デバッガよりVisual Studio並みの最強IDEがほしいわ



783 名前:デフォルトの名無しさん mailto:sage [2017/08/03(木) 22:43:53.87 ID:PWpQLJ0B.net]
Bounded クラスと Enum クラスのインスタンスである型 T について、
n 個の要素を持つリスト型 [T] の値を全て要素として持つリストを生成する関数を enumerate とします。

たとえば型 T の値が A と B の2つだとし、n=3 だとすると、

(enumerate 3 :: [T]) = [[A, A, A], [A, A, B], [A, B, A], [A, B, B], [B, A, A], [B, A, B], [B, B, A], [B, B, B]]

となります。
ただし、生成されるリストの要素の順番は問いません。

私は下記のように定義しました。

enumerate :: (Bounded a, Enum a) => Int -> [[a]]
enumerate 1 = map (:[]) [minBound .. maxBound]
enumerate n = concatMap (\x -> map (x:) (enumerate (n-1))) [minBound .. maxBound]

n-1個の既に作られたリストの各要素 (リスト) に新たに型 T のそれぞれの値を接頭する作り方です。

シンプルで分かりやすいのですが、問題が1つあります。
この関数が生成したリストの全要素を順に別の計算に消費するようなプログラムを作っているのですが、
上記の定義ですと、リストの全要素が消費し尽くされるまでほぼ全要素分のメモリが必要になります。
x : x : x : ... と積み上がった cons がメモリに残るような作りのためです。

消費は順に一つずつ行うので、理想的にはメモリも要素一つ分で足ります。
現実はそうもいかないと思いますが、全要素分のメモリを保持し続ける必要はないはずです。

メモリ消費量をもっと抑える良い方法はないでしょうか。

784 名前:デフォルトの名無しさん mailto:sage [2017/08/04(金) 03:26:35.06 ID:F7/4gW8S.net]
>>775
ちゃんとプロファイル取ってないから確証はないけど
enumerateの定義が悪くてメモリ食いすぎてるような気がする
Control.Monad のreplicateMをリストモナドに対して使うと
同様に重複順列を作れるからそれならどうだろうか
replicateM 3 [0, 1] -- > [[0,0,0],[0,0,1],[0,1,0],[0,1,1],[1,0,0],[1,0,1],[1,1,0],[1,1,1]]
あとリストを順に消費していくような計算ならfoldl'が使えるはず

あるいは、「EnumなT型の有限個の直積」をうまく新たにEnumのインスタンスにして、
succ: Enum a => a -> a
で例えば succ [A, A, A] = [A, A, B]
みたいに計算できるようにしておいて、
STRefを利用してsuccで更新しながら消費していく、とか






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<290KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef