リストや配列の各要素を並列処理する場合にはコモナドというのを使うといいらしい コモナドはモナドのreturnとbindのかわりに class Comonad c where extract :: c a → a extend :: (c a → b) → c a → c b となっていて、 http://www.cl.cam.ac.uk/~dao29/drafts/codo-notation-orchard12.pdf [cam.ac.uk] > Comonads are the dual structure to monads, where a comonadic data type C has operations for the composition of functions with structured input, of type C a → b. Whilst monads capture impure output behaviour (side effects), comonads capture
割とオフトピックだが (スコア:0)
これを機にHaskellに触れてみようと思う。
# 関数型言語はLispとPythonしか触れなかった
Re: (スコア:0)
Haskell は面白い言語ですよ。
私は、C++ や Java がメインな人だったのですが、Haskell の学習は、
いろいろカルチャーショックを味わえてエキサイティングな体験でした。
木構造のアルゴリズムから攻めると分かりやすいと思います。
でも、未だにモナドはよく分からないんですけどね…orz
Re: (スコア:0)
モナドの分かりにくさは、うまい例がないところにある気がする
実際のところ、処理がつながっているものはみんなモナドなのだが
Re: (スコア:1)
うまい例がないどころか、モナドの例はあらゆるプログラミングのなかに溢れかえっている
だってリストはモナドなんだよ。
こんな単純で身近な例があるのに「うまい例がない」という人は、モナドを理解していないとしか思えない
Re: (スコア:1)
他人に説明するための例えなんだから、「リストはモナド」で伝わらないなら、たとえあなたにとって自明でも例えとしては意味がないのでは?
Re: (スコア:0)
基数と順序数と実数が「ぜんぶ数」だと言ってもうまい喩えがないようなものですな
ちなみに「リスト」はモナドではない
Re: (スコア:1)
ちなみに「リスト」はモナドではない
俺が「リストはモナド」と言っているのはこのことを指しているんだけど
http://www.sampou.org/haskell/a-a-monads/html/listmonad.html [sampou.org]
君が「リストはモナドではない」というのは何の事を言っているの?
Re: (スコア:0)
それは「HaskellのListモナド」
HaskellではListを用いて非決定性をもつ計算の連鎖を実現しているとうこと
一般的にリストはモナドではないし(そもそも意味をなさない)、モナドの理解のためにHaskell特有の事情を例に挙げるのも相応しくない
Re: (スコア:0)
一般的にリストはモナドではないし(そもそも意味をなさない)
ある特定の言語でリストモナドの実装が標準ライブラリに存在しないことを指して「一般にはモナドはリストではない」と君が言いたいなら、君の中ではそうなんだろうけど、
それこそ、特定の言語、特定の実装を指さずに「一般のリスト」「一般のモナド」「一般の言語」についていう場合は、
「一般には」リストはモナドだというのは正しい。
モナドの理解のためにHaskell特有の事情を例に挙げるのも相応しくない
いや、これHaskell特有でも何でもないけど。例えばScalaの例。
http://eed3si9n.com/learning-scalaz/ja/List-Monad.html [eed3si9n.com]
標準ライブラリにモナドのフレームワークがある言語は稀だ
Re: (スコア:0)
やはり、悪い例から始まるといつまでたっても理解ができないようです
「リストのモナド」ってさあ、自分で言ってて意味が通らないと思わないの?
なんでモナドの性質を書くべきところに「リスト」なんて実装がくるわけ?
HaskellでList(これは、Haskellの型のListのことです)がモナドなのはモナド則を満たすようにしているからで、それ以外の理由はない
Listを直接Monadのインスタンスにせず、ListをnewtypeしてそっちをMonadのインスタンスにすることは可能だし、その場合Listはモナドではなくなる(もちろん独自にモナドにする場合は別)
> モナドというのは抽象的なフレームワークであって、
およそモナド則を満たすものがモナドであって、それ以外の一般論はないし、フレームワークでもない
Re: (スコア:0)
なんでモナドの性質を書くべきところに「リスト」なんて実装がくるわけ?
モナドを説明するときには、まず性質を説明すべきで、その後で具体例を説明すべき。
それは元コメもわかっていて、だからモナドを理解するためには「良い例が欲しい」しかし「良い例がない」と言っているわけだ。
話を戻すが、ここでの論点は「リストのモナドのインスタンスを実装して、モナドを説明するのは説明として適切かどうか」。
俺は「関数型を知らない人でもデータ構造としてのリストはよく知っているし、モナドのインスタンスを実装して見せるのも簡単だから、説明に適している。リストを実装して見せるのは「良い例」だ」といっている。
それなのに「リストモナドが標準ライブラリにない言語もある。リストのモナドインスタンスには他の実装もある。だから「一般には」リストはモナドではない」というズレた指摘をし始めたから、話がズレてるんだけど。
およそモナド則を満たすものがモナドであって、それ以外の一般
Re:割とオフトピックだが (スコア:0)
さらに言えば、あなたの言ってる「「一般的に」リストはモナドではない」というのも、俺は意味を理解している。
Javaの標準ライブラリにはListクラスがあるが、標準ライブラリにはそのListのモナドのインスタンスはない。
だから、一般に「あるソフトウェアでソースコードにリストが定義されていれば、そのモナドインスタンスもソースコードに定義されている」は正しくないし、
その意味で「「一般的に」リストはモナドではない」というのも意味は通る。
ただし、我々の論点は「リストのモナドを実装して見せることは、説明に適しているか」であって、
俺の言っている「リストはモナド」というのは、その論点に併せて「リストのモナドインスタンスの妥当な実装をすることは可能だ」ということだ。
俺「(すべての)リストはモナド」=「リストの妥当なモナドインスタンスを定義することは可能だ」
あなた「(すべての)リストはモナドではない」=「実際のソースコードで、リストが定義されていてもそのモナドインスタンスが定義されているとは限らない」
どちらも正しい。ただ、今回の「リストのモナドインスタンスを実装して見せるのは「良い例」か」という話の流れでは、
あなたの主張しているのはまるで関係のない話だ。
あなたのモナドに対する理解は間違っていないし、俺のモナドに対する理解も間違ってはいない。
ただ、俺は元コメの「モナドのいい例がない」というコメントに対して「リストで説明すればいいじゃん」という噛み合った会話をしているのに対して、
あなたは「リストが定義されていても、そのモナドインスタンスが定義されているとは限らない」というまるで関係のない話を持ち出している。
話の流れに従えば、俺の「リストはモナドだから、モナドの「良い例」としてリストを示せばいい」といっているのは、
「リストのモナドインスタンスを実装するのは可能だから、モナドの「良い例」としてリストを示せばいい」という意味だと理解できるはずだ。
話の流れを無視して、俺の「リストはモナドだから、モナドの「良い例」としてリストを示せばいい」という主張を、
「コードにリストが定義されていれば、モナドインスタンスもコードに定義されているから、モナドの「良い例」としてリストを示せばいい」というわけのわからない意味だと解釈した挙句、
「コードにリストが定義されていても、モナドインスタンスもコードに定義されているとは限らない」(当たり前だ。あなたも俺もそう思っている)という正しいがまるで見当違いの反論をしてくるのはやめてもらいたい。
たった「リストはモナド」というこれだけの言葉で、あなたが誤解して議論を脱線させるのは簡単だけど、
その脱線の内容を説明して議論を元に戻すにはこれだけの労力がかかる。
お願いだから、そういう勘違いや脱線は自分自身で気をつけて防いで欲しい。
Re: (スコア:0)
なんども言うようだが、「非決定性中略モナド」というのはあるけど、「リストのモナド」というものはない
非決定性モナドをリストで実装するのは遅延評価のhaskellだからうまくいくけど、ほかの言語だとeagerなリストよりlazyなEnumerableとか使うんじゃないの
余談だが、「リストの各要素を並列処理するモナド」というのもありそうだが実はない
なぜないのか説明するのかは実はけっこう難しい
Re:割とオフトピックだが (スコア:1)
#2808317 [srad.jp] は三行でまとめようとして失敗した、まで読んだ。
Re: (スコア:0)
リストや配列の各要素を並列処理する場合にはコモナドというのを使うといいらしい
コモナドはモナドのreturnとbindのかわりに
class Comonad c where
extract :: c a → a
extend :: (c a → b) → c a → c b
となっていて、
http://www.cl.cam.ac.uk/~dao29/drafts/codo-notation-orchard12.pdf [cam.ac.uk]
> Comonads are the dual structure to monads, where a comonadic data type
C has operations for the composition of functions with structured input, of type
C a → b. Whilst monads capture impure output behaviour (side effects), comonads
capture
Re: (スコア:0)
あなたQiitaから追い出された人でしょ