トップページtech
1001コメント379KB

関数型プログラミング言語Haskell Part27_©5ch.io

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん 転載ダメ©2ch.net2015/01/08(木) 21:02:35.67ID:IQPOX3u7
関数型プログラミング言語 Haskell について語るスレです。

haskell.org (公式サイト)
http://www.haskell.org/

前スレ
関数型プログラミング言語Haskell Part26
http://peace.2ch.net/test/read.cgi/tech/1406436392/
0175デフォルトの名無しさん2015/01/18(日) 19:42:56.42ID:IU9bGGXQ
まとめてQiitaにでもあげといてくれ
0176デフォルトの名無しさん2015/01/18(日) 20:45:45.78ID:V765A4GC
>>174
あーそういう意味じゃないな
接触はしてないと言うかするわけがない
あそこら辺の人はアレがでたらめだとひと目見抜けないと(関数型プログラミング言語を使うのは)難しいって感じで放置しそう
0177デフォルトの名無しさん2015/01/18(日) 20:48:19.28ID:ozX7xrZl
ところで諸君、ここはムスレだ。マスレではないぞ
0178デフォルトの名無しさん2015/01/18(日) 20:57:45.23ID:ERirhDOz
http://b.hatena.ne.jp/entry/237558834/comment/tail_y
0179デフォルトの名無しさん2015/01/18(日) 23:09:56.08ID:m3hmoOOc
最近は毛という壁もある
0180デフォルトの名無しさん2015/01/19(月) 07:22:58.14ID:e75uCkWu
http://qiita.com/kenokabe/items/3e167c6742f14af7756d#comment-8eda55b4f68fc6fdd271
0181デフォルトの名無しさん2015/01/19(月) 07:23:57.16ID:e75uCkWu
本文とタイトルになんの関係もないエントリじゃ、詐欺だろうよ
0182デフォルトの名無しさん2015/01/19(月) 08:29:09.56ID:h1tmdNUx
>>180
「これこれこういう本を読め」って、あんたQiitaでも散々自分の記事のリンク張って、
読めって強要しているじゃないか
0183デフォルトの名無しさん2015/01/19(月) 10:06:32.13ID:tWyHvUIe
もう「毛の壁」の話題はやめようぜ
0184デフォルトの名無しさん2015/01/19(月) 10:11:16.40ID:W5DPVPB8
毛の壁の魅力
0185デフォルトの名無しさん2015/01/19(月) 10:34:59.45ID:W+ZMH4Rm
てか>>182みたいなのは流石に直接言えよ
0186デフォルトの名無しさん2015/01/19(月) 11:07:20.34ID:t2o2vSxL
直接言ったら訴えられそう
0187デフォルトの名無しさん2015/01/19(月) 13:09:30.75ID:7cIVKz16
kenokabeくんが作ったAndroidのコストコのアプリがクソすぎる
0188岡部健2015/01/19(月) 13:23:16.84ID:jdcvUTrq
コストコ!みんなのクチコミ apk
青空文庫を読む apk


便利だよ、使ってねクズども
0189デフォルトの名無しさん2015/01/19(月) 16:35:00.12ID:Wl5S0I/B
キタ━━━━━━(゚∀゚)━━━━━━ !!!!!?
0190デフォルトの名無しさん2015/01/19(月) 16:38:17.97ID:Wl5S0I/B
小説家になろうの投稿作品を綺麗な縦書きで読めるようなビューア作ってください!
0191デフォルトの名無しさん2015/01/19(月) 17:36:56.76ID:RjD6WSsn
せめてスレ違いじゃない内容にしてくれ
0192デフォルトの名無しさん2015/01/19(月) 18:31:40.95ID:zYruZwCt
>>188
この程度だったのか・・・・・
0193デフォルトの名無しさん2015/01/19(月) 19:14:55.07ID:1zvC0LuU
こっちでやれ
http://yomogi.2ch.net/test/read.cgi/net/1419377805/
0194デフォルトの名無しさん2015/01/20(火) 01:19:59.90ID:NaIuJpGP
cabal の仕組みであるところの sandbox を使って依存パッケージを管理した上で
haskell のコードを書いて、ghcmod 使ったりコンパイルしたりする、
という場合、ghc じたいが sandbox に気づいてそこのライブラリを使う、というのは起こらなくて、
myproject.cabal を作るのは必須という理解でいいですか?
なんかくだすれみたいで申し訳ないのですが、どうもハッキリ掴めないのでお許しを
0195デフォルトの名無しさん2015/01/20(火) 07:47:39.53ID:8CmI1DCg
kenokabeの主張

・双方向連結リストじゃない単方向連結リストだ
・「始端」は自己参照的なEmptyPairだ(「終端」ではない)
・でもセルごとの連結ポインタは後続のセルから先行のセルを指すようになっている
・実装は配列

kenokabeちゃんはリストというデータ構造を知らない
0196デフォルトの名無しさん2015/01/20(火) 07:50:15.67ID:8CmI1DCg
kenokabeのプロフィール
https://plus.google.com/102413788769460359022/posts


"通っていた学校 University of California, Los" とあるけど、絶対ウソ。
0197デフォルトの名無しさん2015/01/20(火) 07:55:46.62ID:8CmI1DCg
http://qiita.com/kenokabe/items/aa5705978d6a13753fe2

var $push = M.$push = function(arr, data)
{
arr[arr.length] = data;
};

この実装でなんで
「ほら見ろ逆方向リストで動作するじゃねーか」と
言い張れるのか果てしなく謎だ。
0198デフォルトの名無しさん2015/01/20(火) 08:28:14.07ID:Z11IUfXN
>>194
cabal exec ghc -- --[ghcオプション]

みたいにすればsandbox awareにghc使える。
0199デフォルトの名無しさん2015/01/20(火) 10:35:44.47ID:NaIuJpGP
>>198 あーなるほど、 cabal を通じて呼べるわけですね。
ありがとうございます。ちょっと cabal のマニュアル読み直してきます
0200デフォルトの名無しさん2015/01/20(火) 10:58:53.32ID:Nn6T7LRa
福島第一タンクに転落、重傷 止まらぬ作業事故
0201デフォルトの名無しさん2015/01/20(火) 10:59:28.98ID:Nn6T7LRa
福島第1作業員が死亡=タンク設置工事で落下
0202デフォルトの名無しさん2015/01/20(火) 13:21:19.76ID:r45csLnY
ここもkenokabeのマッチポンプで潰されてんな
0203デフォルトの名無しさん2015/01/20(火) 14:58:36.18ID:Nn6T7LRa
福島第二でも作業員事故1人死亡
0204デフォルトの名無しさん2015/01/20(火) 23:34:29.85ID:Nn6T7LRa
死亡事故で廃炉作業中止し点検へ

東京電力福島第一原子力発電所と第二原子力発電所で、作業員が死亡する事故が相次ぎ、第一原発では、21日廃炉作業を中止して、安全点検を実施することになりました。
背景について東京電力は、記者会見で、「作業量が多くなっていることも考えなければならない」と述べ、作業の進め方や安全対策に問題がないか検討する考えを示しました。

20日午前9時半ごろ、福島第二原発で、廃棄物を処理する建物で点検作業をしていた40代の作業員の男性が、点検用の機具に頭を挟まれ、ドクターヘリで病院に搬送されましたが、死亡しました。
福島第一原発でも、19日午前9時ごろ、雨水をためるタンクの点検をしていた50代の作業員の男性が、高さおよそ10メートルのタンクの天井から転落し、20日未明になって死亡しました。
さらに柏崎刈羽原発でも、19日、作業員が足場から3メートル余り下に転落して大けがをしました。

こうした事態を受けて東京電力は、3つの原発の所長とテレビ会議で結ぶ異例の記者会見を開き、姉川尚史原子力・立地本部長が陳謝しました。
現在、福島第一原発では、廃炉や汚染水対策などのため、去年の同じ時期のほぼ2倍に当たる1日およそ7000人の作業員が働いていますが、
「作業量の急増が、事故が相次ぐ背景にあるのではないかと」問われたのに対し、姉川本部長は、「作業量が多くなっていることも考えなければならない」と述べ、作業の進め方や安全対策に問題がないか検討する考えを示しました。

福島第一原発では、21日、廃炉作業のほとんどを中止し、安全点検を実施することになり、第二原発でも安全の徹底が図られるまで、作業を中止するということです。
福島第一原発では、去年3月にも、崩れてきた土砂の下敷きになって作業員が死亡したほか、11月には、タンクの増設工事中に、鋼材が落下して3人が重軽傷を負うなど、作業事故が相次ぎ安全対策が課題になっています。

東電社長「安全確保までほとんどの作業再開せず」
0205デフォルトの名無しさん2015/01/21(水) 10:02:49.56ID:tSYl3nCX
おまいらletとwhereってどんな風に使い分けてる?
0206デフォルトの名無しさん2015/01/21(水) 10:11:05.68ID:b1WEqEY3
基本 where で気が向いたら let
0207デフォルトの名無しさん2015/01/21(水) 10:12:38.22ID:PxbGo4hc
>>205
気分。
紀文のはんぺん。
0208デフォルトの名無しさん2015/01/21(水) 10:12:59.70ID:mE4mMlsp
>>205
先に定義を見せておかないと後のコードが読めなさそうなものはlet、
名前を見れば何をやってるかわかるよね、なものは後からwhereで補足、
ってのが一般的なんじゃないかね。

ただ個人的にはdoの中ではletも使うが、そうでないところでは
ほぼwhereしか使わん。複雑なのは型を明示してトップレベルに書いちゃうし。
ただ、whereと違ってlet in は式なので、declaration styleではなく
expression styleの人はlet の方がいいはず。
0209デフォルトの名無しさん2015/01/21(水) 11:52:00.61ID:g6aErnoK
http://qiita.com/kenokabe/items/61d156005c7831c693cd

毛の壁の新作キター
0210デフォルトの名無しさん2015/01/21(水) 11:52:53.36ID:g6aErnoK
>数学で言う「列(sequence)シークエンス、シーケンス」からsequenceであると考えます。そのままだと長いのでseqあるいはsです。
0211デフォルトの名無しさん2015/01/21(水) 12:13:50.54ID:tSYl3nCX
>>208

なるほど。確かにdo内でwhereを使うのはしっくりこない感じあります
0212デフォルトの名無しさん2015/01/21(水) 12:26:32.64ID:tSYl3nCX
ところでkenokabeさんの記事で初めて、Moggiのクライスリ圏の話を知った。

ボトムとか入出力とか積極的に扱いたい、って需要があって…
1. それをうまくやる方法としてモナドが発見されて、実現のために参照透過性の確保が必要になった。
2. デフォルト遅延評価が採用された。

って経緯だと思うんだけど、
遅延評価なしの言語でモナドってどうなの?
02132122015/01/21(水) 12:48:33.18ID:tSYl3nCX
>>212
違うか、参照透過の為にモナドが必要なんだ。
逆に言うと、モナドを使った結果、(入出力も)参照透過に表現できる。
0214デフォルトの名無しさん2015/01/21(水) 13:32:55.89ID:Oex/ZY2d
????
0215デフォルトの名無しさん2015/01/21(水) 13:57:24.11ID:IlRdpzFj
モナドと遅延評価って直接関係なくないか?
0216デフォルトの名無しさん2015/01/21(水) 14:24:07.34ID:tSYl3nCX
>>215
ないと思うです。
でも Haskell 以外でモナドメジャーじゃないし、どうなのかな、って。
0217デフォルトの名無しさん2015/01/21(水) 14:29:33.51ID:fNn/u+Hw
福島第1原発汚染水、「処理後に海洋放出」 規制委が明文化
0218デフォルトの名無しさん2015/01/21(水) 14:47:43.51ID:tSYl3nCX
ああ。なんか、ちゃんと分かってなかったぽい。。
(>>=)が第一引数に対して正格でないのは何ででしたっけ…
0219デフォルトの名無しさん2015/01/21(水) 14:56:08.53ID:tSYl3nCX
とんちんかんな質問でした、instance定義する側が決めることでしたね…。
0220デフォルトの名無しさん2015/01/21(水) 21:25:39.56ID:abguHzCC
このkenokabeっていうの頭おかしいのと違うか
0221デフォルトの名無しさん2015/01/21(水) 23:17:05.40ID:Vh0iozsQ
ざっくり言うと
遅延評価 → 副作用があるとまずい
その対偶は
副作用無し(≒参照透明) → 遅延評価でも大丈夫
一方副作用は必要
参照透明を保ったまま副作用を扱う仕組みがモナド

>>213で合ってる
0222デフォルトの名無しさん2015/01/22(木) 00:01:32.40ID:yXMo1Viy
>>221
>参照透明を保ったまま副作用を扱う仕組みがモナド

駱駝師匠の受け売りではないが、参照透明を保ちつつモナドで
隠伏的に世界状態を受け渡すのがHaskellのIOのコツなんで、
普通の言語で「副作用」と呼ばれるものを、世界→(値,世界)な
関数としていわば「主作用」にしているというべきではあるまいか。

つうかだな、この観点からは手続き型言語の手続き自体が、
計算機の状態から計算機の状態への純粋な関数なんだよね。
0223デフォルトの名無しさん2015/01/22(木) 00:29:11.30ID:FeOaPmA2
>>222
http://qiita.com/camlspotter@github/items/06b3d8af27feedf91cf2
駱駝師匠ってこれのことだよね?

その観点だとそうなので、だからむしろそういう観点で語られるより、
参照透明(同じ式の値はどこでも同じ)という観点から語って、
手続き型言語とは違うことを強調してることが多いと思う。
0224デフォルトの名無しさん2015/01/22(木) 00:39:11.17ID:3m94e4CI
でも手続き型言語でも値を通常とは違う意味にすれば参照透明か
0225デフォルトの名無しさん2015/01/22(木) 00:54:14.02ID:yXMo1Viy
>>223
うーん、値は値でいいんだよ。
同じ引数で同じ関数を呼び出した時に同じ返り値、ってのが守られてればいい。
引数として計算機の状態を明示的に追加すれば、いわゆる手続きも純粋な関数。
そしてこれは実は参照透明。可変な値は実際には計算機の状態を受け取る関数だから。
0226デフォルトの名無しさん2015/01/22(木) 00:57:47.95ID:yXMo1Viy
まあそうか、手続き型観点のからは、mutableな「変数」を
計算機の状態を受け取る関数として理解するのは「通常とは違う意味」なのかもな。
個人的にはそういう関数として理解することが多いので、ズレてるのかもしれん。
0227デフォルトの名無しさん2015/01/22(木) 01:13:08.79ID:J1v0x3Vw
IOを「世界状態」の関数だと思うのは方便みたいなもので、
個人的には命令を表す抽象型だと思っておく方が誤解が少ないと思う
関数だと思うことで目から鱗が落ちる人も居るみたいだから全否定はできないが
0228デフォルトの名無しさん2015/01/22(木) 01:59:40.16ID:yXMo1Viy
>>227
Hoare論理とか手続き型の表示意味論とか考えるとむしろ「世界状態の関数」という理解の方が本筋に思えるのだよ。
命令を表す抽象型、という方が便利な方便に思える(いや確かに1級の値として扱えるし便利なんだが)。
0229デフォルトの名無しさん2015/01/22(木) 02:41:58.82ID:AOQ2U7ss
>>221
どうでもいいけどそれ対偶じゃなくて逆じゃないかと思うのだが
0230デフォルトの名無しさん2015/01/22(木) 02:54:10.14ID:yXMo1Viy
>>229
対偶は「副作用があってもまずくない→遅延評価でない」
逆は「副作用があるとまずい→遅延評価である」
裏は「遅延評価でない→副作用があってもまずくない」

「副作用無し→ 遅延評価でも大丈夫」はこのいずれでもない。
0231デフォルトの名無しさん2015/01/22(木) 07:11:06.21ID:mciTShj5
>>229-230
遅延評価 → 副作用があるとまずい

遅延評価 → 副作用あり → まずい
だからflipして戻すと
副作用あり → 遅延評価だとまずい
で、裏を取れば
副作用無し → 遅延評価でも大丈夫
ということで意味的には逆(裏)のつもりだったけど、
書き方がまずくて対偶だと勘違いした。
0232デフォルトの名無しさん2015/01/22(木) 07:29:09.34ID:yXMo1Viy
>>231
お前さんがしたいだろう主張の正しい定式化は

(遅延評価が採用されている ∧ 副作用がある) → 動作がまずい
⇔遅延評価が採用されている → (副作用がない ∨ 動作がまずい)
⇔遅延評価が採用されている → (副作用がある → 動作がまずい)

だ。これはお前さんの

(遅延評価が採用されている → 副作用がある) → 動作がまずい

ではない。「flipして戻すと」とか最初からできない。
その時点で逆だの対偶だのと関係なくなってるわ。
0233デフォルトの名無しさん2015/01/22(木) 07:59:21.85ID:hihrfS9D
>>231のカッコの付け方もそれと同じだよ?
0234デフォルトの名無しさん2015/01/22(木) 08:20:28.03ID:yXMo1Viy
>>233
それなら「flipして戻す」とかできないだろ。
前2つは「→」で結合されてないんだからな。
0235デフォルトの名無しさん2015/01/22(木) 08:24:04.14ID:gOPwVEDJ
>>234
flip :: (a -> (b -> c)) -> (b -> (a -> c))
なんですけど…
0236デフォルトの名無しさん2015/01/22(木) 08:43:59.72ID:C1enpK1T
>>220
しぃっ!
0237デフォルトの名無しさん2015/01/22(木) 08:45:42.60ID:7Blthlt5
kenokabeさんはUCLAを卒業してるんだから刃向かうなよ
0238デフォルトの名無しさん2015/01/22(木) 08:46:07.01ID:J1v0x3Vw
>>228
IOを世界状態の関数だと思うと、例外とか並行性で訳分からなくならない?
例えば、mv :: MVar Intのとき、
modifyMVar_ mv (return . (+2))

modifyMVar_ mv (return . (+1)) >> modifyMVar_ mv (return . (+1))
は違う意味だけど、この二つが異なる「関数」だと言うのは簡単じゃない気がする
0239デフォルトの名無しさん2015/01/22(木) 09:12:23.26ID:yXMo1Viy
>>235
ありゃ、そらそうだ。すまんね。だが、それで言えるのは

副作用がある → (遅延評価が採用されている → 動作がまずい)

なので(これは正しい定式だ)、
>>231が「flipして戻す」をしてないってこったね。
0240デフォルトの名無しさん2015/01/22(木) 09:14:16.99ID:yXMo1Viy
ん、ありゃ混乱してきた。
>>231は「flipして戻す」はしてるのか。すまんほんとうにすまん。
眠くてボケてるな。

単に対偶とか逆とか裏とかを取るそういう操作じゃないってだけだ。
0241デフォルトの名無しさん2015/01/22(木) 09:28:26.88ID:m5cyHAPk
いえ、ニュアンスは伝わってますよ。
おかげさまで、遅延評価とHaskell の関わりが解りました。

全域が参照透過だからこそ、遅延評価をデフォルトにできたんすね。

圏論の枠組みで値を扱いたい

Moggi「モナドあれ」

入出力含む全てを参照透過にできた → コンパイラが攻撃的になれるので動作速度も上がった

遅延評価をデフォルトにできた → モジュール性上がった
0242デフォルトの名無しさん2015/01/22(木) 09:33:24.41ID:luu2eUXm
>>239-240
a → b だとまずい = a → (b → まずい)
b → a だとまずい = b → (a → まずい)
は両方とも意味は同じなんだけど、同じ意味に対して書き方が二つあって、
左辺の逆、裏、対偶は違うものになるってことだと思う。
0243デフォルトの名無しさん2015/01/22(木) 09:39:51.90ID:luu2eUXm
>>241
参照透過にしたい & 遅延評価にしたい

副作用の扱いに困る

モナドを使えば良いことに気づく

だよ。

ちなみにkenokabeが圏論とか言ってるのは完全にデタラメだよ。
0244デフォルトの名無しさん2015/01/22(木) 09:45:32.68ID:luu2eUXm
>>242
すまん、これは括弧無しだとさすがにまずかった。
a → (b だとまずい) = a → (b → まずい)
b → (a だとまずい) = b → (a → まずい)
0245デフォルトの名無しさん2015/01/22(木) 10:03:41.42ID:m5cyHAPk
>>243
へええ、参照透過も遅延評価も結果じゃなくて目的だったんですか!

Haskell と圏論の繋がりがわかんないです。
そういえば訳本の教科書には圏論のけの字も出てこないし、Preludeではidも(.)もCategoryのクラスメソッドじゃないし、歴史的にはクライスリトリプルをモナドとして基幹に採用して以来、徐々に圏論を取り入れてきた、って感じなんすかね。
0246デフォルトの名無しさん2015/01/22(木) 10:14:15.85ID:TlerM3mu
圏論は性質を満たすパターンを集めたものだからさ、デザインパターン集みたいなもんだよ。
OOP で言うデザインパターンはイディオムだけど、 Haskell では型クラスとして記述可能にしているという違いはある。
つっても、例えばモナドがモナド則を満たすかどうかみたいにインターフェイス以外に必要なルールはプログラマの責任だけどな。
0247デフォルトの名無しさん2015/01/22(木) 10:22:57.72ID:ZxT+7VDJ
圏論の考え方でつくられた、JavaScriptで動作する純粋関数型プログラミング言語 spinoza (スピノザ)〜その形式的定義と数学的基盤
http://b.hatena.ne.jp/entry/qiita.com/kenokabe/items/61d156005c7831c693cd
0248デフォルトの名無しさん2015/01/22(木) 10:28:47.74ID:m5cyHAPk
kenokabe 氏の記事はちゃんと読めてないけど、「圏論を導入したのは遅延評価が目的って強弁してたら副作用の除去が目的って主張する関数屋さんに絡まれた。はいここ重要」みたいに言ってたような。

実際は両方が重要だったってことね。
0249デフォルトの名無しさん2015/01/22(木) 10:38:43.08ID:y/T1Azr6
>>246
圏論はデザインパターン、ですか。そういう視点は無かった。勉強になります。
0250デフォルトの名無しさん2015/01/22(木) 10:53:22.85ID:C1enpK1T
入力待ちとかしてるアイドル状態間にガベコレ発動させとくことってできないの?
0251デフォルトの名無しさん2015/01/22(木) 11:39:34.25ID:yXMo1Viy
>>250
System.Mem ( performGC:: IO() ) 使えば?
0252デフォルトの名無しさん2015/01/22(木) 12:12:33.73ID:J1v0x3Vw
>>250
-threadedを付けてコンパイルするとデフォルトで0.3秒のアイドル後に自動GC
https://downloads.haskell.org/~ghc/6.10.1/docs/html/users_guide/runtime-control.html#id2622480
0253デフォルトの名無しさん2015/01/22(木) 12:16:17.06ID:yXMo1Viy
お、便利。
0254デフォルトの名無しさん2015/01/22(木) 12:25:44.90ID:vPFLQWei
遅延評価の目的は再帰的データ構造 (再帰関数には遅延評価は必要ない)
xs = 'x' : xs

参照透過の目的はデータ構造を初期化する順序を自由にすること
(関数を定義する順序は元々問題なかった)
xs = foo 'x'
ys = foo 'y'
0255デフォルトの名無しさん2015/01/22(木) 15:19:16.52ID:C1enpK1T
>>252
流石です
0256デフォルトの名無しさん2015/01/22(木) 16:51:17.12ID:JA0C5j9T
お、kenokabe、コメント欄含めてエントリを消しやがったwww
そして別エントリとして同じ内容を投稿かwwww
0257デフォルトの名無しさん2015/01/22(木) 22:03:05.55ID:K0V9CDcS
>>245
圏論をプログラミング言語の理論に応用してその結果を取り入れようという流れと、
圏論の構造を言語内に取り込もうという流れがあると思う。
モナドの場合はMoggiは前者の意図だったんだけど、Wadlerが後者もやった。
後者は比較的最近の流れで、元々は圏論を取り込もうという目的はなかったと思う。
>>246が言ってるのは後者の話で、Haskellに関する前者の話も沢山ある。
0258デフォルトの名無しさん2015/01/22(木) 23:32:32.10ID:+0By/pHu
>>212
クライスリ圏は、名前の通りKleisliという人の研究に基づく。
後に言う Kleisli triple は圏論の一般論の中で整理された。整理された後もしばらくは triple
と呼ばれていたが、複合語を作るときに triple だと困る(字面上意味不明の言葉になりやすい)
ため、MacLaneがモナドという名称を提案した。モナドという名称はライプニッツの単子論から借りてきたものだけど、ただ単に名前を借りてきたというのが実情。
(「カテゴリー」なんかも元々はアリストテレスの哲学に関連する用語の名詞を借りてきたもの。)
ただし、モナドは関手圏における「一般化された半群(モノイド)」とみなせるという事情があり、「モノイド」と音が近い哲学用語として「モナド」が選ばれたというぐらいの意味はある。
以上のことは「圏論の基礎」pp.183-198 あたりをよく読めば判る。そして、この辺のことは数学の内部での動機によって研究されていて、
コンピュータサイエンスとはあまり関連が意識されていなかった。


Moggiは "Computational lambda-calculus and monads" で計算の圏論的意味論を示した。この中で彼は色々な種類の「計算」が
X --> T(Y) という形の「射」として捉えられると主張した。ただし、Tは考えている圏における自己関手。ところで、このような「計算」
の合成可能性を考えると、Tは自己関手であるにとどまらず、モナドであることが要求される。(要点は、T(T(X)) のような「二重の文脈」
を一重つまりT(X) の形に解くことができるかということ)。カルテジアン積を持つ圏を考えるともう少し強い性質が要求されるが、
これが「強モナド」というもの。

Moggiの論文はいくつかの例が取り上げられており、たとえば状態モナドなども扱われている。関数の内部状態のような、数学的には
ちょっと扱いに困るようなものが、Moggiの示した工夫に依ってうまく扱えるということは、「純粋な関数」(従って呼ばれる毎に遷移する内部状態を持たない)
たちとモナドを組み合わせて、「内部状態を持つ関数」などをシミュレートできるということを意味する。
0259デフォルトの名無しさん2015/01/22(木) 23:39:27.07ID:+0By/pHu
>>258
じゃあなんで「純粋な関数」に固執する意味があるのか。

個人的にはあんまないと思うけど、一応

1.純粋な関数であれば(呼び出し回数に応じて返す値が変わるようなことはないので)最適化しやすい(ほんとかなぁ)。
2.最外最左簡約のように、「同じ部分式を何度も評価する」ことになりやすい評価戦略を選んだ場合、もし関数の純粋性が保証されているならば
  「グラフ簡約」のような最適化手法により、良いコードが生成できる(ことがある)。

なんてことはあると思います。じゃあなんで「最外簡約」みたいなマイナーな評価戦略を使いたいかといえば

・無限リスト、例えば [1 ..] みたいのが余裕で作れて表現力が増す。

ぐらいしか思いつきませんが、とにかく「計算の結果次第で配列の長さが変わる」ような計算を、あまり
チマチマとしたコードを書かずにズバッと書けたりして俺TUEEEできるというのがいいんですかね。

まあ頭いい人は放っておくと変なものを作るということなんだと思います。
0260デフォルトの名無しさん2015/01/22(木) 23:57:29.31ID:+0By/pHu
>>259
蛇足。

「最外簡約」は、構文木を根の方から評価しようという評価戦略で、評価の実態からそのように呼ばれている。
一方で、プログラミングする人の気持で、構文木の終端が評価の最後の方にまで遅延されるという印象に基づいて
「遅延評価」とも呼ばれます。

いずれにせよ「遅延評価」をあまり神秘的に考える必要はないです。
0261デフォルトの名無しさん2015/01/23(金) 02:43:28.47ID:9Ll9FhEC
正格評価に対する遅延評価の利点として
停止する可能性がある計算は必ず停止するというのがあったと思うんですが
それはあまり重視されない?
0262デフォルトの名無しさん2015/01/23(金) 03:19:59.17ID:jnn1J11N
そっちのほうが重視されると思う
0263デフォルトの名無しさん2015/01/23(金) 11:34:44.27ID:FG7Cgjgq
停止しない関数って本当に純粋な関数なのか?
無限ループは副作用じゃないか
同じ引数で結果が2通り以上になるのは副作用
なら0通りも副作用ではないか
0264デフォルトの名無しさん2015/01/23(金) 11:58:54.97ID:5jDftkrl
>>263
>無限ループは副作用じゃないか

f(n) = f(n-1)はたとえば、f(5)=f(4)で、同じ引数なら同じ結果の純粋な関数だ。
単に続けてf(4)も計算しようとするから停止しないだけ。
それが気に入らないなら、停止しないということを「⊥ ボトム」という値で
表現すれば、f(5) = ⊥ は常に成り立つんだからやっぱり純粋性は保たれている。
0265デフォルトの名無しさん2015/01/23(金) 13:07:46.09ID:FG7Cgjgq
⊥はNothingに似てるしMaybeはMonadだから副作用と関係ありそうだけどな
0266デフォルトの名無しさん2015/01/23(金) 13:15:42.27ID:mGGgFMZE
ない
0267デフォルトの名無しさん2015/01/23(金) 13:39:39.55ID:5jDftkrl
>>265
>⊥はNothingに似てるしMaybeはMonadだから副作用と関係ありそうだけどな

そういう適当な連想ゲームしてっとkenokabeになるぞ。
0268デフォルトの名無しさん2015/01/23(金) 14:05:12.06ID:FG7Cgjgq
日本語や英語を使っている時点で同じ穴の狢
だからプログラミング言語がある
0269デフォルトの名無しさん2015/01/23(金) 15:05:27.84ID:mGGgFMZE
何言ってんだおまえ
0270デフォルトの名無しさん2015/01/23(金) 16:28:32.03ID:hSE1K7on
ttp://blog.jle.im/entry/io-monad-considered-harmful
0271デフォルトの名無しさん2015/01/23(金) 16:52:38.24ID:mGGgFMZE
毛の壁マジでQiita潰しそうだな
あんなバカ記事ストックしてる奴らも悪いけど、ある意味すげーわ
0272デフォルトの名無しさん2015/01/23(金) 17:49:56.81ID:he2eREiv
半月くらい前のアレから毛の壁見てなかったけどまだやってんのか…。
少し読んだら前だけじゃなく後ろからも手斧飛んでて笑った。
何がしたいんだよ。
0273デフォルトの名無しさん2015/01/23(金) 18:00:53.81ID:FG7Cgjgq
スパゲッティは上流工程で起きている
0274デフォルトの名無しさん2015/01/23(金) 22:03:27.40ID:psNR2ovj
cabal sandbox init したディレクトリを丸ごとどこかにアップロードし、
それを別のマシンにダウンロードして、そこで元と同じ環境になるようにしたい。

この場合、cabal.sandbox.config ファイルの中に書かれている絶対パスを
それぞれのダウンロード先の環境に合わせて書き直さなければならないの?
たとえば、local-repo: [なんとか]/.cabal-sandbox/packages の値とか。

この [ なんとか] の部分を消して相対パスにしたら、パスが見つからないというエラーが出た。
■ このスレッドは過去ログ倉庫に格納されています