関数型プログラミング言語Haskell Part29 [転載禁止]©5ch.io
■ このスレッドは過去ログ倉庫に格納されています
0001岡部メモリリーク健
2015/07/14(火) 19:27:09.01ID:jJ1YDtNe,.-―: ̄`ー::::::::::、
/::::::::::::.::::::::::::::::::::::::::::`::、、
/::::::::::::::::::::::::::::::::::::::::::::::::::::::`、
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うんうん、それもまた反知性主義だね!
反知性主義者たちがどんどん集まってきてうれしい。
Haskell界で声がでかい人で圏論にハッキリ嫌悪感を示してる人って山本センセぐらいしか
いないんで、貴重な同士だわ〜
0370デフォルトの名無しさん
2015/08/27(木) 15:38:27.37ID:sT+Vb4Anなんか糖衣にくるんで圏論に誘導しようとしてるような感じがして嫌だな。
参考文献に悪名高いMoggi(こいつのせいで調子こいて圏論言うやつが計算機科学に入ってきた)
が挙がってるし、ろくなもんじゃないだろ。
そもそも反知性主義者である俺は英語論文を読むなどというスノビズムに染まった行動には断固として反対なのだ。
日本男児なら日本語で語れ!
0371反知性主義者
2015/08/27(木) 15:40:14.71ID:V7YRDu0jdscじょぎkdさkjgdskげj子rイオdsgkあd祖gsだ
j御k自ソアdgjポdsjgぴおdsあぽgだぽあ
0372デフォルトの名無しさん
2015/08/27(木) 15:44:45.48ID:a/bxJDEMまあ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+R1pbMSTモナドはIOモナド理解してればそのまま使えるよね?
そして、IOモナド・STモナドの仕組みは原理としては別に難しくない
0376デフォルトの名無しさん
2015/08/27(木) 17:06:24.88ID:6g/R3ZXuそろそろ裏でどういう理論づけがあるのかなーみたいなことを知りたくなってきたのですが、
何かしらおすすめのルートはございますか(普通に圏論に入門してみればいいの?)
0377デフォルトの名無しさん
2015/08/27(木) 17:37:41.46ID:a/U6YIqa初心者が聞く「モナドって何?」っていう質問に圏論的な説明はじめるのは迂遠過ぎて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自分は反知性主義を掲げて圏論厨を批判してるけど、「なぜモナドという名前なのか」とか言い出す
圏論厨は見たことない。
マクレーンが隠れ哲学厨だったんで範疇論から名を借りてcategory とつけた分野に、
ついでにライプニッツの単子論から名前を借りて(こっちはもう本当に名前を借りただけ)
monad と呼んだだけで意味とか全くないし。
それまでは triple と呼ばれてたんでまともな複合語が作れないという問題があったから
モナドと呼ぶほうがマシじゃんぐらいの意味しかない。
ほらね、圏論ってのは意味がないんです。やめましょう。
0379デフォルトの名無しさん
2015/08/27(木) 18:34:38.62ID:75t8dyUl型クラスがなくても(->)は存在する
(->)がなければMonadもCategoryもない
0380デフォルトの名無しさん
2015/08/27(木) 18:35:35.68ID:sT+Vb4An圏論はやらんほうが人生を有効に使えると思いますが、人生を無駄にしたいというなら
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:kht9K5Vg0382デフォルトの名無しさん
2015/08/27(木) 20:03:43.73ID:gHMFOOrZ反知性主義者というので期待してたが
結構知ってるよ的なので、ガッカリしたw
0383デフォルトの名無しさん
2015/08/27(木) 20:18:05.69ID:kht9K5Vg0384デフォルトの名無しさん
2015/08/27(木) 21:38:54.38ID:gHMFOOrZ> 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ありがとうございます。
なんかある程度勉強してからだと「あ、そういうことね」っていうふうになれそう
というのに最近出会ってちょっと悔しかったので、やってみます
0386デフォルトの名無しさん
2015/08/27(木) 22:16:22.24ID:kht9K5Vg0387デフォルトの名無しさん
2015/08/27(木) 22:41:39.44ID:sT+Vb4AnBenjamin 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+R1pbMHaskellに関する限り、Ekmettが何してるのか理解したい時に
少し役に立つ程度だと思う。
0389デフォルトの名無しさん
2015/08/27(木) 23:58:49.19ID:Rek5NYGpラムダ計算とLisp・一階述語論理とPrologのような、その生い立ちに根源的に関っているもんじゃないからね
オナニーの道具としては最高なんだろう
0390デフォルトの名無しさん
2015/08/28(金) 04:26:11.78ID:SsK9tv390391デフォルトの名無しさん
2015/08/28(金) 10:12:07.75ID:ngZ5utA1「高校教育で女の子にサイン、コサイン、タンジェントを教えて何になるのか」
「社会の事象とか、植物の花とか草の名前を教えた方がいい」
ということになる。
0392デフォルトの名無しさん
2015/08/28(金) 14:21:25.95ID:UpW/wiba普通∀や∃も使うだろう
0393デフォルトの名無しさん
2015/08/28(金) 14:56:36.00ID:SsK9tv39関数の名前は知ってるけど内容は知らないんだろ
植物の名前でも同じことだ
名前ばっかり宣伝するのは本当に無意味だからやめればいい
0394デフォルトの名無しさん
2015/08/28(金) 16:13:34.32ID:hUebxbgg0395デフォルトの名無しさん
2015/08/28(金) 20:02:41.16ID:UpW/wibaちょっと話が面白くなってる気がするな
反知性主義者や山本さんやらが出てきて。
勿論知性主義者が出てきてもいいよ
あれを読めとか何かを教えてやったとかつまらんこと言わずに
自分の見解を言ってくれ
0396デフォルトの名無しさん
2015/08/28(金) 21:14:35.56ID:YaVx9p2Lおれはバカンス先のホテルで2冊も読んだらだいたい分かったよ
0397デフォルトの名無しさん
2015/08/28(金) 22:12:50.40ID:UpW/wiba「スゴイ」とか「分かった」という語句を使う点がなんだかなと思うが。。。
すぐに分かったと言うあなたとなかなか分からん奴とは何が違うと思うか語ってみてくれないか
0398デフォルトの名無しさん
2015/08/29(土) 14:46:46.88ID:bSBiDVBZ0399デフォルトの名無しさん
2015/08/29(土) 23:11:48.82ID:VDxSZNt2.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たぶん、haddockセクションの html-location の項がそれ。
0401デフォルトの名無しさん
2015/08/29(土) 23:38:33.21ID:VDxSZNt2そこに文字列を入れ、いろいろなパッケージをインストールしてみましたが、
何も変わりませんでした。
0402デフォルトの名無しさん
2015/08/30(日) 00:01:23.79ID:U2/m8tQL-- html-location:
を
html-location: hoge
にしないといけないよ。
0403デフォルトの名無しさん
2015/08/30(日) 00:21:30.92ID:XpmQg4Hyもちろん、コメントは外しています。
0404デフォルトの名無しさん
2015/08/30(日) 00:38:28.61ID:XpmQg4Hyちなみに、cabal install --haddock-html-location='・・・' で直接指定しても何も変わりませんでした。
0405デフォルトの名無しさん
2015/08/30(日) 02:57:07.12ID:U2/m8tQL以前似たような質問をしてた方と同じ人ですか?
前回ともども、ろくすっぽ調べもせずテキトウに答えちゃってごめん。
いろいろ試してみたんだけど、どうやら無理っぽい。
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こちらでは 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 内のリンクだけがおかしいのです。
もう少しアプローチを変えて調べてみます。
ありがとうございました。
0407405
2015/08/30(日) 11:56:14.08ID:U2/m8tQL$ 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問題が解決しました。
結論から言うと、最新版の 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/m8tQLhaddockのバグだったのか(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+7Zkmnewtype 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:VGvD8wHtdata 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
--}
0413412
2015/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ありがとうございます。
そのままでは使えないのですが、考え方を参考にさせていただき、応用してみます。
ちなみに、さすがに Umai 型クラスにも、Nasu データ型にも手を加えずに実現する方法はないですよね。
0415デフォルトの名無しさん
2015/08/31(月) 21:06:33.97ID:BIyPIWGf手を加えてはならない場所に書くのはリスクが大きすぎる
0416デフォルトの名無しさん
2015/08/31(月) 21:21:39.09ID:YNC36to9すいません、そういう意味ではなくて、
Umai 型クラスに相当するものがライブラリで提供されていて、
こちらでは手が加えられないのです。
もし方法がないなら、ライブラリのソースはあるので、
アドバイスを参考に改変しようかと思います。
0417デフォルトの名無しさん
2015/09/02(水) 01:39:18.87ID:MPctfeu00418デフォルトの名無しさん
2015/09/02(水) 23:39:30.67ID:VgKb5GV5なんで君はいつも上目線なんだ
0419デフォルトの名無しさん
2015/09/03(木) 05:35:30.84ID:OYAV2gHU0420デフォルトの名無しさん
2015/09/04(金) 12:32:49.27ID:5HbwgMaM0421デフォルトの名無しさん
2015/09/04(金) 17:36:40.07ID:KCyhzv120422デフォルトの名無しさん
2015/09/04(金) 21:44:05.44ID:Ziq//RxQ対策
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なるほど、つまり中置記法の右側に値を置いたものは、
カリー化とは無関係で単にラムダの糖衣構文ってことなんですね。
0426デフォルトの名無しさん
2015/09/05(土) 18:40:53.83ID:NPRaO0u10427デフォルトの名無しさん
2015/09/06(日) 00:53:10.15ID:wfrbDpC50428デフォルトの名無しさん
2015/09/06(日) 08:00:48.38ID:SMmxtXxm1+が綺麗に書けるけど、そんなにこだわる機能じゃないと思う
むしろ二項演算子無くして前置に統一したほうがよく無いかな?
0429デフォルトの名無しさん
2015/09/06(日) 08:29:11.83ID:wfrbDpC5a * x + b
なんてのをまともに書けない言語はアカンでしょ
0430デフォルトの名無しさん
2015/09/06(日) 08:41:14.99ID:SMmxtXxm>a * x + b
つ (+ (* a x) b)
0431デフォルトの名無しさん
2015/09/06(日) 09:30:37.52ID:wfrbDpC5そういうのが好きならLisp使えばいいじゃん。。。
0432デフォルトの名無しさん
2015/09/06(日) 09:44:06.70ID:Vj9nK5xCそれは嘘です
後置演算子の直後の二項演算子はセーフ x! * y
二項演算子の直後の二項演算子はアウト x + * y
>>419
「本当か嘘か」を優先して考え「謙虚か傲慢か」などという雑念は捨てました
0433デフォルトの名無しさん
2015/09/06(日) 09:45:15.82ID:OmMBsRo+0434デフォルトの名無しさん
2015/09/06(日) 10:14:27.94ID:wfrbDpC5うーん、その例と「二項演算子は結合強度最弱の単項後置演算子とみなせる」
がどう矛盾するのかよくわからないです。
0435デフォルトの名無しさん
2015/09/06(日) 10:31:40.00ID:Vj9nK5xC結合強度を変えてもsyntax errorを覆すことはできません
0436デフォルトの名無しさん
2015/09/06(日) 10:59:37.29ID:wfrbDpC5x + * 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:+gBmAsnfApplicativeスタイルを使うときに出てくる「途中の式」はそうやって考えるとわかりやすいね。
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それが後置演算子だとすると
(2 +)と(+ 2) で(+)が別の演算子だということになってしまう。
数式の構文解析で(-)が単項演算子と二項演算子の両方に使われるせいで
BNFが無駄に複雑化するの知ってるでしょ?
同じことが(-)だけでなく二項演算子一般について大規模に生じてイヤなわけ。
0444デフォルトの名無しさん
2015/09/08(火) 04:52:37.64ID:5w88oMs5構文は理由より人気を優先した方がいい
どんな理由を示してもおそらくライバルの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箱の喩えでいうなら、その箱から中身を取り出したままでいられる仕組みは
モナドの範疇ではないよ。
Monad 型クラスのインスタンスであるその型に付随された
モナドとは何の関係もない機能だ。
0448デフォルトの名無しさん
2015/09/08(火) 22:04:03.13ID:FdaSRh76>「モナドは値を箱の中に入れるので外からは見えない、だから安全だ」
>っていう話をよく聞くけど、
そんな話を聞いた覚えがないのだが……
0449デフォルトの名無しさん
2015/09/08(火) 22:11:56.24ID:CPV+4Ywq安全だって言ってる文献を教えて欲しい
0450デフォルトの名無しさん
2015/09/08(火) 22:15:43.73ID:1BhJxNoGでも取り出す機能を簡単に付けられるのであれば、箱としての堅牢性は無いに等しいじゃん。
一回入れたらもう出せない!ってのならわかるけど。
>>448-449
IOモナドなんかそんな風に言われるじゃん。
でもIOモナドに入れた値だってfromJustで取り出せる。
0451デフォルトの名無しさん
2015/09/08(火) 22:17:47.80ID:FdaSRh76>IOモナドなんかそんな風に言われるじゃん。
>でもIOモナドに入れた値だってfromJustで取り出せる。
???
まず前半、聞いたことがない。そういうこと言ってる実例挙げられる?
後半、意味がわからない。
0452デフォルトの名無しさん
2015/09/08(火) 22:18:26.87ID:CPV+4Ywq「モナドは外からは見えないから安全」という話に思い込んだんじゃ?
0453デフォルトの名無しさん
2015/09/08(火) 22:20:00.08ID:1BhJxNoG0454デフォルトの名無しさん
2015/09/08(火) 22:20:30.14ID:CPV+4Ywq0455デフォルトの名無しさん
2015/09/08(火) 23:38:38.43ID:vkbbpybQパターンマッチでいつでも値取り出せるじゃん。って。
モナドはデストラクタを隠蔽するのが肝なんだよな。
だからparsecとかIOとかをみて、初めてありがたみがわかった。
0456デフォルトの名無しさん
2015/09/08(火) 23:44:27.36ID:FdaSRh76>モナドはデストラクタを隠蔽するのが肝なんだよな。
データ構築子のこと?
runXX の形でモナドの実体を取り出せるモナドは珍しくないし、
IOモナドもそこは変わらないよ?
IO aの実体をWorld -> (a, World)として取り出してもありがたくないだけで
>だからparsecとかIOとかをみて、初めてありがたみがわかった。
うーん、その感覚はさっぱり
隠蔽云々とは関係なくリストモナドだろうがIOモナドだろうがありがたいけどなあ
0457デフォルトの名無しさん
2015/09/08(火) 23:52:35.54ID:FdaSRh76Maybe 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バグめっちゃ減るんすよwwww
その代わりコンパイル通りににくくなるんで慣れるまでめっちゃ苛々するんすけど
実行時にヘマするくらいならコンパイル失敗した方がマシだってことを学ぶんすよwww
もうC++は体力続かない
三ヶ月前のコードとか読みたくないでしょ
歳取ったらHaskellが良いって解りますよ
Haskellなら三ヶ月前のコード、また読んでみてもいいかなって、それはとっても嬉しいなって
0461デフォルトの名無しさん
2015/09/09(水) 01:57:38.90ID:rpodVdITなんていうか上手く言えないんだけど、例えば、
データ構築子がreturnとbindしか無くて、一方分解子、runの類いがたくさん提供されてるデータを考えてくれ。
どうだいそれって滅茶苦茶役に立たないだろ?
0462デフォルトの名無しさん
2015/09/09(水) 02:07:49.07ID:15Wbqaqp>データ構築子がreturnとbindしか無くて、一方分解子、runの類いがたくさん提供されてるデータを考えてくれ。
なにが言いたいのか理解できないが、いずれにせよreturn とbind があれば
他のはそれから定義できるんだからなにも問題ない
runXXの類がたくさん提供されてる、というのもよくわからんが、
それで有用性が損なわれるとはちっとも思えない
0463デフォルトの名無しさん
2015/09/09(水) 02:09:55.95ID:15Wbqaqpもし、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>だからモナドにするならreturn以外にカスタムコンストラクタをたくさん提供するべき。
いやまったくもって意味不明なんだけど
普通に型定義のデータ構築子がある以上、それを使えばいいんだし、
それらのデータ構築子から構成できないようなものもあり得ない
しかもなんで「べき」なわけ?
Maybe型が役に立たなかったことなんかないだろう
あと、勝手な自分用語振り回されても理解できない(するきになれない)
0466デフォルトの名無しさん
2015/09/09(水) 02:57:08.05ID:rpodVdITところでさ、ライブラリを作っていて、データの内部表現を公開したくない時があるじゃない?
あとでチューニングしたいときとか。そういう時にデータがモナドなら主に ... -> 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して値を取り出して、その値で分岐して別のモナディックアクションにつなぐのは、計算量が無駄。
それを避けるためにモナド(手続きの抽象)がある、と俺は理解している。
■ このスレッドは過去ログ倉庫に格納されています