トップページtech
1002コメント372KB

関数型プログラミング言語Haskell Part29 [転載禁止]©5ch.io

■ このスレッドは過去ログ倉庫に格納されています
0001岡部メモリリーク健2015/07/14(火) 19:27:09.01ID:jJ1YDtNe
関数型プログラミング言語 Haskell について語るスレです。

         ,.-―: ̄`ー::::::::::、
       /::::::::::::.::::::::::::::::::::::::::::`::、、
      /::::::::::::::::::::::::::::::::::::::::::::::::::::::`、
      l::::::::::::::::::::::::::::::::::::::::;':l:::::::::::\::l
      l:::::::::::::::::::::::::::::::::,,::::::::;-,:,::::::::::::::::l
     l::::::::::::::::,_,.::::,';::::::;:::::: :: l ::::::::::::::l
     l::::::::::/-/:::/-ニ,.::::/=,./::::::::::l
     ヽ:::: ´、ひ> ;:  l .<ひ>'  、::::::::/
    ヽ:::::    ̄ .)::;  l  ̄   l::::/    < 毛の壁(岡部健)の話は禁止な
     、:::::..   /:::; .,-、     l:::/、
    ,―::::::::  ゝヽ- ー' 、    l::/,、ヽ
     l,、,、,,:、:: / ,--、,-.、_ l    /::::::,、,、l
   l,、,、,、,、,、::、 `ー ̄-'   /:::::::::::,、,、l
   l,、,、,、,、,、,、::ヽ      /::::::::、,、,、,、,ノ:\

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

前スレ
関数型プログラミング言語Haskell Part28
http://peace.2ch.net/test/read.cgi/tech/1428535861/
0369デフォルトの名無しさん2015/08/27(木) 15:33:29.45ID:sT+Vb4An
>>364
うんうん、それもまた反知性主義だね!

反知性主義者たちがどんどん集まってきてうれしい。
Haskell界で声がでかい人で圏論にハッキリ嫌悪感を示してる人って山本センセぐらいしか
いないんで、貴重な同士だわ〜
0370デフォルトの名無しさん2015/08/27(木) 15:38:27.37ID:sT+Vb4An
>>368
なんか糖衣にくるんで圏論に誘導しようとしてるような感じがして嫌だな。
参考文献に悪名高いMoggi(こいつのせいで調子こいて圏論言うやつが計算機科学に入ってきた)
が挙がってるし、ろくなもんじゃないだろ。

そもそも反知性主義者である俺は英語論文を読むなどというスノビズムに染まった行動には断固として反対なのだ。
日本男児なら日本語で語れ!
0371反知性主義者2015/08/27(木) 15:40:14.71ID:V7YRDu0j
dg非jドアsポあjふぃおs打ksgふぁ: 打sjgdl:s
dscじょぎkdさkjgdskげj子rイオdsgkあd祖gsだ

j御k自ソアdgjポdsjgぴおdsあぽgだぽあ
0372デフォルトの名無しさん2015/08/27(木) 15:44:45.48ID:a/bxJDEM
>>366
まあStateモナドは確かにそうなんだけど
そういう意味じゃなくてSTモナドも含めてきっちり実用面まで含めて状態計算関連の説明してる所ってほとんどないよね、ってことが言いたかった
ソース読めって言われればそれまでだけど
0373デフォルトの名無しさん2015/08/27(木) 15:48:48.19ID:sT+Vb4An
だいたいね、

``It is doubtful that the structuring methods presented here would have been
discovered without the insight afforded by category theory.''

とか言い出してるあたりで、「あーこいつ自分が圏論を知ってますアピールしとるな」
と分かるじゃん。心の底では「Moggiくらいお前ら読めよ」とか思ってるわけ。
自分では圏論信者なんだけどそれは小乗の教えだとか密教だと思ってるわけ。
それで、大乗というか大衆バージョンの教えとして「ほら経典なんか勉強しなくても
この車輪を手で回すだけで救われますよ」とか大衆をバカにした布教をしてるんだよね。

そういう態度がいちいち鼻につくからね、圏論厨はキモいんですよ。
0374デフォルトの名無しさん2015/08/27(木) 15:59:38.82ID:V7YRDu0j
じゃあどうするっていうんだ?
圏論的背景があるのはどうしたって動かせないだろう。
真髄を理解したければ圏論は必要じゃないか。

真髄は必要ない、ただ使えればいいっていう人向けの情報が嫌なら
もう Haskell 使うなよとしか言いようがないよ。
0375デフォルトの名無しさん2015/08/27(木) 17:02:40.00ID:SD+R1pbM
>>372
STモナドはIOモナド理解してればそのまま使えるよね?
そして、IOモナド・STモナドの仕組みは原理としては別に難しくない
0376デフォルトの名無しさん2015/08/27(木) 17:06:24.88ID:6g/R3ZXu
逆にわたくし、haskellしばらく勉強してきまして
そろそろ裏でどういう理論づけがあるのかなーみたいなことを知りたくなってきたのですが、
何かしらおすすめのルートはございますか(普通に圏論に入門してみればいいの?)
0377デフォルトの名無しさん2015/08/27(木) 17:37:41.46ID:a/U6YIqa
反知性とかそういうのじゃなくてな、haskell初学者を惑わせるだけの圏論の話なんて必要無いってだけなんだ。
初心者が聞く「モナドって何?」っていう質問に圏論的な説明はじめるのは迂遠過ぎてhaskell難しいっていう印象しか残せない。

単に「中の値を直接取り出せないようなコンテナ型であっても、その中身を(安全に)操作、合成するための技法」の1つであると言えばいいのに、
それを「何故モナドという名前なのか」という意味に曲解し、そこだけ説明したり訂正したりする奴がいるから、haskellの真髄は圏論であると勘違いする人が出てくる。

圏論じゃなくて型付けラムダ計算あるいはSystemFがhaskellの基礎でしょ。
Control.MonadやControl.Categoryはあくまでも利便性を高めるためにあるもの。無くても不便なりに使える。
>>376 なので、haskellのコアな部分というなら型理論を学べば良い。ライブラリの中には圏論をベースにしたものがあるから、そっちの理論的背景を学びたいなら圏論を学べば良い。
圏論は間違ってもマクレーンの本からはじめない方がええ。最近ならもっといい(例が数学的過ぎない)文書がネット上にもある。
日本語だったら前スレにも出てた↓とか。
http://nineties.github.io/category-seminar/#/
0378デフォルトの名無しさん2015/08/27(木) 18:03:40.63ID:sT+Vb4An
>>377
自分は反知性主義を掲げて圏論厨を批判してるけど、「なぜモナドという名前なのか」とか言い出す
圏論厨は見たことない。

マクレーンが隠れ哲学厨だったんで範疇論から名を借りてcategory とつけた分野に、
ついでにライプニッツの単子論から名前を借りて(こっちはもう本当に名前を借りただけ)
monad と呼んだだけで意味とか全くないし。

それまでは triple と呼ばれてたんでまともな複合語が作れないという問題があったから
モナドと呼ぶほうがマシじゃんぐらいの意味しかない。

ほらね、圏論ってのは意味がないんです。やめましょう。
0379デフォルトの名無しさん2015/08/27(木) 18:34:38.62ID:75t8dyUl
Haskellの真髄は(->)
型クラスがなくても(->)は存在する
(->)がなければMonadもCategoryもない
0380デフォルトの名無しさん2015/08/27(木) 18:35:35.68ID:sT+Vb4An
>>376
圏論はやらんほうが人生を有効に使えると思いますが、人生を無駄にしたいというなら

Benjamin C. Pierce "Basic Category Theory for Computer Scientists"

あたりはお勧めできます。ただしモナドは載ってません。とはいうものの索引まで入れて100pなので
圏論がどんなものか概観するにはちょうど良いでしょう。100pもあんのかよ、というツッコミもあるでしょうが
ラムダ計算の領域理論のための議論も含まれてるので、Hask圏をゆるっと理解したい程度なら
領域理論の準備の箇所を飛ばせばいいと思います。

他に、もうすぐ共立から邦訳が出ますが

Steve Awody "Category Theory", 2nd ed.

あたりも好評のようです。非常に丁寧に書かれてる本ですが、丁寧ということは長ったらしいという
ことでもあり、いちいち説明が大仰だったりする感もないではないです。

みなさんも仰ってるとおり圏論なんてのは言葉づかいにすぎないわけで、日常会話程度なら
大げさな本で勉強せずともよろしいという人は、圏論の教科書ではありませんが

J. L. Bell "Toposes and Local Set Theories" ←Doverなのでそこそこ安い

の最初(一章)の20pぐらいまでを眺めるとよいでしょう。モナドは載ってませんが米田ぐらいまで一気に話が進みます。

Pierce とかBellをざっと眺めるぐらいの理解をしておけば

ttps://ja.wikibooks.org/wiki/Haskell/圏論

の議論は簡単に理解できるでしょう。理解したからといってHakellのコーディング能力は一ミリも伸びないと思うけど、
とりあえず「return,join でモナド実装するのがスッキリしてわかりやすいと思うな」とか言い出した奴に
ドヤ顔で「うんうん、圏論で言う eta, mu だね」と返せるようになります。
0381デフォルトの名無しさん2015/08/27(木) 20:00:44.71ID:kht9K5Vg
>>361 その前に頭の良さの定義を頼むw
0382デフォルトの名無しさん2015/08/27(木) 20:03:43.73ID:gHMFOOrZ
>>380
反知性主義者というので期待してたが
結構知ってるよ的なので、ガッカリしたw
0383デフォルトの名無しさん2015/08/27(木) 20:18:05.69ID:kht9K5Vg
お前ら人間なめんなよ、子供の算数を集合論ではじめときゃいいんだよ。
0384デフォルトの名無しさん2015/08/27(木) 21:38:54.38ID:gHMFOOrZ
>>364
> VisitorとSingletonとIterator
これらデザパタはクソなのだが、モナドも同類なのか?
>「純粋関数型言語で副作用はどう書けばいいのか」という初学者の質問に「IOモナドがー」
Moggiはじめ皆そう言ってきてるんだが違うの?
> ttp://blog.jle.im/entry/io-monad-considered-harmful
これモナドを全否定してるかと思ったらそうでもないので期待外れ

>>377
> 圏論じゃなくて型付けラムダ計算あるいはSystemFがhaskellの基礎でしょ。
圏論は後者とどう違うという認識?
0385デフォルトの名無しさん2015/08/27(木) 21:59:24.02ID:b8i3sMHc
>>377 >>380
ありがとうございます。
なんかある程度勉強してからだと「あ、そういうことね」っていうふうになれそう
というのに最近出会ってちょっと悔しかったので、やってみます
0386デフォルトの名無しさん2015/08/27(木) 22:16:22.24ID:kht9K5Vg
tapl
0387デフォルトの名無しさん2015/08/27(木) 22:41:39.44ID:sT+Vb4An
>>386
Benjamin C. Pierce "Types and Programming Languages"  ですね。 "Basic Category Theory for Computer Scientists"
のようなコンサイスな本を書いた人がなぜこんな風に長ったらしく書いたのか不思議ですが丁寧な本ですね。
もう少し読者の数学的マチュリティを信頼して書いてくれたら簡潔になっただろうにと思うとそこんとこ残念ですが。

>>384
圏論と型付ラムダ計算との関係については、J. Lambek and P. J. Scott "Introduction to Higher Order Categorical Logic"
なんかを見ると良いと思います。
0388デフォルトの名無しさん2015/08/27(木) 23:45:18.92ID:SD+R1pbM
圏論ねえ。数学的興味からHaskelltoha関係なく勉強したのだが、
Haskellに関する限り、Ekmettが何してるのか理解したい時に
少し役に立つ程度だと思う。
0389デフォルトの名無しさん2015/08/27(木) 23:58:49.19ID:Rek5NYGp
Haskellと圏論の関わりなんて、IOを無矛盾に扱うために言語に追加導入できる最良の道具だったってだけのことで、
ラムダ計算とLisp・一階述語論理とPrologのような、その生い立ちに根源的に関っているもんじゃないからね
オナニーの道具としては最高なんだろう
0390デフォルトの名無しさん2015/08/28(金) 04:26:11.78ID:SsK9tv39
普通andとorとnotしか使わないから述語論理も要らないな
0391デフォルトの名無しさん2015/08/28(金) 10:12:07.75ID:ngZ5utA1
鹿児島県の伊藤祐一郎知事に言わせれば
「高校教育で女の子にサイン、コサイン、タンジェントを教えて何になるのか」
「社会の事象とか、植物の花とか草の名前を教えた方がいい」
ということになる。
0392デフォルトの名無しさん2015/08/28(金) 14:21:25.95ID:UpW/wiba
>>390
普通∀や∃も使うだろう
0393デフォルトの名無しさん2015/08/28(金) 14:56:36.00ID:SsK9tv39
>>391
関数の名前は知ってるけど内容は知らないんだろ
植物の名前でも同じことだ
名前ばっかり宣伝するのは本当に無意味だからやめればいい
0394デフォルトの名無しさん2015/08/28(金) 16:13:34.32ID:hUebxbgg
ひゃっほーう stack 環境下でエディタの補完が効くようになったぜ!
0395デフォルトの名無しさん2015/08/28(金) 20:02:41.16ID:UpW/wiba
圏論とHaskellとモナド。。。。。
ちょっと話が面白くなってる気がするな
反知性主義者や山本さんやらが出てきて。
勿論知性主義者が出てきてもいいよ
あれを読めとか何かを教えてやったとかつまらんこと言わずに
自分の見解を言ってくれ
0396デフォルトの名無しさん2015/08/28(金) 21:14:35.56ID:YaVx9p2L
圏論なんてそんなに構えて勉強する、なんてスゴイものじゃないよ
おれはバカンス先のホテルで2冊も読んだらだいたい分かったよ
0397デフォルトの名無しさん2015/08/28(金) 22:12:50.40ID:UpW/wiba
>>396
「スゴイ」とか「分かった」という語句を使う点がなんだかなと思うが。。。
すぐに分かったと言うあなたとなかなか分からん奴とは何が違うと思うか語ってみてくれないか
0398デフォルトの名無しさん2015/08/29(土) 14:46:46.88ID:bSBiDVBZ
「C++完全に理解した」
0399デフォルトの名無しさん2015/08/29(土) 23:11:48.82ID:VDxSZNt2
cabal について質問です。

.cabal/config ファイルの documentation の項を True に設定すれば
cabal でインストールしたパッケージのドキュメントが追加され、
ドキュメントルート内にある index.html ファイルが更新されますが、
その際に index.html ファイルの更新のされ方を指定する方法はあるでしょうか。

具体的には、index.html に張ってあるリンクの URL をデフォルトから変えたいです。
たとえば、ただいま index.html 内の Data.List へのリンクの URL は、
最後 Data-List.html で終わっています。
これを base-4.8.0.0/Data-List.html のように文字列を加えたいのです。

.cabal/config ファイルにはパッケージのインストール先を指定する項目はありますが、
このようにドキュメントのリンクの URL を指定する項目は見あたらないようです。

不可能なのでしょうか。
0400デフォルトの名無しさん2015/08/29(土) 23:27:12.74ID:UzL1ueYp
>> 399
たぶん、haddockセクションの html-location の項がそれ。
0401デフォルトの名無しさん2015/08/29(土) 23:38:33.21ID:VDxSZNt2
>>400
そこに文字列を入れ、いろいろなパッケージをインストールしてみましたが、
何も変わりませんでした。
0402デフォルトの名無しさん2015/08/30(日) 00:01:23.79ID:U2/m8tQL
ひょっとして、コメントアウトを外してない、なんてことはないかい?

-- html-location:

html-location: hoge
にしないといけないよ。
0403デフォルトの名無しさん2015/08/30(日) 00:21:30.92ID:XpmQg4Hy
>>402
もちろん、コメントは外しています。
0404デフォルトの名無しさん2015/08/30(日) 00:38:28.61ID:XpmQg4Hy
>>403
ちなみに、cabal install --haddock-html-location='・・・' で直接指定しても何も変わりませんでした。
0405デフォルトの名無しさん2015/08/30(日) 02:57:07.12ID:U2/m8tQL
>>404
以前似たような質問をしてた方と同じ人ですか? 
前回ともども、ろくすっぽ調べもせずテキトウに答えちゃってごめん。

いろいろ試してみたんだけど、どうやら無理っぽい。
html-locationはその時にインストールしたパッケージの内部のドキュメントのリンク先を変えるものらしい。
haddockにある別のオプションを変えることで、ドキュメント右上のContentsや、Indexの参照先を変えることはできた。
でも、ご所望の、パッケージが依存している別のパッケージのドキュメントへのリンクは、書き換えられないみたいだ。

すべてのパッケージのドキュメント位置の情報は、ghc-pkg が握ってる。

$ ghc-pkg field '*' haddock-html
...
haddock-html: /usr/local/Cellar/ghc/7.10.2/share/doc/ghc/html/libraries/array-0.5.1.0
haddock-html: /usr/local/Cellar/ghc/7.10.2/share/doc/ghc/html/libraries/base-4.8.1.0
haddock-html: /usr/local/Cellar/ghc/7.10.2/share/doc/ghc/html/libraries/bin-package-db-0.0.0.0
haddock-html: /usr/local/Cellar/ghc/7.10.2/share/doc/ghc/html/libraries/binary-0.7.5.0
...

これらの情報を参照して、haddockはパッケージのリンク先を書くんだと思う。
だから、やりたいことを実現するには、そもそもの依存パッケージの位置を変えるしかない。
(cabalを通して呼ばれるhaddockにだけその情報を渡す方法があるのかもしれないが、俺の調査ではわからなかった。
cabal installへのフラグ--haddock-option=--optghc=-package-db=hoge/.../package.conf.dなどを試したけど何も変わらず)
0406デフォルトの名無しさん2015/08/30(日) 10:45:14.93ID:XpmQg4Hy
>>405
こちらでは ghc-pkg field '*' haddock-html 出力と、
ドキュメントの index.html 内の各リンクの URL とが異なっています。

たとえば、ghc-pkg field '*' haddock-html の出力では
   /usr/share/doc/ghc/html/libraries/array-0.5.1.0
   /home/.../.cabal/share/doc/x86_64-linux-ghc-7.10.1/random-1.1/html
となっています。
前者は ghc インストール時にデフォルトで入っているパッケージ、
後者は cabal でインストールしたパッケージです。

ところが、/home/.../.cabal/share/doc/x86_64-linux-ghc-7.10.1/index.html では、
Data.Array へのリンクは /home/.../.cabal/share/doc/x86_64-linux-ghc-7.10.1/Data-Array.html
System.Random へのリンクは /home/.../.cabal/share/doc/x86_64-linux-ghc-7.10.1/System-Random.html
になっています。

.cabal/config がデフォルトの状態でこのようになります。


ちなみに、frames.html や doc-index-A.html などの中にあるリンクは正しいです。
また、各モジュール個別のページ内にある他モジュールへのリンクも正しいです。
トップの index.html 内のリンクだけがおかしいのです。


もう少しアプローチを変えて調べてみます。
ありがとうございました。
04074052015/08/30(日) 11:56:14.08ID:U2/m8tQL
ああ、もし、sandbox使ってるんだったら、

$ ghc-pkg field '*' haddock-html
ではなく、
$ cabal sandbox hc-pkg field '*' haddock-html
を呼んでください。

あと、405の時点では「haddockがghc-pkgを内部で呼ぶ」と思ってたんだけど、実は「cabal が haddock に依存先パッケージのドキュメントの位置を渡す」ということがわかった。
cabal install に --verbose=3 を渡して、haddockに渡っているオプションを見て気づいた。
cabal の --package-db オプションの値が、haddockへ --read-interface オプションとして渡されるらしい(ただし、sandboxにいるときは cabal install に直接package-dbを指示しても無視されるみたい)。
0408デフォルトの名無しさん2015/08/30(日) 12:43:47.11ID:XpmQg4Hy
>>407
問題が解決しました。

結論から言うと、最新版の GHC をインストールしたら治りました(7.10.1 --> 7.10.2)。

ここに私と似たような質問がありました。

http://comments.gmane.org/gmane.comp.lang.haskell.arch-linux/2119

要約すると、これはインストール時の設定などではなくもっと上流で起きている問題であり、
以前はオンラインドキュメントでも同じ問題が起きていて、GHC 10.7.2 で治ったそうです。

つまり、私は問題の根本が分からず、とりあえず config ファイルの設定によって URL を変えて一時しのぎをしようと思い、
その方法をここで質問しましたが、最新版で問題が解決され、質問の意味がなくなったということです。

私は ArchLinux を使用しており、GHC も cabal-install も ArchLinux のパッケージシステムを使用してインストールしていましたが、
ArchLinux のパッケージでは GHC の最新版はまだ 7.10.1 のままでした(ArchLinuxは最新版の提供が比較的早いはずなのですが・・・)。
そこで GHC の公式サイトから 7.10.2 をDLしインストールしたところ、デフォルトのライブラリドキュメントも、
その後で cabal でインストールしたライブラリドキュメントも、index.html が正しいリンクを張ってくれるようになりました。

実際のところは、ArchLinux のパッケージだったからまずかったのか、7.10.1 だったからまずかったのか分かりませんが。


cabal の挙動について詳しく解析していただいたのに活用できなくて申し訳ありません。
ただ、その解析方法や情報についてはとても勉強になりました。

ありがとうございました。
0409デフォルトの名無しさん2015/08/30(日) 13:07:09.40ID:U2/m8tQL
おめでとう。
haddockのバグだったのか(cabalではなく)。
haskellのツール周りは色々混み合っててよくわかんないなあ。
0410デフォルトの名無しさん2015/08/30(日) 16:07:36.51ID:XpmQg4Hy
型クラスのメソッドにデフォルトの定義を与えることができますが、
そのデフォルトの定義をインスタンス定義の側から呼ぶことはできるでしょうか。

例えば下記のようなことがしたいです。

class Umai a where
 level :: a -> Int
 level _ = 3

data Nasu = Nasu

instance Umai Nasu where
 level x = Umai.level x * 100

これは最後の Umai.level でコンパイルエラーが出ますが、ニュアンスは伝わると思います。

他にも、デフォルトと同じ挙動をさせたいが、Debug.Trace.trace 関数を仕込んで調査したい時とか。
0411デフォルトの名無しさん2015/08/30(日) 21:36:21.87ID:/UH+7Zkm
instance Umai () where {}
newtype X10 a = X10 a
nasu = X10 (X10 ())

class Oldtype a where { oldtype :: a b -> b }
instance Oldtype X10 where { oldtype (X10 o) = o }
instance Umai a => Umai (X10 a) where { level x = level (oldtype x) * 10 }
0412デフォルトの名無しさん2015/08/31(月) 00:21:09.78ID:VGvD8wHt
()もいいけど、型をラベルみたいにして情報載せるのは、ファントムタイプの出番ですよ。
data Umai a = Umai { defaultLevel :: Int,
season :: Season}
data Season = Spring | Summer | Autumn | Winter deriving Eq

data Nasu
data Tomato

class Level a where level :: a -> Int

instance Level (Umai Nasu) where level = defaultLevel * 100
instance Level (Umai Tomato) where level = defaultLevel * (liftA (== Summer) season ?) 200 100
{--
> level (Umai 1 Summer :: Umai Nasu)
100
> level (Umai 1 Summer :: Umai Tomato)
200
> level (Umai 2 Summer :: Umai Tomato)
400
--}
04134122015/08/31(月) 00:22:07.09ID:VGvD8wHt
ちな
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE FlexibleInstances,TypeFamilies #-}

module Main where
import Control.Applicative

(412の中身)
instance Num n => Num (a -> n) where
(+)= liftA2 (+)
(-) = liftA2 (-)
(*) = liftA2 (*)
abs = liftA abs
signum = liftA signum
fromInteger = const . fromInteger

class Conditional q a where
type ConditionalExec q a
(?) :: q -> ConditionalExec q a -> ConditionalExec q a -> ConditionalExec q a
infixr 1 ?

instance Conditional Bool a where
type ConditionalExec Bool a = a
(?) b x y = if b then x else y

instance Conditional (a -> Bool) b where
type ConditionalExec (a -> Bool) b = a -> b
(?) = liftA3 (?)

main :: IO ()
main = print $ level (Umai 1 Spring :: Umai Tomato)
0414デフォルトの名無しさん2015/08/31(月) 20:29:14.75ID:YNC36to9
>>411 >>412
ありがとうございます。
そのままでは使えないのですが、考え方を参考にさせていただき、応用してみます。


ちなみに、さすがに Umai 型クラスにも、Nasu データ型にも手を加えずに実現する方法はないですよね。
0415デフォルトの名無しさん2015/08/31(月) 21:06:33.97ID:BIyPIWGf
それならデフォルトの実装は別の場所に書いた方がよさそう
手を加えてはならない場所に書くのはリスクが大きすぎる
0416デフォルトの名無しさん2015/08/31(月) 21:21:39.09ID:YNC36to9
>>415
すいません、そういう意味ではなくて、
Umai 型クラスに相当するものがライブラリで提供されていて、
こちらでは手が加えられないのです。

もし方法がないなら、ライブラリのソースはあるので、
アドバイスを参考に改変しようかと思います。
0417デフォルトの名無しさん2015/09/02(水) 01:39:18.87ID:MPctfeu0
質問。infix pattern synonym の結合性って弄れないの?
0418デフォルトの名無しさん2015/09/02(水) 23:39:30.67ID:VgKb5GV5
>>395
なんで君はいつも上目線なんだ
0419デフォルトの名無しさん2015/09/03(木) 05:35:30.84ID:OYAV2gHU
謙虚月間です。皆さん九月は、他人の落ち度より自分の異常を優先して疑い、相手を尊重しましょう
0420デフォルトの名無しさん2015/09/04(金) 12:32:49.27ID:5HbwgMaM
GHC が出力する実行バイナリがえらいデカいんやけど、これどうにかならんの?
0421デフォルトの名無しさん2015/09/04(金) 17:36:40.07ID:KCyhzv12
atomの端末から起動しないとghc-mod使えない不具合辛い
0422デフォルトの名無しさん2015/09/04(金) 21:44:05.44ID:Ziq//RxQ
>>420


対策

1.諦める

2.共有ライブラリを使う

from : ttp://downloads.haskell.org/~ghc/7.10.2/docs/html/users_guide/using-shared-libs.html

>4.13.1. Building programs that use shared libraries

>To build a simple program and have it use shared libraries for the runtime system and the base libraries use the -dynamic flag:

>ghc --make -dynamic Main.hs
0423デフォルトの名無しさん2015/09/05(土) 17:50:27.56ID:zbNENDxs
中置関数の部分適用について理解できないところがあるので、質問です。

まず下記の関数を定義しました。
siplus :: String ->Int -> Int
siplus str num = read(str) + num

普通に使うと次のように動作します。
> siplus "1" 2
> 3

最初のStringを部分適用したものの型を調べると、こうなります。
> :t siplus "1"
> siplus "1" :: Int -> Int

ここで最初のStringではなく、2つ目のIntを部分適用したいと思った時、
例えばこんな書き方はできません。
> :t siplus _ 2
> エラー

しかしこれを中置関数として扱った場合、2つ目のIntのみを部分適用した
関数を作ることができてしまいます。
> :t (`siplus` 2)
> (`siplus` 2) :: String -> Int

これは一体どういうことなのでしょうか?
String -> Int -> Intの関数への部分適用でString -> Intの関数を作り出せてしまうのは、
カリー化の考え方から見て矛盾があると思います。
どういう理屈でこれは成り立っているのでしょうか?
0424デフォルトの名無しさん2015/09/05(土) 18:08:50.90ID:NPRaO0u1
中置演算子の部分適用は、適用する引数をどちらからも選べる特殊な機能で、
普通の部分適用と区別して「セクション」と呼ばれている。
いずれにせよ、実体は (¥str -> siplus str 2) のようなラムダ式作るのと変わらん。
0425デフォルトの名無しさん2015/09/05(土) 18:33:26.79ID:zbNENDxs
>>424
なるほど、つまり中置記法の右側に値を置いたものは、
カリー化とは無関係で単にラムダの糖衣構文ってことなんですね。
0426デフォルトの名無しさん2015/09/05(土) 18:40:53.83ID:NPRaO0u1
まあ、(flip siplus) 2 の糖衣だと思うんでもいいと思うけどな。
0427デフォルトの名無しさん2015/09/06(日) 00:53:10.15ID:wfrbDpC5
二項演算子は後置演算子とみつけたり
0428デフォルトの名無しさん2015/09/06(日) 08:00:48.38ID:SMmxtXxm
Haskellは二項演算子を愛し過ぎてる
1+が綺麗に書けるけど、そんなにこだわる機能じゃないと思う
むしろ二項演算子無くして前置に統一したほうがよく無いかな?
0429デフォルトの名無しさん2015/09/06(日) 08:29:11.83ID:wfrbDpC5
>>428

a * x + b

なんてのをまともに書けない言語はアカンでしょ
0430デフォルトの名無しさん2015/09/06(日) 08:41:14.99ID:SMmxtXxm
>>429
>a * x + b
つ (+ (* a x) b)
0431デフォルトの名無しさん2015/09/06(日) 09:30:37.52ID:wfrbDpC5
>>430
そういうのが好きならLisp使えばいいじゃん。。。
0432デフォルトの名無しさん2015/09/06(日) 09:44:06.70ID:Vj9nK5xC
>>427
それは嘘です
後置演算子の直後の二項演算子はセーフ x! * y
二項演算子の直後の二項演算子はアウト x + * y

>>419
「本当か嘘か」を優先して考え「謙虚か傲慢か」などという雑念は捨てました
0433デフォルトの名無しさん2015/09/06(日) 09:45:15.82ID:OmMBsRo+
煽ってるのをオマエラじゃんw
0434デフォルトの名無しさん2015/09/06(日) 10:14:27.94ID:wfrbDpC5
>>432
うーん、その例と「二項演算子は結合強度最弱の単項後置演算子とみなせる」
がどう矛盾するのかよくわからないです。
0435デフォルトの名無しさん2015/09/06(日) 10:31:40.00ID:Vj9nK5xC
>>434
結合強度を変えてもsyntax errorを覆すことはできません
0436デフォルトの名無しさん2015/09/06(日) 10:59:37.29ID:wfrbDpC5
>>435

x + * y 

によってあなたが何を例示したのか正直まったく理解できないのです。


元ネタは外国のブログ記事だった気がするけど見つからないので自己流解説すると、
なんか二項演算子(算術に限らない。ここでは (#) とする。)があって、そのシグネチャは

(#) :: X -> Y -> Z

だとしますね。そうすると x : X に対して作られるセクション x # は Y -> Z という型を持つわけですね。
そうすると、結局「あたかも」

postfix #
(#) :: X -> (Y->Z)

と定義されていた「かのごとく」見れますねという話をしてるつもりです。
(Haskellでは自前の後置演算子は作れないので上のは嘘コードですが)。
0437デフォルトの名無しさん2015/09/06(日) 17:00:24.15ID:Vj9nK5xC
カリー化ですべての関数が単項演算になるはずだったのですね
ところが構文解析を見ると二項演算が存在する証拠が出てきたので理解できないと
0438デフォルトの名無しさん2015/09/06(日) 20:34:02.72ID:2q2onHzV
概念の話をしてるのに実装の話をされても困りますね
ちょっと上のレスに出てるように二項演算子だと
# x
っていうように後ろの引数だけ適用もできることになってるからこれは後置単項演算子とは別物だよね
0439デフォルトの名無しさん2015/09/07(月) 06:23:10.52ID:+vVUVgP4
素直に実装の話をされて困ることなんてないよ
実装の話じゃないから困らないよな?と言われて困ることはある
{-# LANGUAGE #-} とか
0440デフォルトの名無しさん2015/09/07(月) 21:31:00.77ID:mXAJW74L
二項演算子は単項後置演算子みなせるよね
に対して
構文解析では二項演算子が分けてあるんだよ
と言われても はあそうですか としかならないがな
なぜ構文解析上分けてあるかの理由まで示されると納得しそうだが
0441デフォルトの名無しさん2015/09/07(月) 23:06:47.81ID:+gBmAsnf
>>436
Applicativeスタイルを使うときに出てくる「途中の式」はそうやって考えるとわかりやすいね。
0442デフォルトの名無しさん2015/09/07(月) 23:35:52.84ID:saV1gx5W
>単項後置演算子
今日はじめて知ったんだが、実は出来るぜ。
{-# LANGUAGE PostfixOperators #-}

data Currency = Yen Int deriving Show

(¥) :: Int -> Currency
(¥) = Yen

main = print (105 ¥)
{--
> :main
Yen 105
--}
0443デフォルトの名無しさん2015/09/08(火) 00:02:16.96ID:FdaSRh76
>>440
それが後置演算子だとすると
(2 +)と(+ 2) で(+)が別の演算子だということになってしまう。
数式の構文解析で(-)が単項演算子と二項演算子の両方に使われるせいで
BNFが無駄に複雑化するの知ってるでしょ?
同じことが(-)だけでなく二項演算子一般について大規模に生じてイヤなわけ。
0444デフォルトの名無しさん2015/09/08(火) 04:52:37.64ID:5w88oMs5
>>440
構文は理由より人気を優先した方がいい
どんな理由を示してもおそらくライバルの1.05倍くらいのメリットしか出てこない
一方、理屈抜きで人気投票すれば1000倍とか差がつく可能性がある
0445デフォルトの名無しさん2015/09/08(火) 21:51:21.00ID:1BhJxNoG
「モナドは値を箱の中に入れるので外からは見えない、だから安全だ」
っていう話をよく聞くけど、納得いかない。

例えばMaybeモナドの中に値を入れても、fromJustで簡単に取り出せるし、
入れる時もJustで簡単に入るじゃん。

こんなユルユルの箱に入れたところで何が安全なの?
0446デフォルトの名無しさん2015/09/08(火) 22:00:09.71ID:KAkZMLHa
入れたままで扱えるから便利なんだよ。
(IO は別)
0447デフォルトの名無しさん2015/09/08(火) 22:03:02.01ID:gWCBxnxw
>>445
箱の喩えでいうなら、その箱から中身を取り出したままでいられる仕組みは
モナドの範疇ではないよ。

Monad 型クラスのインスタンスであるその型に付随された
モナドとは何の関係もない機能だ。
0448デフォルトの名無しさん2015/09/08(火) 22:04:03.13ID:FdaSRh76
>>445
>「モナドは値を箱の中に入れるので外からは見えない、だから安全だ」
>っていう話をよく聞くけど、

そんな話を聞いた覚えがないのだが……
0449デフォルトの名無しさん2015/09/08(火) 22:11:56.24ID:CPV+4Ywq
自分も聞いたことないな
安全だって言ってる文献を教えて欲しい
0450デフォルトの名無しさん2015/09/08(火) 22:15:43.73ID:1BhJxNoG
>>447
でも取り出す機能を簡単に付けられるのであれば、箱としての堅牢性は無いに等しいじゃん。
一回入れたらもう出せない!ってのならわかるけど。

>>448-449
IOモナドなんかそんな風に言われるじゃん。
でもIOモナドに入れた値だってfromJustで取り出せる。
0451デフォルトの名無しさん2015/09/08(火) 22:17:47.80ID:FdaSRh76
>>450
>IOモナドなんかそんな風に言われるじゃん。
>でもIOモナドに入れた値だってfromJustで取り出せる。

???
まず前半、聞いたことがない。そういうこと言ってる実例挙げられる?
後半、意味がわからない。
0452デフォルトの名無しさん2015/09/08(火) 22:18:26.87ID:CPV+4Ywq
もしかしてMaybeなどのモナドを使うことで付く分岐による安全性を
「モナドは外からは見えないから安全」という話に思い込んだんじゃ?
0453デフォルトの名無しさん2015/09/08(火) 22:20:00.08ID:1BhJxNoG
出直してきます
0454デフォルトの名無しさん2015/09/08(火) 22:20:30.14ID:CPV+4Ywq
どうやら根本から勘違いしてただけだったか・・・
0455デフォルトの名無しさん2015/09/08(火) 23:38:38.43ID:vkbbpybQ
まあ気持ちはわかるわ。俺もはじめの頃は、Maybeモナドは腑に落ちんかった。
パターンマッチでいつでも値取り出せるじゃん。って。

モナドはデストラクタを隠蔽するのが肝なんだよな。
だからparsecとかIOとかをみて、初めてありがたみがわかった。
0456デフォルトの名無しさん2015/09/08(火) 23:44:27.36ID:FdaSRh76
>>455
>モナドはデストラクタを隠蔽するのが肝なんだよな。

データ構築子のこと?
runXX の形でモナドの実体を取り出せるモナドは珍しくないし、
IOモナドもそこは変わらないよ?
IO aの実体をWorld -> (a, World)として取り出してもありがたくないだけで

>だからparsecとかIOとかをみて、初めてありがたみがわかった。

うーん、その感覚はさっぱり
隠蔽云々とは関係なくリストモナドだろうがIOモナドだろうがありがたいけどなあ
0457デフォルトの名無しさん2015/09/08(火) 23:52:35.54ID:FdaSRh76
Maybeモナドの場合なら、return (つまりJust)に突っ込んで得られない
Maybe a の値、つまりNothingによって集合aを拡大していることになるわけで、
この拡大された集合a+上の計算を、元々のaの計算から自然に与えることが
できるようなそういう拡大の仕方とその構造のことをモナドというわけ。
Maybeほどストレートではないけど、他のモナドも基本は一緒。

これはデータ構築子が公開されててパターンマッチできるかどうか、とか
或いはそれと等価な関数が公開されてるかどうか、とかとは関係のない話。
0458デフォルトの名無しさん2015/09/09(水) 00:06:36.58ID:EJNsNdDh
関数型言語ってのは
要するに
OOPでクラス関数で主に記述するってことと同じでしょ?
メンバ関数・変数をなるべく使わずに

何がすごいのかさっぱりわからない
0459デフォルトの名無しさん2015/09/09(水) 00:14:15.49ID:15Wbqaqp
あなたがそう思うならそれでいいんじゃないの
誰が関数型言語使えと頼むじゃなし使わないと死ぬわけでもなし
0460デフォルトの名無しさん2015/09/09(水) 00:50:04.74ID:+WsBDtot
荒くれ者のC++erがHaskellやると
バグめっちゃ減るんすよwwww
その代わりコンパイル通りににくくなるんで慣れるまでめっちゃ苛々するんすけど
実行時にヘマするくらいならコンパイル失敗した方がマシだってことを学ぶんすよwww

もうC++は体力続かない
三ヶ月前のコードとか読みたくないでしょ
歳取ったらHaskellが良いって解りますよ
Haskellなら三ヶ月前のコード、また読んでみてもいいかなって、それはとっても嬉しいなって
0461デフォルトの名無しさん2015/09/09(水) 01:57:38.90ID:rpodVdIT
>> 457
なんていうか上手く言えないんだけど、例えば、
データ構築子がreturnとbindしか無くて、一方分解子、runの類いがたくさん提供されてるデータを考えてくれ。
どうだいそれって滅茶苦茶役に立たないだろ?
0462デフォルトの名無しさん2015/09/09(水) 02:07:49.07ID:15Wbqaqp
>>461
>データ構築子がreturnとbindしか無くて、一方分解子、runの類いがたくさん提供されてるデータを考えてくれ。

なにが言いたいのか理解できないが、いずれにせよreturn とbind があれば
他のはそれから定義できるんだからなにも問題ない
runXXの類がたくさん提供されてる、というのもよくわからんが、
それで有用性が損なわれるとはちっとも思えない
0463デフォルトの名無しさん2015/09/09(水) 02:09:55.95ID:15Wbqaqp
あと、データ構築子とreturn/bindは違うものなんでそこのところ宜しく
もし、returnでしか当該データ型の値が作れないならrunXX云々以前にそりゃ役には立たない
m a 型の計算が実質的に a 型の計算そのものに崩壊するからな
0464デフォルトの名無しさん2015/09/09(水) 02:28:58.80ID:rpodVdIT
そうそう。そんな感じ。
だからモナドにするならreturn以外にカスタムコンストラクタをたくさん提供するべき。
逆にコモナドなら、コンストラクタは少なくていい。けど、デストラクタはextractだけじゃだめ。

(俺は_ -> Hoge のヤツをHogeのコンストラクタ、Hoge -> _ をデストラクタって呼んでる。異端かもしれんが)
0465デフォルトの名無しさん2015/09/09(水) 02:39:48.87ID:15Wbqaqp
>>464
>だからモナドにするならreturn以外にカスタムコンストラクタをたくさん提供するべき。

いやまったくもって意味不明なんだけど
普通に型定義のデータ構築子がある以上、それを使えばいいんだし、
それらのデータ構築子から構成できないようなものもあり得ない

しかもなんで「べき」なわけ?
Maybe型が役に立たなかったことなんかないだろう
あと、勝手な自分用語振り回されても理解できない(するきになれない)
0466デフォルトの名無しさん2015/09/09(水) 02:57:08.05ID:rpodVdIT
オレオレ用語で分かりにくくて、すまんかった。共通の言葉遣いは大事だよね。データ構築子はdata Hoge a = Hoge ... の奴でいいよね?

ところでさ、ライブラリを作っていて、データの内部表現を公開したくない時があるじゃない?
あとでチューニングしたいときとか。そういう時にデータがモナドなら主に ... -> Hoge a を、コモナドなら Hoge a -> ... を提供する。
return / extract に加えて。

理由は、えー… 逆だと使いづらいから。
(たとえばMaybeなら、fromJustってあんまり使わないでしょ?)
0467デフォルトの名無しさん2015/09/09(水) 02:58:54.11ID:FLIFW6sl
なんか変な主張と独自用語のレスが続くね…
荒らしかな
0468デフォルトの名無しさん2015/09/09(水) 03:07:23.01ID:rpodVdIT
あ゛ーそのつもりはないんだけど… スレ汚してスマンね。

理由が弱いので、もう少し考えると、
例えば、doの途中でrunして値を取り出して、その値で分岐して別のモナディックアクションにつなぐのは、計算量が無駄。
それを避けるためにモナド(手続きの抽象)がある、と俺は理解している。
■ このスレッドは過去ログ倉庫に格納されています