関数型プログラミング言語Haskell Part9
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2008/05/17(土) 16:41:29http://www.haskell.org/
日本語サイト
http://www.sampou.org/cgi-bin/haskell.cgi
http://www.shido.info/hs/
過去ログ
関数型プログラミング言語Haskell
Part1 http://pc.2ch.net/tech/kako/996/996131288.html
Part2 http://pc2.2ch.net/test/read.cgi/tech/1013846140/
Part3 http://pc8.2ch.net/test/read.cgi/tech/1076418993/
Part4 http://pc8.2ch.net/test/read.cgi/tech/1140717775/
Part5 http://pc8.2ch.net/test/read.cgi/tech/1149263630/
Part6 http://pc11.2ch.net/test/read.cgi/tech/1162902266/
Part7 http://pc11.2ch.net/test/read.cgi/tech/1174211797/
Part8 http://pc11.2ch.net/test/read.cgi/tech/1193743693/
・2chの仕様により、行頭の半角スペースは表示されません。
コードをインデントしたいときは、代わりに または全角スペースを使うことができます。
0455デフォルトの名無しさん
2008/08/10(日) 08:02:29Implementation of Functional Programming
Implementing Functional Languages,(D. Lesterと共著)
を書いていて両方公開。
http://www.haskell.org/haskellwiki/Books
0456デフォルトの名無しさん
2008/08/10(日) 08:05:37http://www.haskell.org/haskellwiki/Tutorials
0457デフォルトの名無しさん
2008/08/10(日) 13:23:16すまん、>>455のImplementing...のほうを言いたかった。
045836 ◆K0BqlCB3.k
2008/08/10(日) 13:39:12>>449は本当にモナドとラムダの練習のためだけに問題をほしがっているのかどうかってこと。
それに、初心者は何か目に見えて動かせるものを書きたがるものさ。
誰かに見られることを想定して書くのと、「動けばそれでいい」だけで書くのとでは、
やっぱり前者の方がいろいろ調べたりすることで勉強になる。
0459デフォルトの名無しさん
2008/08/10(日) 15:23:20そこ載ってなくね?w
http://research.microsoft.com/~simonpj/Papers/slpj-book-1987/index.htm
http://research.microsoft.com/~simonpj/Papers/pj-lester-book/
>>457
サンクス。目次しか見てないけど、
Implementationがパターンマッチや型など広く扱ってて、
Implementingはコンパイラのコアな部分を主に扱ってる感じ?
静的型付けとグラフ簡約の運命的な出会いというからそうでもない?
まあImplementingのほうを読んでみます。
>>458
そうですね。
0460デフォルトの名無しさん
2008/08/10(日) 16:23:15グラフ簡約と運命的な出会いというと遅延評価じゃないかね。
特にPJ的には。
0462419
2008/08/11(月) 14:44:370463デフォルトの名無しさん
2008/08/11(月) 16:05:22あまり理解できてなかったんじゃない?w
0464デフォルトの名無しさん
2008/08/11(月) 16:13:31かもしれない。
できれば君が読んでポイントだと思ったところを挙げてくれると皆の参考になると思う。
0465デフォルトの名無しさん
2008/08/11(月) 16:20:35例え動的型チェックをやろうとも、そのコードは、
他の普通のコードと一緒でスーパー・コンビネータになって、
グラフ簡約されるだけだから、コンパイル時に型チェックを済ませることが、
スーパー・コンビネータのグラフ簡約上、特に有利だとは思えません。
0466デフォルトの名無しさん
2008/08/11(月) 17:39:550467デフォルトの名無しさん
2008/08/13(水) 09:02:330468デフォルトの名無しさん
2008/08/13(水) 10:48:150469デフォルトの名無しさん
2008/08/13(水) 11:17:46MonadCont の callCC :: ((a -> m b) -> m a) -> m a のことじゃないの。
>>467
俺も気になる。違いはあるだろうけど、どう違うのか。
0470デフォルトの名無しさん
2008/08/13(水) 11:23:16作るとしたら、ステートモナドに次のアクション
入れておくとかですかね。
0471デフォルトの名無しさん
2008/08/13(水) 13:45:50# mfixとか使えば別だけど。
例えば、Schemeで次の式は書けるが、MonadContでは書けない。
(call/cc (lambda (c) c))
(call/cc (lambda (c) (set! foo c)))
つまり、次の式は型が付かない。
callCC (\c -> return c)
callCC (\c -> lift $ put c)
要は、callCCで捉えた継続をそのcallCCの外に出せない。ただし、
callCC (\c -> ... callCC (\c' -> c c') ...)
のように、内部で別のcallCCを使って、それで捉えた継続を外に出すのはOK。
あと、変な例として、
callCC (\c -> return (Right (c . Left)))
はOK。でもやっぱり無限ループはできない。
0472デフォルトの名無しさん
2008/08/13(水) 14:58:55だとすると、smlのcall/ccを使ったco-routineみたいなことはできないということ?
0473デフォルトの名無しさん
2008/08/13(水) 17:43:19import Control.Monad.Cont
foo = callCC (\c0 ->
do
c1 <- callCC c0
c2 <- callCC c1
c2 10
undefined)
bar =
(do
c1 <- foo
c2 <- callCC c1
callCC c2)
main = print $ runCont bar id
0474デフォルトの名無しさん
2008/08/13(水) 18:18:41HaskellでYコンビネータを書くとき型が問題になるけど、
実質的には fix f = let g = f g in g で問題ない。
それと同じように、
loop = callCC (\c -> let g = c g in return g)
とすれば
do { l <- loop; liftIO $ print 0; l }
のように無限ループを書ける。
(これの変数付きループ版が MonadLib にあった。)
(call/cc (lambda (c) c))
がどう使われるのかよく分からないけど、
実質的には同じことになるんじゃないかな?
(call/cc (lambda (c) (set! foo c)))
callCC (\c -> lift $ put c)
は IORef を使うと問題なくできる。
State だと無理だけど、新しく再帰的なデータ型を定義してやれば、
あまり便利では無さそうだけど一応できた。
0475デフォルトの名無しさん
2008/08/13(水) 22:46:51著者にプレッシャヨロ
047636 ◆K0BqlCB3.k
2008/08/13(水) 22:51:050477デフォルトの名無しさん
2008/08/13(水) 23:21:14んですよね?Haskellではそういうのは無いと思っていいんでしょうか?
0478デフォルトの名無しさん
2008/08/14(木) 00:04:58モナド無しでということなら無い。
そもそもcall/ccは副作用があるし。
0479デフォルトの名無しさん
2008/08/14(木) 13:47:210480デフォルトの名無しさん
2008/08/14(木) 17:35:340481デフォルトの名無しさん
2008/08/14(木) 18:53:400482デフォルトの名無しさん
2008/08/14(木) 18:54:490483デフォルトの名無しさん
2008/08/16(土) 19:35:13http://lethain.com/entry/2008/aug/14/global-popularity-of-programming-languages/
0484デフォルトの名無しさん
2008/08/16(土) 20:24:000485デフォルトの名無しさん
2008/08/16(土) 22:50:09こうゆう落ちもある。
0486デフォルトの名無しさん
2008/08/17(日) 12:30:17http://haskell.org/haskellwiki/Xmonad/Config_archive
の設定ファイル郡を理解できるぐらいまでHaskellについて知りたいんですが
どこから勉強すればいいんでしょう?
知識はXmonadやGhcをソースからインストールできる程度です
0487デフォルトの名無しさん
2008/08/17(日) 13:44:52テストは軽減する。haskellなどはそのことが数学的に証明されているので
プログラマはぬるぽやoutofboundsなどの基本的な間違いにであうことなく、
本質だけを考えることができる。
0488デフォルトの名無しさん
2008/08/17(日) 14:23:37たとえば「空でないリスト」型が欲しいとき、ぬるぽ的な実行時エラーを防げるの?
0489デフォルトの名無しさん
2008/08/17(日) 14:47:05依存型のある言語なら防げるかも知れんけど
0490デフォルトの名無しさん
2008/08/17(日) 15:31:08おまえ初心者スレにいたHaskell信者だろ。
0491デフォルトの名無しさん
2008/08/17(日) 18:08:120492デフォルトの名無しさん
2008/08/17(日) 18:14:59それヘボすぎ
0493デフォルトの名無しさん
2008/08/17(日) 18:26:58誰か教えて下さい
0494デフォルトの名無しさん
2008/08/17(日) 18:36:200495デフォルトの名無しさん
2008/08/17(日) 18:36:410496デフォルトの名無しさん
2008/08/17(日) 18:42:380497デフォルトの名無しさん
2008/08/17(日) 18:59:33ttp://www.sampou.org/haskell/a-a-monads/html/
の以下の部分を読むとわかるかも
Maybe というモナド
ひとつの例
リストもモナド
0498497
2008/08/17(日) 19:11:05の各モナドの利用場面や動機を見るのもいいかもしれない
0499デフォルトの名無しさん
2008/08/17(日) 19:15:59便利だからという理由以外にモナドをIO以外に使う理由はあったりしますか?
それだけの理由で使うには扱いが難しくて、プログラムを組む度に頭がオーバーヒートしそうになる
慣れの問題かそれとも理解不足か・・
0500デフォルトの名無しさん
2008/08/17(日) 19:25:15そこでmaybeもなどですよ。
0501デフォルトの名無しさん
2008/08/17(日) 20:06:22IO, Maybe, List, etcの計算の合成を統一的に扱えるってのが最大の利点なんではないかと。
単に使うだけなら主に慣れの問題だと思う。
いろんな例を見て慣れていけば少しずつ理解もできていくんではないかと。
0502デフォルトの名無しさん
2008/08/17(日) 20:09:490503デフォルトの名無しさん
2008/08/17(日) 20:33:06レス有難うです
慣れの他に密度の問題もあるかもしれないと思ったり。
他の言語より1行あたりの密度が濃いものになりやすい気がする。
というか濃縮されすぎてわけが分からなくなりやすい気がする。
0504デフォルトの名無しさん
2008/08/17(日) 20:38:12計算を統一的に扱うだけであれば、普通の型クラスでいいんですよね?
モナドは値ではなくて型コンストラクタに対するクラスなので、ちょっと違う
と思うんですが。
050536 ◆K0BqlCB3.k
2008/08/17(日) 20:39:51所詮はただの代数的データ型とそのデータ型に対して一貫性あるAPIのセットに過ぎないよ。
ところで、 データ型とAPIのセット のことをなんて呼べばいいの?
0506デフォルトの名無しさん
2008/08/17(日) 20:40:10型クラス(b,s) -> (a,s)に型bを部分適用したって考えれば意味は通るけど……
0507デフォルトの名無しさん
2008/08/17(日) 21:08:43それが「型クラス」、ではないのでしょうか?MonadやFunctorはちょっと
毛色が違うという認識は勘違いでしょうか?
0508デフォルトの名無しさん
2008/08/17(日) 21:17:01Ord、Eq、Show などの データ型とそのAPIのセット は「型クラス」
Functor、Monad、MonadPlus などの データ型の構築子とそのAPIのセット は「型構築子クラス」
0509デフォルトの名無しさん
2008/08/17(日) 21:31:22Functorの『類』は*->*みたいに引数をとる、って違いにしか見えない
分けて考えるのはおかしいと思う
0510デフォルトの名無しさん
2008/08/17(日) 21:37:45型クラスと型構成子クラスじゃ抽象度が違うよ。
0511デフォルトの名無しさん
2008/08/17(日) 21:49:13抽象度が違うのは理解できるが
0512507
2008/08/17(日) 21:58:16遷移を持つことが可能だ、という印象を持つんですけどどうなんでしょうか。
普通の計算を行う裏側で別の次元での計算が行われ、且つそれが
結合法則を満たしている、というのがモナドの定義と考えるのは
どうですか?自分は圏論などのこと全く無知なのでHaskellの構文
からの直感的な印象だけなんですけど。
0513デフォルトの名無しさん
2008/08/17(日) 21:59:06もっと抽象度が違うので別の名前が必要なのか?型構築子構築子クラスとか。
有名な人が書いてるから鵜呑みにしてるだけなんじゃないの?
0514デフォルトの名無しさん
2008/08/17(日) 22:31:24だいたいあってんじゃね?
見えてる部分で適当に処理を書いたら裏で適当に処理してくれる、
普通のプログラミング言語じゃfor文やif文みたいな処理構造、
あるいはマクロとして提供されるものと同等の処理ができるんだけど、
実態は単に型クラスでしかないので俺定義できるし、高階関数使えるし、表記もシンプルで、いろいろ小細工が利くのが利点。
たとえば、IOみたいにコンストラクタを隠したりすれば脱出不可な構造を作れるってわけ。
結合法則を満たしているってのは、まぁ別に特別なことじゃない。
EqやOrdにも反射律とか推移則とか守らないといけないルールがあるけど、
よっぽどのことがない限り変な実装はしないだろうから、一般のプログラミング言語ではそこまで突っ込まない
でもモナドって実態がよくわかんないから、ルールを明記してる。そんだけでしょう。
0515デフォルトの名無しさん
2008/08/17(日) 22:45:32>処理構造(略)同等の処理ができるんだけど
普通の言語では処理構造のものが、モナドが利用されてる例としてはErrorモナドとかContinuationモナドとかがあったね。
>よっぽどのことがない限り変な実装はしないだろうから、一般のプログラミング言語ではそこまで突っ込まない
浮動小数点の比較と等価性で違う実装がされてるとか、変な実装もあるけど。
個人的にはMonad則は、
値に関して順次実行できる何かで、値に対して何もしない処理もできる何かだ、というルールだと解釈してる。
0516デフォルトの名無しさん
2008/08/17(日) 22:50:03コンピュータのメモリ節約を考えれば生の浮動小数点型を使うのもまっとうな実装だわw
0517デフォルトの名無しさん
2008/08/17(日) 23:19:23>値に関して順次実行できる何か
これは実行順序じゃなくて値の計算する方向を言ってるだけだよ。
g.f x がxにfを適用してgを適用するってのと同じことだよ。
実行順序は普通のモナドもIOモナドも方向は決まってないよ。
0518初心者修業中
2008/08/17(日) 23:37:55実行順序を明確にするのがIOモナドの目的の一つ
と認識していますが。
そういう意味ではないのかな…
0519デフォルトの名無しさん
2008/08/17(日) 23:41:24他の言語に比べて内と外をわけすぎるようなそんな印象をもってる。
なんでだろ?
0520デフォルトの名無しさん
2008/08/17(日) 23:58:38たとえば、
1:2:3:[]は、
1:2:3:[] → 1:2:[3] → 1:[2, 3] → [1, 2, 3]と簡約されるかもしれないし、
1:2:3:[] → [1, 2:3:[]] → [1, 2, 3:[]] → [1, 2, 3]と簡約されるかもしれない。
でも結果は一緒でしょ?
同じように、
Hello, Worldって出力 >> 一文字入力 >>= 前の文字を出力
みたいなのは、まぁ言ってみれば(不正確だけど)
[Hello,Worldって出力, 一文字入力, 前の文字を出力]みたいな並びにされる(と思われる。実装はカプセル化されていて不明)。
この並びがプログラム終了後にコンパイラにわたって、コンパイラがこれを順番に処理していく。
実はこの並びをプログラム終了後以外に評価する方法があって、それがUnsafePerfomedIOって言う関数。
getContentとかは実はこれを使って実装されている。
Unsafeという名前が示すように、素人にはお勧めできない。(getContent自体は普通に使える。)
0521デフォルトの名無しさん
2008/08/18(月) 00:02:55052236 ◆K0BqlCB3.k
2008/08/18(月) 00:25:49世界的に全く元気がありません。
ちょこっと変なライブラリを書いたと思えばそれっきり離れていっている人も多数。
0523デフォルトの名無しさん
2008/08/18(月) 01:36:55後者の簡約は型がおかしいし、1:2:3:[]ではなく、
f x = (unsafePerformIO $ print x) `seq` xで
f 1:f 2:f 3:[]だった場合、前者と後者の簡約順序ではprintの順番が違ってくる。
前者は3,2,1で後者は1,2,3
一方で(>>=)は最左最外簡約でも最右最内簡約でも
左から順にしか値が定まらないようになってる。
putStr "Hello" >>= (\ _ -> getChar) >>= (\ c -> putChar c)
(>>=)の右辺が関数だから左辺の値が定まるまでa >>= bが最終的な値に簡約できないようになっている。
0524デフォルトの名無しさん
2008/08/18(月) 03:17:18元気無い理由って何でしょうか。他に元気ある言語ってあるのかな。
0525デフォルトの名無しさん
2008/08/18(月) 04:14:240526デフォルトの名無しさん
2008/08/18(月) 08:38:27> 1:2:3:[] → [1, 2:3:[]] → [1, 2, 3:[]] → [1, 2, 3]と簡約されるかもしれない。
型が滅茶苦茶だよ。
> この並びがプログラム終了後にコンパイラにわたって、コンパイラがこれを順番に処理していく。
意味不明。なぜプログラム終了後にコンパイラが出てくる。
ランタイムライブラリとごちゃまぜになているぞ。
0527デフォルトの名無しさん
2008/08/18(月) 10:05:000528デフォルトの名無しさん
2008/08/18(月) 10:21:37想像力の貧しい奴がこのスレに多いような気がする
0529デフォルトの名無しさん
2008/08/18(月) 13:36:03全部気のせいのような気がする
0530デフォルトの名無しさん
2008/08/18(月) 15:08:490531デフォルトの名無しさん
2008/08/18(月) 15:12:160532デフォルトの名無しさん
2008/08/18(月) 15:41:06つ座布団1枚
0533デフォルトの名無しさん
2008/08/18(月) 21:50:150534デフォルトの名無しさん
2008/08/18(月) 22:25:250535デフォルトの名無しさん
2008/08/19(火) 07:45:46/ つ つ つ
(_(_ ノ ノ ノ
し∪ ∪ ∪
0536デフォルトの名無しさん
2008/08/19(火) 10:10:53> ところで、 データ型とAPIのセット のことをなんて呼べばいいの?
プログラミング言語一般での話なら「抽象データ型」でしょうね。
0537デフォルトの名無しさん
2008/08/19(火) 11:50:46関数(->)とかタプル(,)とか
0538デフォルトの名無しさん
2008/08/20(水) 20:24:46それでなのです。 >ときどきの雑記帖の中の人
0539デフォルトの名無しさん
2008/08/21(木) 14:40:13MonadTrans は (* -> *) -> * -> * のクラス
0540デフォルトの名無しさん
2008/08/21(木) 21:20:37これの30章が消えてるんだけど・・・。
0541デフォルトの名無しさん
2008/08/21(木) 22:05:290542デフォルトの名無しさん
2008/08/21(木) 23:26:23ところで、HaskellでPetStoreってあるの?
054336 ◆K0BqlCB3.k
2008/08/21(木) 23:56:58横からすみませんが、
Pet Storeをよく知らないのでちょこっと検索したんですが、
これっていったい何が面白いんですか?
0544デフォルトの名無しさん
2008/08/22(金) 00:08:29面白くは無いんだけど、色んな言語やフレームワークで同じもの作る
ことで比較をするためのものでしょ。同じアプリがこんな感じで作れ
ちゃうぞ、という。
0545デフォルトの名無しさん
2008/08/22(金) 11:40:45054636 ◆K0BqlCB3.k
2008/08/22(金) 12:37:40ライトウェイト言語がブームみたいだね。
HaskellはライトウェイトではないからWEBアプリ向きとは全然思えないんだけど、
RubyでRubyOnRailsが考えられたみたいにHaskell独自のWEB向きキラーアプリが
出てこないとHaskellの人気はこれからもずっと平行線だと思うよ。
0547デフォルトの名無しさん
2008/08/22(金) 12:41:19WEBアプリが書きやすいっていうより、APIとかWEBコンテナが標準装備されてないとダメという感じがする。
Javaの功罪は大きい。
0548デフォルトの名無しさん
2008/08/22(金) 12:41:590549デフォルトの名無しさん
2008/08/22(金) 12:48:26ライトウェイトって何?動的に型を付ければライトウェイト?
それとwebとどういう関係があるの?
0550デフォルトの名無しさん
2008/08/22(金) 13:05:36ライトウェイトってことじゃないか?
web案件は短期だったりアジャイルだったりでライトウェイトに
開発できるのが求められてるってのはある
0551デフォルトの名無しさん
2008/08/22(金) 13:10:45だから、WEBアプリ開発者は、身体のどこかに、プログラミング言語のJavaかRubyに似てない部分に拒否反応を持ってる。
0552デフォルトの名無しさん
2008/08/22(金) 13:11:10考えが即座にコードにうつせるため開発期間が最短であると主張する人がどこからか登場
↓
0553デフォルトの名無しさん
2008/08/22(金) 13:23:23( ゚д゚ )↓
(⊃⌒*⌒⊂)
/__ノ''''ヽ__)
0554デフォルトの名無しさん
2008/08/22(金) 13:27:58それならHaskellもライトウェイトで良くね?
■ このスレッドは過去ログ倉庫に格納されています