関数型プログラミング言語Haskell Part16
テンプレ以上
議論をお続け下さい
これならPerl忍者がスレ立ててほしかったわ
忍者と忍者ウォッチャーは巣に帰ってくれ。スレの質が必要以上に下がりすぎる。
このスレはIQ123以下は来るなよ
私のIQは2000万です
>>13 こういうのは、だめなんだ。難易度的に簡単すぎて面白くないんだ。
元の台詞を”全く変更しないで”意味が通る場合にのみ書くようにしよう。
14 名前:デフォルトの名無しさん[sage] 投稿日:2011/10/08(土) 02:30:15.86
>>13 こういうのは、だめなんだ。難易度的に簡単すぎて面白くないんだ。
元の台詞を”全く変更しないで”意味が通る場合にのみ書くようにしよう。
↑
こうか
不動点
ウイットに富まないアイロニーのスレですね
ウェットには富んでるけどな。
汗でしっとりしててヤな感じ。
スウェットですか
さて仕切り直すか、雑談は別スレでどうぞ
Haskellを始めたのはいつからですか?
1989年ごろ
昨夜の3:00過ぎから
学び始めたばかりだが、
テキストファイル中のaをAにするフィルタが
すごく簡単に書けるんだな。驚いた。
他の言語ではこうはいかない。
一月半程前かしら
最初はLearnYou読んでたけど冗長過ぎ要点得なさ過ぎでブチ切れてRealWorld読んでるなう。
まだI/Oのとこまでだけど、
モナドがHaskellの静的な部品をつなぐホットグルーの様なものだって認識に達してるなう。
>>24 ゴルファーあらわる
ちなみにどれくらいの長さになった?
Real Worldは良くなかったわ。最初の方は話が無駄に長いのはいつもの動物本通りだし、と思うと急に説明がコード例に追いつかなくなってる
3年前から
趣味グラ魔なのでかなりゆっくりペースだが
最近まではghciで関数チマチマ作ってただけだし
約1年前から。
まともにやり始めたのは今年の7月ぐらいから。
使い始めてから大体1~2週間ぐらい
Learn You Haskellは読み終えたけど
全然冗長には感じなかったから読み方の問題だろ
Learn You ~はそれなりに面白かったよ。だいたい一ヶ月かけて読んだ。
いまはReal Worldに移ってるけど、時々日本語の意味がわからないのが
難点。何でもかんでも感じに訳せばいいってもんじゃないと感じさせる。
でもこの辺にSICPの訳の影響を感じるところかも。
33 :
デフォルトの名無しさん:2011/10/08(土) 12:40:17.01
こいつらジャップ
やってることがじゃっぷ
ジャップは小物を愛する
薄型コンパクト
お前らの顔は、薄い
お前らの声は、小さい
お前らの身長は、チビ
お前らの財産は、無い
お前らの体格は、ひょろい
お前らの声は、きもい
お前らのおもしろさは、無い
お前らの脳みそは、欧米より劣ってる
お前らの生産性は、無い
お前らの目的は、無い
お前らの趣味は、人の影響
早く死ね糞ジャップ
漢字←感じ。
Haskellの勉強をしていると、データ構造を凝りたくなってしまう。
35 :
デフォルトの名無しさん:2011/10/08(土) 12:43:31.95
お前ら英語できないじゃっぷは早く死ねばゴミクズ
早く死ね
Haskellやっても意味が無い
3D,2Dオンラインゲーム作ってるやつのほうが凄い
プログラミングレベルでもそいつらのほうが上
おもしろさも
Haskellとか意味が無い
おもしろさ、利便性、インフラも支えられない、ゴミの言語
さっさと死ねよゴミ
ゴミ言語
お前らは、ゴミ
お前らは、英語ができない
お前らは、数学力が無い
お前らは、鼻がつぶれてる
お前らは、キモメガネ
お前らは、くさい
お前らは、ネットワークプログラミングができない
お前らは、ゲームが作れない
お前らは、日本人
お前らは、まつもとひろゆき信者
おいしさながもちジャップロック
インフラを支えてる言語といえばCOBOL
そんなあなたにお勧めなのがZipperです
>>32 時々日本語の意味が…、自分も同じ感じがした。分からないまま単に英語訳した感じやね。
入門書のつもりで買ったけどそうじゃなくて、タイトル通り使用例を眺めて使い道を創造するのに用いるのが良さそう。
最初は別の本かPDF拾ってくるのが正解か
FFI の質問です
C 言語で書かれた、FILE 構造体のポインタを引数として取る関数を
Haskell 側から使いたい場合、Haskell の openBinaryFile 関数などで得た
Handle 型の値は使えないのでしょうか(Handle 型を CFile 型に変換するなど)
もしかして、C 言語の open 関数も import して使う必要がありますか
>>40 使えない
素直にFILE*を作るCライブラリを呼び出す
どうしてもHandleから作る必要があるなら fd を通す
handleToFd で Handle から fd にして
C の fdopen で fd からFILE* にして
とか
FILEとかHandleはライブラリも状態を持ってるから直接のマッピングは無理
fd は状態をカーネルが管理しているから、ライブラリ間では比較的ポータブルだけど
>>40 open関数? openはファイルディスクリプタを返して、FILE構造体へのポインタを返すのはfopenでは?
一般論としては、CレベルのfdやFILE *を使いたいなら、Cのopenなりfopenなりをインポートする必要がある。
GHCの場合、System.Posix.Internals.c_open が Cのopenのラッパーなので、ファイルディスクリプタで良いなら、何とかこれを呼べばよいだろう。
でも、FILE *のほうは自分でfopenをimportするしかないと思う。
43 :
42:2011/10/08(土) 15:45:48.72
handleToFdなんて知らんかった。
そういうものがあるなら、オレの書いたことは無駄だったな。
>>33 あはは
その程度で劣等感感じてるのは中国人か韓国人だけ
欧米人も日本人に劣等感感じてるの知ってから、気が楽になったよ
>>41,42
ありがとうございます
すいません、fopen でした(C を久しく触ってないもので・・・)
記憶している状態がそもそも違うから、簡単に変換できるわけではないのですね
C の関数が使えない(SDK を入れてない)ので、C の fdopen を呼ぶこともできない
問題に突き当たったライブラリは libpng なんですけど、
デフォルトでは FILE* を必要とするのですが、どうも
独自のIO処理が使えるようにコールバックの仕組みも用意されているっぽいので、
それでなんとか対応できないか検討してみます
46 :
デフォルトの名無しさん:2011/10/08(土) 16:09:49.12
>>44 お前はイエローなんだよ
ジャップ
お前はそうやって ”欧米人も”って欧米を引き合いにしないと
気が楽にならないジャップ
お前はジャップ
消えろ
>>44 ばっちいものに触ると、お前もばっちくなるよ
Haskellの学習を始めたばかりですが、Haskellで作成されたアプリケーションのソースを読んで、自分がまだ理解出来ていない所を補強したいと思っています。
概出だとは思いますが、皆さんはどんなのを読まれたんでしょうか?
ふつける
Learn you ~
Real world
アプリケーションと言えばXMonadとYiぐらいしか無いな
あぁあとghc-pkgか
アプリを読んだ記憶がない
ライブラリならGHC.IO、Grapefruitとか
コードを読んだ記憶がない
論文ならそれなりに
ここで挙げられてるような本以外でコードを読んだとしたらPreludeとか自分が使いたくなったライブラリくらい。
55 :
48:2011/10/08(土) 18:19:23.10
皆さん、有難うございます。
ライブラリを読む、というのは気がつきませんでした。
Haskell導入時に、Haskellでコンパイルするやり方がある、と聞いた時点で気付くべきでした。
haskell unixコマンド
でググって出る最初のページも参考になるよ
オナニー言語の特徴だよね < 論文でしかコード読まない
実用する気とか全然なくて研究のプラットフォームとしか思ってない奴らが居るからな
理念からしてそいつら向けの部分があるし、まあ仕方ない
> 理念からしてそいつら向けの部分
って、どの理念?
in placeな書き換えがないこと(純粋な関数型言語であること)には、
実用的な意味が全くない、と思ってるんじゃないかな。
並列実行とか最適化に全く興味がないプログラマなら、そう考えるんだろうね。
61 :
48:2011/10/10(月) 11:10:21.99
世間で「実用」と考えてるものは、実態はアドホックな投資。
研究は先行投資。
本来はスパンの違いだけの話なんだが、研究の振りをした連中も確かに一部には居る。
いろんな人がいますからね。実際は「実用」ってマジックワードとして
使われてるんだと思うよ。突き詰めると定義が曖昧ですから。
プログラミングできる言語ならすべて実用的。
単純に難しいから流行らない、流行らないから資産が蓄積しない、資産がないので簡易に金儲け用のソフトが書けない、だから実用性がないって言われてるだけじゃ
さすがにBrain*uckではOSのAPIすら叩けないからプログラミングできるとはいえないけどな。
>>64 難しいかどうかって人それぞれなんじゃないの?
俺はCより簡単だと思ってる。
HaskellよりCのほうが難しいと言ってる人は大抵
どっちの言語でもHallo Worldくらいのプログラムしか書けない
Hallo!
根拠が無い主張ばっかで喋り場と化すぐらいネタが無い
Hello Worldは書いた事あるがHallo Worldは無いな
「Hallo Worldくらいのプログラム」が単純なプログラムだろうと主張するのは
Hallo Worldさんに対する誹謗中傷
もしかしたら、すさまじいプログラムかもしれない可能性を、意図的に排除してる
きっとhalloworkいきなんだよ。:-)
hello worldって言ったら画面にhello, world!って表示するだけのプログラムだろ。
俺をバカにしてるのか?
さて
haskell情報で重宝してるところってどこ?
planet haskell,
stackoverflow
haskell cafe
などあるけど
github
portal.acm.org
かずさんlispからすっかりHaskellに染まっちゃって・・・
金持ちはportal acm
貧乏人はciteseerx
山根「山根がやられたようだな……」 山根「だ」 山根「が」 山根「奴」 山根「は」 山根「我」 山根「ら」 山根「山」 山根「根」 山根「二十一」 山根「天」 山根「王」 山根「の」 山根「中」 山根「で」 山根「最」 山根「弱……」
大抵の言語で解ける様な、単純か又はアルゴリズムが判ってる問題は、速読重視、読み易さ重視、なんでも好きなのを選べば良い。
そうじゃない領域の問題は、言語を選ぶ必要があるが、全てを唯一つの言語で無理矢理カバーする必要も無い。
IBMのSシリーズブロトタイプ開発にAPLを使った例とかもある。
85 :
中2:2011/10/10(月) 15:58:57.61
Haskellはじめたよ
はじめた理由聞きたいかな?
べつに
大いに楽しむといいよ
おすすめのグラフ作成パッケージありますか?
gnuplotやchartを使ってますが
他にあれば知りたいです
チャート作成でRは鉄板。
>>59-60 Haskellの開発動機として、応用だけじゃなく研究の道具ってのがったのはたとえばA History of Haskellに書いてある
>>90 だから、それはどういう理念なんだよ
自分の言葉で説明しろよ
incanterも少しは期待できる。といってもあれは現代のxlispstatだけどな。
>>94 意味が分からない
何で俺なの?
>>58 が「理念からして・・・」と言ってるんだよ
「実用する気とか全然なくて研究のプラットフォームとしか思ってない奴ら向きの理念」
とは何かを自分の言葉で説明すべきは
>>58 本人でしょ
横レスだが、イギリスの各大学でいろいろな関数型言語が別個に開発されていて、
またオープンソースもそれほど盛んな時代ではなかったので、
大学を異動すると前の処理系は使えず、別の処理系を作り始める必要がある場合があった。
これでは人的リソースの無駄なので、
イギリス大学内での共通言語を目指してHaskellプロジェクトが立ち上がった。
97 :
デフォルトの名無しさん:2011/10/11(火) 22:46:41.76
hajimehoshiは童貞
配列から始まってSTとかStateとかData.Arrayの傘下のSTUArrayとか色々調べてるんだけど日本語の情報があまりなくてよくわからない
こういうものの情報はやはり英語探らないと駄目なんだろうか
キャチアップし続けてる人がまわりにいれば聞けるんだろうなあ。勉強会後の飲み会で話すとそう思う。
モダンHaskell(モダンPerlっぽいいいまわし)みたいな本が日本語あれば、
pythonみたいな誰かに教えたい欲求が高いチューター層が増加して、
モダンHaskell入門ハッカソソンとか開催されるようになるかも。
むしろ、初心者で読書会はじめて、そこからチューター呼んで開催するとか誰かしてくれませんか。
twitterとかで、haskell速くならないどうして?やっぱりおそいの?っていう人の
サンプルコード添削してるの見てると、使ってるライブラリの世代や発想が違う感がバリバリあったりする。
大学に入学してはどうですか?
いい年こいて反抗期
3千万溜まったら仕事辞めて大学いく
うひょんのんおんwwwオンカカッカッwwwwwwwwwwwwwwwwwwwwww
>>104 人を騙るのならちゃんとトラップまで騙ってください。
7月リリース予定でどんだけ遅れてんだ
7.4までお預けですねわかります・・・
ラーメン食べたい
ここって童貞しかいなさそうだね
どうせこいつら風俗いった程度の童貞
板全体がそんな感じじゃ。。。
忍者は処女なんだぜ
ドキドキしてきた
あまりいいたくないけど、奇妙な連中が常駐し始めたな。これなら過疎スレのほうがまし。:-p
諸君、議論したまえ
モジュール内の全ての関数と、import した地のモジュール M を全て公開したいのですが、
その場合は module モジュール名 (***) where の *** の部分に、
関数全てと module M を明示的に記入しないといけないのでしょうか
全ての関数だけなら、 (***) を省略することで全て公開しますが、
import したモジュールもとなると省略記法がわかりません
どどど、童貞ちゃうわ
>>116 自分の環境で確認していないんだけどHaskell Reportによれば、自分自身のモジュール名も参照してエクスポートリストに入れられる:
A module can name its own local definitions in its export list using its own name in the “module M”
syntax, because a local declaration brings into scope both a qualified and unqualified name (Section
5.5.1). For example:
module Mod1( module Mod1, module Mod2 ) where
import Mod2
import Mod3
Here module Mod1 exports all local definitions as well as those imported from Mod2 but not those
imported from Mod3.
http://www.cse.iitk.ac.in/users/karkare/courses/2010/cs653/Papers/haskell2010.pdf の64ページ
>>118 なるほど、それは気がつきませんでた
確かにできました
ありがとうございました
型エラーのジャングルをさまよってると、時々呪文のように解けることがある。
型エラーにはまってしまう初心者なんですけど、
型エラーの泥沼に溺れないコツみたいなのってあるんですか?
ポリモーフィズムを諦める
>>120 はまってしまう型エラーって、例えばどんなのがあった?
>>122 IOがらみ IO[Char]と[Char]をくっつけようとしてエラーにはまってたとか
IO GHC.IO.Exception.ExitCode で混乱したりしてた。
123の続き、caseで場合分けしたときに、それぞれの返る値の型が違って
おこられた例ですた。> IO GHC.IO.Exception.ExitCode
IOモナドの典型的な使い方を理解していないのが原因
使い方を勉強すればいい
型エラーは、間違いを教えてくれただけ
はまっていいたのは、型エラーじゃなくて、IOモナドを使ったプログラミング
型エラーの泥沼に溺れたという認識を深化させて、IOモナドの泥沼に溺れたと考え直すのが最初の一歩
>>125 ありがとう。 IOモナドのこと、おさらいしてみます。
IOモナドもただのモナド
ただ一度汚染されたら元には戻らないけど
つーわけで>>=とかの型をよく眺めるといい
言語にこだわらないで目的とかロジックとかほざいてるやつって大概残念だよなw
言語に依存しない抽象というものがわからないおまえが残念
同一人物かは知らないが単芝がム板の各スレでアホ発言してる
君たち正直こんな無様なことやってるバカだけどさ
ビジュアル的にそこらへんのWEBデザイナーのほうが凄いと思うぜ
お前らって素人や普通のプログラマに見せても、は?みたいな顔されて終わりだぜ
やってても意味がない 意味を求めるんじゃないとかかっこつけてほざくんだろうけど
お前らがやってること哀れだよ Haskellなんてやめたらどう?
Matz以下の脳みそがやったって 世界に何の発展もないと思うよ ましては日本
君たちはゴキブリ以下のサンプルHaskell使いって感じだねw
最近のたて読みはむずかしいな
人気が出て来た所に粘着君が出るのは、啓蟄みたいなもんだ。
人気が出てきてもスレは過疎る一方
粘着さんがいるとスレがねっとりした雰囲気になって困るよ。ただ
ボキャブラリが少ない人だからNGにしやすい。
HaskellでGUI付けたい時は何使ってる?
gtk2hs以外は良く知らないんだが。
gtk2hs以外はまともにメンテされてない気がする
>>137 Win32API、使ってる。
Windows環境でしか使えないけど、枯れたAPIのかなり単純なバインディングだから、安定感はんぱない。
GUI=WEBページ
正直F#がうらやましい
GHCとMS製コンパイラで別々の言語拡張オプション指定するのやだ!
変数名スレで訊こうか迷いましたが、こちらで訊きます
リストのそれぞれ隣同士の2要素を使って新たな値のリストを作る関数
f :: (a -> a -> b) -> [a] -> [b]
f g (x1:x2:xs) = g x1 x2 : f g (x2 : xs)
f _ [_] = []
f _ [] = []
このような関数 f は、どのような名前が適当でしょうか
>>145 f k l = zipWith k l (tail l)
なので zipTailWith とでも名づけるかな
zipなんとかAdjacentなんとか
みたいなのを思いついたけどAdjacentっていう単語そのものが冗長だからうんk
zipNextTo でええやん
>>145 フィボナッチ数列と性質が似てるから、fibZipWithってのは?
ありがとうございます
みなさんの意見を参考に、mapA に決定しました (A = Adjacent)
まっぱ!
ところで、なんで皆さん、これに zip の単語を付けようとなさったのでしょう?
私は、[a] を [a] に変換するから map を名前に付けようと思いました
(当然、要素数は1つ減りますが)
>>152 あ、すいません
[a] を [b] に変換です
セルが半シフトしたリニア・セルラー・オートマトンだよな。
mapだと単なる写像とか関手って意味しかなくて、そんなものは型みりゃ一目瞭然でそんなのを型と名前で二回も使ってると
頭痛が痛いみたいな違和感が出てきてちょっとDRY的によろしくない感じ
zipだともうちょっと意味が狭くなって [a] `f` [b] -> [a `f` b]的なリストとfの分配法則みたいな意味が出てくるけど
これも型みりゃだいたい入ってる、こちらは入れてもいい気もするけど
だから隣り合ったを示す言葉とか二つ目を一個ずらすみたいな命名ができると余すところ無く名前と型両方に無駄なく意味をこめることができていいかなぁ
とか思った
Aは haskellerならappricativeを想像するんじゃないかな。
perlninja2
メンバ
登録日: 2011-09-30
投稿: 10
E-mail
いまCD-R 700MBとガリガリ君ソーダ味かってきました
Ubuntu入れなおしたほうが早いと思いました
回答ありがとうございました
perlninja2
メンバ
登録日: 2011-09-30
投稿: 10
E-mail
Ubuntuを起動するとフリーズしていまいます
ターミナルの画面が真っ白で、ちょっと動かすと元の色にもどります
そしてウインドウを動かしたり ターミナルにコマンド打ち込んだり フォルダ開いたりしようとすると反応がありません
上のメニューバーの再起動とかログアウトはボタン選べるんですが まったく応答がありません
いろいろデスクトップのフォルダを開こうとしても開けないです
どうすればいいんですか?教えてください
直しかた教えてください
昨日まで普通に使えてたのに突然使えなくなりました
再起動したりなんかいも起動しなおしても同じ現象です
Perl忍者はHaskellができません。
ですが、ここのスレに来てはいけないというルールはありません。
>>157 では、mapAdj や mapN (N = Neighborhood) で
>>156 「名前と型両方に無駄なく意味をこめる」
なるほど、そういう考え方もあるのですね
わたしは、改めてこの関数を使うプログラマの立場に立って考えてみると、
型シグネチャはライブラリ ドキュメントを見ることでしか確認はせず、
普段ソース中でこの関数を使っている時は関数名しか見ないと思いました
そして、ライブラリ ドキュメントはソースに比べてそう頻繁に見るものではない
(自分がそうなので)
だからソースを眺めた時、この関数を使っているところで、
「何がどのような結果になるのか」という情報が仕舞われた頭の抽斗が開けやすくなる、
抽斗の場所がぱっと思い浮かぶようなキーワードがいいなと
ポイントフリーで使っていると余計にそう感じます
というわけで、私はむしろ型シグネチャで分かる意味・ニュアンスも、
積極的に関数名に入れていこうと、皆さんの意見を聞いて思いました
掟
セルラーオートマトンの文脈では、fがevolverでgがtransducer
変換って、いろいろな言葉があるよね。
translator
tramsformer
transducer
厳密な使い分けはあるのだろうか?
>>164 converter、diverter などもありますね
内部で非ボックス化タプルを使ってる hs ファイルは
ghci ではロードできないのでしょうか
ghc コマンドでは普通にコンパイルできたのですが、
ghci の :l でロードしようとすると、次のようにメッセージが出ます
Error: bytecode compiler can't handle unboxed tuples.
Possibly due to foreign import/export decls in source.
Workaround: use -fobject-code, or compile this module to .o separately.
これは、ghci でロードしたかったら、hs ファイルではなく
オブジェクト ファイルにコンパイルしとけ、という意味でしょうか
ghci でロードできないのでしたら、一つのソースコードで、
ghc でのコンパイルの場合は非ボックス化タプルを使って、
ghci でロードする場合は普通のタプルに自動的に切り替える
というようなことはできないでしょうか
>>125 ハスケルたんは悪くない(キリッ
勉強不足の初心者が悪い!
ですか?
>>166 そういうこと。あるいはghciに-fobject-codeを渡すのでもいい
>というようなことはできないでしょうか
少なくとも今はできない
>>167 丁寧に答えてくれた人に 何しょうもない事言ってんねん。どっかいけ
答えてもらって助かったからそれでええんじゃ。
初心者はハスケルたんを汚す悪いやつ!
敷居が高いおかげでドカタが流入してこないから
Haskell界は住みやすくpurityが保たれている
ありがとう>125
>>171 でも、スレには何も知らずに荒らす連中が来るようになってる。
日本語版stackoverflowでもあったほうがいいんだろうかね。
日本語版か...おぞましいことになりそうな悪寒
忍法帳を発展さてくれればいいんだけど嫌がるひとも多いか
あとプログラム板でもID表示とか
>>171 こうしてHaskell界では
モナドモナドモナドモナカモナコ....だけでスレが消費され続けるのですた
メデタシメデタシ
くっぷぷぅ
>>168 > あるいはghciに-fobject-codeを渡すのでもいい
なるほど、ロードする度にオブジェクトコードを生成するよう指示すれば
ghc の様にコンパイルされるので非ボックス化タプルが使えるのですね
で、欠点はコンパイルに時間を要するかも知れないことと、
ghci のデバッガからは見えないことですね
> 少なくとも今はできない
わかりました
デバッガは今までも特に活用したことないので、
-fobject-code オプションでの対処で凌ぐことにします
>>173 おぞましくさせない工夫が必要なほど幼稚な日本語をしゃべる人
(日本人とは限らない。)が多いのは事実だ。アノニマスには
開放できない罠。一番いいのは英語を使えることというのは否定でけん。
haskellって、コンパイルしたらJavaバイトコードのような
中間言語を吐き出すのでしょうか?
それとも機械後を吐き出してくれるのでしょうか?
>>179 それは言語の仕様ではないので厳密には実装によるが、デファクトスタンダードのGHCは基本的にネイティブコードを吐く。
http://www.haskell.org/ghc/ では、
> GHC compiles Haskell code either directly to native code or using LLVM as a back-end. GHC can also
> generate C code as an intermediate target for porting to new platforms. The interactive
> environment compiles Haskell to bytecode, and supports execution of mixed bytecode/compiled programs.
という紹介になってた。
182 :
179:2011/10/18(火) 13:32:09.88
ありがとうございます。
質問なのですが、windows上でGHCでコンパイルして、出来上がったhello.exeファイルをダブルクリックで実行するには、どうすればよいですか?
コマンドプロンプトから、ファイル名を入力したら、実行はできます。
>>183 たぶん、実行はされているけど、すぐにプログラムが終了してコンソールが閉じているだけだと思う
main = let loop = loop in putStr "Hello World!!\n" >> loop
でコンパイルしてダブルクリックしてみ
>>184 ありがとうございます!
その通りでした!
FizzBuzzを剰余使って書くのはすぐ思いつくけど、以下のは新鮮だった。
どうやったらこんな発想が出来る様になるんだろ。
fizz = cycle ["","","Fizz"]
buzz = cycle ["","","","","Buzz"]
f s n
| s == "" = show n
| otherwise = s
main = print $ zipWith f (zipWith (++) fizz buzz) [1..100]
>>186 オレ、そのアルゴリズム自力で思いついたけど、そんなに不思議かな。
たしか、3を法とする商群と5を法とする商群をなんとかすれば・・・ みたいなことを考えていて、思いついた
188 :
186:2011/10/20(木) 23:29:22.83
>>187 C、java、rubyと来たのでmapは理解していたけど、手続き型言語には無い発想だと思う。
ついでに言うと、今なら手続き型言語ユーザーが何故、関数型言語を誤解するのか判る気がする。
「関数」「型」「評価」など、同じ字面でも関数型言語とは違う意味で説明される物が多い。
要するに根本的なパラダイムが違うって話だよな
英語で話すときは英語で考えなきゃ滑らかに話せないって話は聞くけど、
Haskell で書くときは Haskell で考えなきゃいけないってことだろ
>>186 いいかどうかは別にして、カウンタやインデキシングを避けて、
何でもリストで考えればそうなる。
そうするとリストの代数的操作でプログラミングするようになる。
Richard Bird先生の本を読むのがいいかもしれない。
191 :
187:2011/10/21(金) 00:00:33.30
>>188 逆にオレはfor文でFizzBuzz書けとかいわれたら、戸惑うかな? たぶん戸惑うな。
whileでとか憤死するレベル。
よーしパパFizzモナドとBuzzモナドを合成しちゃうぞー
でも それ、1から連続する数字のリストだから正解なだけで
あまりいい回答ではないと思ったかな。fibbuzzとかはやってるけど
関数型言語の普通の作り方すれば、最後のリストを[1..100]と
違うのだけの違いだから新鮮にも見えなかったよ。抽象化が得意な言語
とそうでないものでのさがあるんだなということかな。
prnFizzBuzz = mapM_ putStrLn.FizzBuzz
FizzBuzz n 。。。パターンマッチ
で
prnFizzBuzz [1..100] とか prnFizzBuzz fibSeq とかでおしまいだろ?
for文などでかけと言われたらかけるけど、関数型の記述に比べれば
泥臭くって、抽象化ができないよね。関数オブジェクトなどを使って
抽象化させて作るんだったら、初級っぽくないだろうし。
mplusを使ってfizzbuzzを書こうとすると現行のMonadPlusの駄目な部分がわかるかも
196 :
186:2011/10/21(金) 08:04:56.77
>>190 >
>>186 >Richard Bird先生の本を読むのがいいかもしれない。
情報有難う!
Research paperを幾つか、ざっと読んでみた。
まだよく理解出来ない所も多いけど、Haskellって面白い。
>>194 細かい抽象化は全体からみれば効果がないだろうよ
>>196 鳥先生に興味が出てきたら早速ピアソンのサイトへ行ってAlgebra of Programmingを手に入れるんだ
>>197 何を優先してるかで違うのは当然だが、抽象化のセンスを見るのにも
いいとは思うがな。ボイラープレイトを取り除くにしても、この手の単純な
抽象化が出来なければ難しく感じるだろう。
余談だが、この辺の抽象化のセンスってLispのマクロを作るセンスにも通じ
てる印象がある。マクロで関数を作成するにしてもマクロを作成するにして
もボイラープレイと除去と同じセンス必要なので。
>>192のアイデアを水平合成とみて
>>186のに適用するとこんな感じ?
type Magma a = a -> a -> a
class MonadZero m where
mzero :: m a
class MonadZero m => MonadOr m where
mor :: Magma (m a)
class MonadZero m => MonadPlus m where
mplus :: Magma (m a)
instance MonadZero [] where
mzero = []
instance MonadOr [] where
mor xs = if null xs then id else const xs
instance MonadPlus [] where
mplus = (++)
fizz = cycle $ replicate 2 mzero `mplus` return "Fizz"
buzz = cycle $ replicate 4 mzero `mplus` return "Buzz"
fizzbuzz = zipWith mplus fizz buzz
main = print $ zipWith mor fizzbuzz $ map show [1..100]
listモナドの和を論理和(つまりMaybeモナドの和)、数値和の二通りに見ることで数値和で作ったfizzbuzzのパターンと数字のパターンを論理和で合成する・・・と
Listを信号としてみれば、もろor回路による信号の合成だよな。始まる場所が変わることに対してはdrop等で開始位置をずらしてつまり信号のdelay回路か
SignalArrowを使った抽象化でもいけそうに見えるな
それはさておき垂直合成、つまりモナド変換子を使うのはどうなるんだろうか
FizzT (FuzzT Identity Int) [String]みたいな型になればそれっぽいんだけど
>>194 で、いざHaskellでEnumeratorとモナド使ったfor記法が定義されたら
嬉々として使うんだろ?
>>201 いらないよ。ループ系ですらほとんど使わないのに。
>>189 思考が言語を作ったが
今や言語が思考を制限するのですね
自然言語では当たり前の話だが、言語=思考なんだよ。
自然言語ですら異論ありまくりだよ
たとえばMatzあたりがよく引き合いに出すが、そんなに支持されてる仮説じゃない
あと、エキスパートの思考は言語化できないことが多い
エスパーの思考に見えた
明日筑波でHaskellな話してくるよ!
まだハスプラ更新されない
毎回のように延期するんならもうちょっと余裕を持ってスケジュール宣言しとけよ
ドラクエみたいなモンだよ
スケジュール通りに発売されたドラクエなんて、逆に心配だろ?
確かに長々と書いたC++のコードが一発でコンパイル通った時くらい眉唾だな
Winでgtk2hs使えるようにするのって大変っぽい?
linuxだとcabalをapt-getで入れて、gtk-buildingToolsをcabalで入れれば良いだけみたいなんだけど、Winのgtk2hsインストール手順が別になってて複雑っぽい。。。
最新の Haskell Platform を入れているのなら、以下の手順でインストールできる
1.
http://www.gtk.org/download/win32.php へ行き、
All-in-one bundles のバージョン 2.16 をダウンロード(2.22 ではダメ)
2. All-in-one bundles を展開してホワイトスペースが無いパスに置き、
All-in-one bundles の \bin ディレクトリへのパスを環境変数 %PATH% に追加する
3. GHC インストールフォルダ内の mingw/bin ディレクトリへのパスも
環境変数 %PATH% に追加する
4. cabal install gtk2hs-buildtools
次いで cabal install gtk
最新の Haskell Platform にある GHC のバージョンより
高いバージョンの GHC を入れていたり、別の環境だったりした場合、
どうするかは知らん
filter 関数とか、いいかげん型クラスの関数にして、
ライブラリの構造を整理してほしいな
>>218 失敗したみたいなんですが、cドライブ直下だとダメとか、ありますでしょうか?
今更気付きましたが、Win7のx64環境です
だからダメと言う事は在るのでしょうか?
ghcにあわせてwin32版を落として設定して失敗してます
>>222 ごめん、言い忘れてた
私の環境は
OS : Windows7 Home Premium 32bit
Haskell Platform : 2011.2.0.1
これ以外の環境でどうやるかは分からない
> だからダメと言う事は在るのでしょうか?
あるんじゃないかな
64 bit 版の All-in-one bundles でやってみたらどう?
さっき提示したページの上部に [Download] のリンクがあるから、
そこから 64 bit 版へ飛べる(まだ実験バージョンだと書かれているが)
>>223 私の方こそ忘れてました。
haskellPlatformは同じバージョンを使ってます。
ダメモトで64bit版も試してみます。
>>223 何とかWin7の64bitでgtk2hsインストール完了しました
結論から言うと、gtk+の64bit版ではなく、
>>218でダメと言われてた2.22で成功しました。。。
(手順はそれ以外は同じで、サンプルコードの動作確認も完了済み)
因みに、64bit版ではインストールに成功するものの、リンクでこけました
これでgtk2hsの勉強が始められそうです
ありがとうございました
>>186 楽しいね、これ。ずっとスレ覗くだけだったけど、久しぶりにhaskellしたくなってきたよ。
last [1..1234567890]
を早くする方法で悩み中。
リストの最後の数値は判ってるんだから、すぐに出力出来るはずなんだが…
>>228 > リストの最後の数値は判ってるんだから
なぜ?
>>228 リストは先頭からしか読めないからな
最後の数値を即座に取り出したいなら別のデータ構造を考える必要がある
>>229 既にソースに書いてある。
先頭から見て行かないと判らない、というならそれはHaskellの出来の問題じゃないの?
>>231 リストのデータ構造の性質
haskellじゃなくても、リストを使えば先頭からしか辿らない
ハスケルの配列はO(1)なんだっけ?
>>231 たとえば [1..3] は 1 : (2 : (3 : [])) であり、
「リストを構成するデータ型」の値だ
そして、 : や [] はこのデータ型の「値構築子」だ( : は中置値構築子)
last 関数は、last [] = errorEmptyList "last"; last (x:xs) = ・・・
という形のパターンマッチを行う関数だ
last [1..3] は last (1: (2 : (3 : []) なので、
(x:xs) にパターンマッチし、x=1、xs=(2 : (3 : [])) と束縛する
リストに限らず、データ型の値を作ってる値構築子の引数(この場合は 1 や 2 など)は、
このようにパターンマッチさせて値構築子を剥がす事でしか参照できない
で、リスト 1 : (2 : (3 : [])) がこのようなネスト構造を成している以上、
ネスト構造を「順に剥がしていく」ことでしか中の値は参照できない
ちなみに、f (_:_:x:_) = という関数で f [1..3] などとして一気に x=3 と束縛しようとしても、
内部で順に値構築子を剥がす処理をしてパターンにマッチするかを調べるから同じ事
これを 「Haskellの出来」 というのなら、そうだね、としか言いようがない
>>234 haskellの出来じゃない
配列と違って、リストはメモリ上に連続して並んでる保証はない
だから、先頭から順々に次に要素のアドレスを参照していくしかない
配列なら、連続して並んでるから、先頭から要素のサイズをステップ数として、希望の位置までアドレスの参照先をずらせば良い
c言語でも同じ事
(haskellで配列使った事ないから分からんが、配列と言うデータ構造の性質としてはO(1)になるはず)
x要素のサイズ
o要素一つのサイズ
>>231 構文木の段階の情報と、実行時の段階のマシンコード (バイトコード) ではレイヤが違う話。
レイヤをまたいでうまいことやれば…というのは個別の実装の最適化をがんばってもらうしかない。
last [1..3] くらいならコンパイル時に展開してもいい気がするけど
それでじゃあ、この最適化があれば実装の出来がいいかって言われると
うーん
>>238 うん?
ghciの話じゃないのか
ghcにO2オプション付ければ積極的に最適化されるから、
last [1..3] = 3
みたいに最適化されてんじゃないの?
>>239 少なくとも GHC 7.0.3 ではされません
>>186が楽しいって感覚は分からないな
Haskellや関数型プログラミングらしくなくて、むしろ気持ち悪いくらいなんだけど
>>186 俺は、楽しいかどうかというより、
そういう発想が他のどういうところに活かされるのか気になる
FP的だから関数型言語的と言っていいと思う。
>>243 >>241 はFP的ではないと感じてるわけだから、
どの辺りがFP的か簡単にでも説明してあげないと堂堂回りになるよ
通じないだろw
普通はプログラミングパラダイムの方を思い浮かべる
FPと言えばBackus先生のFP!
Function Programmingの略!
これが関数道の正しい道!
逆にどこが違う?
>>248 じゃないけど、おれも
>>186 のどこが関数的か分からん
関数的とも手続き的手も言えん、なんとも分からん代物
こんなの関数的な要素は全く無いだろ
mainの最後を[2..100]と変えたらおかしくなることからして関数的でないことが分かる
それに関数的かどうかとは別に、プログラムとしても洗練されてない
fizzとbuzzの空文字列や関数fに数値を渡す設計はどうにかならなかったのかと思うし
fの中で文字列の比較をしてるのも酷い
Bird先生?難しい本を薦める前に添削してやれよと…
BackusのFPはポイントフリースタイルのイメージだね。
Bird先生は別に要素レベルの演算までリストでやれと言ってるわけではないと思う。
lift n = (n,"")
fizz (n,s) = (n,s ++ if n `mod` 3 == 0 then "fizz" else "")
buzz (n,s) = (n,s ++ if n `mod` 5 == 0 then "buzz" else "")
fizzbuzz xs = map (buzz . fizz . lift) xs
くらいでも関数的と言っていいんじゃないか。
それ以前に、センスがあるとは思えないんだが。奇抜さはあるにしても。
>>254 それはBird先生の本を薦めていた人たちに言ってくれよ
俺は剰余を使ったつまらないのしか書けないから
しかし
>>252も何がしたいのかよく分からないなw
>>258 うん
そういうのを使って「標準ライブラリ」を大掃除して整理してほしいんだよ
そうすれば、外部ライブラリもそれに倣う
標準Cライブラリですら比較的に一貫しててすっきりしてるのに
今ある標準ライブラリはもう手を付けず deprecated にして、
真標準ライブラリを新たに作ればいいのにな
それか、標準ライブラリにバージョンを付けるとか
普通のライブラリは(いちおう)バージョンで管理できていて、インターフェースとかバリバリ変わっても(いちおう)整合性が保てているのに、
Preludeはそういう鈍重な憂き目にあうのは、つまり、Prelude自動読み込みというアイデアがアウトだったのでは
なるほど、Monad の return に勝るとも劣らない汚点に思えてきた
仕様が 2010 に変わる時にいっしょに整理しておくべきだったよな
ラノベ読んでたら、よくわかる現代魔法でHaskellのコード出てきた
2巻以降には出てこないけどなw
実際使うだけの場合、名前の由来がわかりづらいとは思うが、
returnは別に汚点じゃない。
failさん・・
>>261 Haskell版Boostをご所望か?
>>268 ごめん、Boost とどう繋がるのか全く分からん
GHCi, version 7.0.3 で
Prelude> let a = reverse
で、:t a と :t reverse が互いに同様なのに、
Prelude> import List
Prelude List> let b = group
で、:t b と :t group が互いに違うのは何でだろ?
エロイ人教えて。
関数型言語の原点「=ったら=なの!」からどんどん外れて
言語仕様が焼け太りしてきたな♪
heterogeneous equalityが原点とな?
もう忍者はいないよ
死んだ
死んだ
一つの生命が途絶えた
Perl忍者
Perl忍者の意志を継ぐものが現れるよ
新生
そう感じる
遅延評価前提のデータ構造って、よ〜するに制御構造だよね?
これはいつ評価される(べき)か、とか考えつつデータ構造を作りながら、
ふとそう思った。
そりゃあんたにとってそう見るのが一番自然だってだけです
捉え方は無限大とはいわないけど十色ぐらいはあると思う
>>279 そう決めてしまうと
発想を狭めることにはなるかもしれないな
デジタル回路にも同期と非同期があったな
発想を広くとか勘違いしてるやついるな
発想はよさだろ
発想が狭くても良ければいい
お前みたいなやつはクソ
海外旅行経験300回未満のゴミが
"欧米では〜〜、海外では〜〜、視野を広める、心を広く、発想を広く、世界は広い、井の中の蛙、まだまだ甘かった
日本人は〜、コミュニケーションは大事、むこうでは〜〜、ボブがよ!ヘイ!ジョンとかブログに書く馴れ馴れしく”
とかほざいてるのとおなじ気持ち悪いんだよゴミ
なあゴミ
質問です。
海外旅行をすればHaskellがバリバリ書けるようになりますか?
>>284 良い発想かどうかは、誰がどうやって判断するんだろ。。。
本当久々だ
>>286 そんなのは世界中のHaskellに関わり、
かつのその発想に関わる人間みんなが判断していくんだろ
そして、大多数の人に良い発想だと認められれば、
その発想が世の中に認められているということだ
ごく普通の当たり前のことだと思うが、そんなに疑問に思うことか
コテが付いて無くてもフィルタリング出来るパーサーで、スレがすっきりした。
パーサー実装はHaskellの練習としては手頃なのでお奨め。
>>279 これを否定されてそんなに腹が立ったのかいw
パーサとはいったい
>>290 それより「発想」ってのが何かのトラウマのスイッチを押してしまったらしいよ
関数型言語がいつまでもキチガイ誘蛾灯みたいなポジションなのも困るね
電球の外に群がる事があっても、電球の中にまでは入ってこられまい。
大発見の相手してやんないと拗ねる奴ってどこの板にもいるけど
全部一緒なんじゃなかろうな
>>293 X: 関数型言語がいつまでもキチガイ誘蛾灯みたいなポジションなのも困るね
O: ハスケルがいつまでもキチガイ誘蛾灯みたいなポジションなのも困るね
フーリエ変換への変なアプローチなら、できるかどうかは別としてありそうではあるけど。
>>298 「できない」アプローチが「ある」っていう概念が理解できないから説明してくれろ
>>295 >全部一緒なんじゃなかろうな
284〜296まで一人で自演乙
でも、こんな過疎スレで一時間ちょいで十レス以上とか、
もうちょっとリアリティってヤツを考えたほうがいいね。
Haskellでプロトタイピングをするとき、ここから作ってく、こうやって作っておけば後からの変更に強い、
みたいな作法って持ってます?
ある組成式を受けとったら、その分子の平均質量とかマススペクトルとかを返してくれるような
プログラムを書いてみようかと思ったんだけど、まず基本となる原子のデータ型から作っていって、
data Atom = Atom { abbr::Char, abundance::Distributions }
type Distributions = [(Int,Double)]
とか定義しておいて、average :: Atom -> Doubleやspectrum :: Atom -> (Int -> Double)
みたいな関数を作り、組成式はtype Molecule = [(Atom,Int)]としてみようか、と考えています。
で、Atomを拡張してname::Stringみたいな値も格納しておこうか、と思いついたとき、
Atom型の値の中身をパターンマッチで分解している部分は全て書き直さなければならなくなります。
変更に弱いから、手探りでコーディングをしているときはパターンマッチによる分解は使うべきじゃない、ということで良いのでしょうか。
>>301 とりあえず、その個別の問題に対しては、
data T1 = T1 { c :: Char }
data T2 = T2 { d :: Char, s :: String}
f T1{c = 'a' } = "c is 'a'"
f T1{c = c } = "c is not 'a': " ++ show c
g T2{d = 'a' } = "d is 'a'"
g T2{d = d } = "d is not 'a': " ++ show d
以上のパターンを用いることによって対処できる
さらに、
h t2@T2{d = 'b' } = t2{d = 'c', s ="foo" }
のようにasパターンと組み合わせることものできるから、かなりの柔軟性が確保できるはず。
303 :
302:2011/10/28(金) 03:20:39.58
ごめん。捕捉。
T1とT2は、別の型というよりも、変更前の型と変更後の型をシミュレートしていると考えて。
だから、このコードではcとdは別の識別子だけど、変更前と変更後で同じ識別子にすることができる。
>>301 > Atom型の値の中身をパターンマッチで分解している部分
ここが元凶じゃないかな
Atom型の値の中身をパターンマッチで分解するのなら、
何の為に abbr 関数や abundance 関数を定義したの?
パターンマッチで分解するんじゃなく、
これらの関数を使って中身を取得すべきじゃないの?
パターンマッチだと型の構成を固めちゃうよ
ちなみに、見た目よく似た問題に Expression Problem というのがある
data X = A | B という型をパターンマッチで A B 仕分けしている関数が多くあり、
そこに新たに C という値構築子を追加したいが、修正すべき関数が多くて大変
なんとか楽にしたい、ついでにできれば再コンパイルしたくない
そういう場合なら、たとえばこことか日本語で分かりやすい
http://d.hatena.ne.jp/maoe/20101214/1292337923
>>301 普通はデータ構築子をmodule外に非公開にすることで
内部構造を隠匿する
よくあるOOP言語ではclassが抽象データ型の単位だけど
Haskellだとmoduleになる
306 :
301:2011/10/28(金) 09:25:56.34
>>302すいません、パターンマッチでの分解に、record syntaxを含めていませんでした。
haskellの入門書などではdata X = MkX Int Double Charなどとしておいて、
f (X i d c) = ...と記述することが「できる」とあったのですが、これって便利なのか?と疑問に思ったのです。
>>304確かにアクセッサ関数を定義しているので、型に何かを追加する可能性がある場合は
柔軟性を保てるのですが、例えば存在比を(Int,Double)のリストで表すよりもData.Mapで表す方がベターだと思った場合、
やっぱり変更先が多くなりそうになって嫌だなあと思った次第でして。
>>304のリンク先の方法がスマートに見えるので試してみたいと思います。
最終的には原子に限らず、平均値と分布を出せるようになりたいので、averageやspectrumをAtomだけに制限するのは良い手じゃなさそうです。
>>306 > 例えば存在比を(Int,Double)のリストで表すよりもData.Mapで表す方がベターだと思った場合
そういう場合は、Data.Map 型を使ったコンテナに対するアクセス関数を公開して、
そのコンテナ内部で Data.Map 型を使っていることは隠蔽しておく
>>305 も同じ様なことをアドバイスしている
こうやって、データとそのユーザとの間にインターフェースを設けるのは、
Haskell に限らず、まず間違いなく全ての言語で共通する考え方
CICP 的に言えば「抽象の壁」だ
ちなみに、
>>304 の後半で紹介した Expression Problem は、
少なくとも
>>301 から読み取れる問題とは別ものと思われる
(応用できるかどうかは分からないけど)
>>307 すまん
誤) CICP 的に言えば
正) SICP 的に言えば
ようやく少しモナドの感覚がつかめた。あれって世界を分けてて、その世界の中
で作業をしていくための工夫という感じだな。ってね。安全な作業をするには必
要なんだってのもようやくわかった。
同時に感覚的なイメージでモナドを上手に例えて伝えるようなものがあまりない
のかもとも思ったかな。水中で普通のデジカメで撮影をするには防水ケースの中
に入れて使うけど、あの防水ケースっぽい働きなんだなってね。そんなアナロジー
を想像してしまったかな。
>>309 > 同時に感覚的なイメージでモナドを上手に例えて伝えるようなものがあまりない
> のかもとも思ったかな。
確かにね
hage :: [Int]
hage = do
x <- [1..5]
when (x == 3) (fail "discard")
return x
こういうのだと、どの世界とどの世界に分けてるのか曖昧だし
明確に分けられたとしても、その世界に何かを閉じ込めているのとも違う気がする
リストモナド自体が分岐した世界を表現してるからな
>>311 いや、たがら、そのリストモナドが分けた2つの世界は何と何か
という辺りが自分では上手く説明できないなぁと
do内の世界はdoの流儀に従ってる。だけど、do外の世界はdo内のことには
結果を渡される以外無関係ってと事だろう?
do ってただの糖衣構文じゃん、世界の構成要素ではないでしょ
>>310 のは実質これ
hage :: [Int]
hage = [1..5] >>= \x -> when (x == 3) (fail "discard") >> return x
>>313 の言う流儀というのは、結局
Monad クラスのインスタンスの定義方法、だよね
(>>= 関数をどう定義するか、return 関数をどう定義するか、など)
でもそれは、たとえばアローでも同じ事が言えて、
proc do内の世界はproc doの流儀に従ってる・・・
つまり Arrow クラスのインスタンスの定義方法がその流儀となる
じゃあ、アローもモナドと同じように、世界を2つに分けているのかな
分けているのなら、モナドが分ける世界とアローが分ける世界は何が違う?
そこまで考えて初めて、モナドが何をどう分けているのか、
ということの理解に繋がると思う
むしろ分けてるんじゃなくて繋げてる
床下配線
いろんな意見ありがとうございます。アローのことはそもそも知らないくらい
なので、また探ってみたい。やっと面白いと思うことが増えてきた感じです。
arrowのことは他の理解を終えてから取っかかるよ。
実はRWHをようやく半分まで消化したところ
core言語のパーサーを作ろうとしているのですが、
他にこれは読んでおけ、このページは見ておけというものはありますか?
319 :
318:2011/10/29(土) 10:50:44.72
>>318 書き忘れていました
今は Haskell Platform 内のドキュメントを読んでいます
>>320 ありがとうございます
そうですね、元の Haskell の仕様を読んでおくのは当然ですね
熟読します
extcoreパッケージのソースコード
>>322 ありがとうございます
Webサイトや README をざっと見た感じ、自分でパーサーを作らなくても
extcore 自体を使って目的が達成できそうな気配なので、ちょっと試してみます
ごめん、ぐぐったら出てきたわ>core language
確か標準では形式的な定義は与えてなかったんじゃなかったっけ
そうだが
どうした、いきなり
328 :
デフォルトの名無しさん:2011/10/30(日) 22:46:14.15
windowsでHaskellを使う場合、文字コード変換はuconvしか選択肢無い?
WIn32APIの該当関数を FFI で呼ぶという方法もある
IOモナドになるけど、余計なライブラリも使わず意外に簡単だったりする
Haskell でたまに次のようなコンパイル エラー メッセージが出るのだけど、
・・・ `a' is a rigid type variable bound by ・・・
この rigid type というのは何の分野の用語なの?
どういう状況のエラーなのか、もっと深く理解したい
Num a => aはrigidじゃない。
数値型はたくさんあるから。
liftMとliftAの使い分けってどうしてらっしゃる?
もう11月になるんすけど
リリース予定どうなってんすか?
11月の感謝祭にリリースするってさっき白石さんがつぶやいてた
>>333 基本liftAというか<$>を使うけどControl.MonadをimportしているようなモジュールならliftMでいいんじゃないかなぁってぐらい
少なくとも自分のプログラミング生活の中ではもう Haskell Platform に頼らなくても、
最新の GHC や Cabal、ライブラリ群を個別にインストールして問題なく使える
というわけで最近 Haskell Platform を捨てたら、
パンツを脱いで仁王立ちした時のように清々しかった
linuxならそれでもいけたけどwindowsだとcurlの時点で割と悪戦苦闘でした
>>332 じゃあ、逆に rigid な型にはどういったものがあるの?
>>335 ありがとう
参考にさせてもらいます。:-)
>:(
(/:|)
=:>
ゲソゲソ
NodeNinja...
Perl忍者のパクりですか
Haskell甲虫
utf-8の日本語文字列をS-JISに変換するライブラリは無いですか?
hoogleに無かったら無いんじゃろか。。。
ICUへのバインディングがあったような
ICUってのが分からんが、Win7(x64)で文字化けしないなら何でも良い
iconvもあるような
text-icuのData.Text.ICU.Convertモジュールで一発
ラグビーのイングランド代表のJames Haskell選手が日本のリコーに来たけど
登録はハスキルだね。
ハスケル ハスケルと読んでたけど、イギリスよみじゃハスキルのほうが
近いのかな。と思った。
アメリカの宝石デザイナーのMiriam Haskellは、
日本ではミリアム・ハスケルで通ってるみたい。
イギリスとアメリカじゃ読みが違うのか?
haskellをカタカナで書くのって違和感があるんだけど、
そんな書き方をしているのはどんな人なの?
じゃあ漢字で「蓮蹴」
>>354 schwa音だから、母音はどうでもいい。
>>356 もっと Haskell の何かを表した、言い得てみょんな当て字があるといいんだけどなぁ
bookkeeping -> 簿記
function -> 函数
みたいに
そういうのはたまたま運のいい語でないとむりぽ
治具とjigとか
削切 はつきる
荒井熊
'アスクル
あなたは運についてしってますか???」
来未の運理論でぐぐってね ひゅひゅ
値を部分的に更新しながら使い回す場合、
必ずミュータブルな操作を持つデータ型を使わないといけないのか、
それともIOモナドやSTモナドの中に入れてしまうだけでいいのでしょうか。
例えば配列でMArrayを使わずに、
IORef (Array Int Int)みたいなデータ型を用意して、
IOモナドの中でmodifyIORef x (// y)としても、配列を新しく作り直さずにxを更新できたことにはなるんでしょうか?
>>365 IORefはポインタ
writeIORefで破壊的に更新できるのはポインタ部分だけで、
中身を破壊できる訳ではない
modifyIORef x (//y)とすると、新しい配列(を作るサンク)が作られた上で、
xがそれを指すように更新される
ありがとうございます。
やっぱり駄目かー。
http://itpro.nikkeibp.co.jp/article/COLUMN/20100406/346695/?P=5 >LinuxやMac OS XなどのUnix環境では,ロケール(locale)の設定を見て自動的に適切な文字コードに変換してくれます。ロケールは,言語や時刻など,使用しているOSのローカルな設定を決めるためのものです。
>Prelude System.IO> putStrLn "テスト"
>テスト
>一方,Windowsでは,UTF(UCS Transformation Format)とHaskellプログラム内部の文字コードとの間で変換を行うことはできますが,技術的な問題からShift_JIS(Microsoftコード・ページ932)のような2バイト文字ではまだ文字コードの変換ができません
LinuxやMacはiconvとか無しでも日本語扱えるようになったのに、Windowsだけなんて・・・orz
>>368 HaskellのArrayはpersistentじゃない
371 :
デフォルトの名無しさん:2011/11/05(土) 20:17:35.88
要は素直にmutableなコンテナ使っておけばいいんだろ?
画像ファイルを読み込んで、いくつかフィルタを施して、結果を保存する場合、
フィルタリングするイメージデータを格納するコンテナには何が適切なの?
CArray
[Word8]
Haskellの変数の有効範囲って何か具体的に決まっているのかな?
Haskel Reportを読んでもはっきりと書かれていないような。
以下のように関数(>>?)を定義してvalue1, value2を求めると
value1は普通に求められるが、value2は\s -> s + aのところで
aが未定義ですとか言われる。
括弧があると変数の有効範囲が変わるのかな?
(>>?) :: a -> (a -> b) -> b
v >>? f = f v
value1 = (1, 2) >>? \(a, b) -> b >>? \s -> s + a
value2 = (1, 2) >>? (\(a, b) -> b) >>? \s -> s + a
>>377 関数の仮引数の有効範囲はその関数本体というのが基本原則。
> value1 = (1, 2) >>? \(a, b) -> b >>? \s -> s + a
は
value1 = (1, 2) >>? (\(a, b) -> b >>? \s -> s + a)
と解釈されるのでs + aは\(a,b) -> ...の関数本体内に含まれるが
> value2 = (1, 2) >>? (\(a, b) -> b) >>? \s -> s + a
はかっこがあるため含まれない。
>>378 ありがとう。
メタルールか。なんとなく理解した。
スコープが見て分かるように()つけまくってるとlisp化してしまうという罠
>>380 そのための$です
意外とLisp化食い止められてない気がするけど…
そう?
少なくとも )))) はだいぶ消えると思うけど。
最近は()が多少増えても別にいいかなと思うようになってきた。
いいじゃん
HaskellはLispの飼い猫なんだし
昔、BASICしか知らないガキだったころ、Lispのコードを見てびびったのって
)))) って何これ、ってことだったので、それが緩和されるというのは俺にとっては
大きいw
>>385 飼い猫ちゃう
Haskellは汎用関数型決戦兵器や
Lispは・・・深海型やな
確かにBASICerにとって$は友達だもんな
っつーかお前らよく結合順序とか読みきれるな
俺どんな言語で書いても表見ないと安心できない
そのうち面倒くさくなってきてlisp化しちゃう
>>389 算数・数学の結合順序とほとんど同じだろ?
覚えるって程のことかいな。
微妙に分からんところは()で明示すればいいし。
>>389 最初はそんなんだったけど慣れた。
でもちょっと不安な所は、()だらけ。
直感とずれるのは関数合成くらいかな。
あれだけはいつもかっこつけてる。
迷ったら付ける
>>392 そうか?
$使えるところは関数合成できるから、ghciでlet使って試し書きする時は、$使って、ソースに書いてghciでテストする時にソースに$を関数合成に変えたものを書いてる。
(ghci上で直に定義するときは何故か関数合成できない)
そんなのカッコ付けたいだけ付けて、
フォーマッタで余計なカッコ外せばいいだろ。
原始時代じゃあるまいし…
結合順序間違ってるとたいてい型エラーでるし、
そしたら:iで確かめたらいいし。
>>395 フオーマッタについてもう少しkwskplz
$使うのと括弧で括るのとでは
実効速度違ってくるの?
最適化を掛ければ違いは消える
あり^^
Haskellの勉強をWindows上のemacs+haskell-modeでやってるんだけど
ghcに渡すフラグをどこで指定するのかが分からないので教えて欲しい
ぐぐったらinit.elにsetq haskell-ghci-program-args で行けるそうだったけども
どうも反映されない。-Wallを付けたいんだけど…
あと皆さんはどういう環境でHaskell書いてるのかも教えて欲しい
.cabalに:set -Wall
ただし相当うざいから覚悟すべし
俺もemacs+haskell-modeでやってるけど、
コンパイルやghciは別にコマンドプロンプトを開いてる(開いておく)
emacsからghcやghciを立ち上げたりはしない
HaskellerってEmacsなの?Vimは?
宗教戦争始めてよ
宗教戦争始めてよ 壊れかけのエディタ♪
関数型言語(?)繋がりでemacsか、適当なエディタかの2局化が進んでるから、宗教戦争は無い
所で、haskell版emacsと聞いてYi落としたかったんだが、サーバ落ちてるっぽい
なにその竹島みたいな
そもそも領土問題は無い
みたいな
そんなこと言われても、そもそもHaskellは宗教みたいなもんだから
Haskellを既にやっててこれからEmacsかVim選ぶならEmacs一択でしょ。
どっちでもいいと思う
どちらでも普通に Haskell 使えるし
俺 (
>>404) はたまたま Haskell 以外の、普通の文章なんかも書きたかったから、
Windows でプロポーショナルフォントが問題なく使える Emacs を選択した
(vi は固定幅フォントしか使えん)
Haskell コーディングで俺が使う機能としては秀丸でもいいくらいだが、
Emacs の方が個人的には使い心地がいい
どうでもいい。
好きなほう選べば良い。
413 :
301:2011/11/08(火) 13:17:35.69
YiにもLeksahにも、haskell-modeにも->を→とかforallを∀と表示してくれる機能があるけど、
インデントがどうなるのか分からないので使ってない。そんなに数学記号に親しいわけでもないし。
emacsにもあるよ
精精\をλにぐらいだなぁ
>>413 インデントが重要になる場所ではスペース以外使わない習慣を付ければ、
たとえプロポーショナルフォントでも安心してHaskellを書けるよ
haskell-modeのおしきせインデントってちょっと変になるときがあるけど、
かしこくするようなハックってある?
あと、++ とか && とかでつながった長い行を分けたいとき、
演算子の前で改行する?後で改行?
Yampa を色々弄ってるんですけど、意味がよく分からない関数が多いです
とりあえずゲームを作ってみたいので、[The Yampa Arcade] とか
[The University of New South Wales School of Computer Science and Engineering]
なんかの論文や Haskell Wiki を読んだりして試してます
ただ、も少しまとまった情報はないものでしょうか
簡単なものでいいので関数を解説した一覧表なんかあると良いのですが
オリジナルのYampaのドキュメント意味分からんよな
AnimasっていうYampaのfork版だともう少しまともなドキュメントになってたけどやっぱりよくわからん
俺はelereaとかreactive-bananaとかの方が遥かに使いやすいと思ったわ
実行効率もいいしな
>>403 ありがとう。ただcabalの設定ファイルだと俺の環境ではうまく行かなかった
それを手がかりに調べて、ホーム\AppData\Roaming\ghc\ghci.confに書いたらうまくいった
-Wall付けたら警告いっぱい出て、パターンマッチが網羅されてないとか役立つのもあったけど
ただ数値のデフォルト化の警告?ってのがよく分からん
警告なんだから良くないコードなんだろうけど
書く環境はやっぱりemacsが多いのか
今まであまり使ってなくて不慣れだけど頑張ってみるよ
お前らがどんなにピーピーギャーギャー言ったって
強がろうが俺をバカにしようが
このウンコ言語が大失敗超不人気のLL以下の汚物
だって事実は変わらないの
わかった?負けず嫌いの小学生みたいな負け惜しみ見てると滑稽だよwwww
可哀想になってくるわほんとに
まあお前らも最初は被害者だったんだよな、妄想と大風呂敷に踊らされてよ
でもな、もっと早くに気づいたたゆらはいっぱいいるだろ?
いまでもこんな酔っ払いが吐き戻したゲロみたいな言語を一生懸命庇ってさ
本当の事を指摘している俺がおかしいみたいな感覚になってるんだぞお前ら?www
粋がっちゃったけど結果大失敗でものすごい負け犬感味わってるんだろうから気持ちは解るけどよ
いいかげん現実見つめろや?wwwwな?wwww
実際、今どうなのか言ってみろよ?wwwおい?wwwwww
このゲロみたいなくっせえHaskellっていう言語は使われてるの?
流行ってるの?ヒットしてるの?
発表時みたいな状況になってんのかよ?wwwwwwwww
俺Haskellやってるんだぜ!って人前で言えんのお前ら?wwwwああん?wwwwwwwww
Haskellやってます とかいってやってることはコマンドラインのへなちょこゴミコードwww
せやなプロコンの為の言語としても競合相手のpythonよか圧倒的にシェア狭いし
Haskellでプロトタイプ書く人でも最後は結局c++だし・・・
酔っ払いが吐き戻した……言い得て妙だな。
関数型というパラダイムに酔っ払った人間が自己満足のために腹の中身そのまま捻り出した言語だよなこれ。
大学の自由演習で使ったがただの自己満足コードにしかならない。
そんな意味の無いことここで発言するなよ
Twitter にでも書いとけ
それは実際に関数型言語で仕事している人向けのタイトルだな
中の人から批判が一番こたえる
釣られ過ぎだろ
そのタイトルで、リンク先の記事に反例をあげるだけの簡単なお仕事。
総じてお前らは我慢のレベルが低いよな。
所詮は烏合の衆だな(w
さて、我慢して無視を決め込んだhaskellerは何人居るでしょうw
(一応、私も含む)
>>429 無視してると言いながら、書いちゃったらダメだよ。次からは何も言わないようにね♪
知らないうちにInteger使っててパフォーマンスがやばい、
みたいなのを回避したいんじゃね、知らんけど
代数データ型のラベルの名前って、みなさんどうしてますか?
(ラベルでなくともアクセス関数を自作しても本質的には同じ事です)
例えばの話でブロック崩しを作ってるとして、
ボールの状態を表すための情報が要りますよね
まぁざっと、位置ベクトル、速度ベクトル、あとはボールの半径を盛り込むとしましょう
data Ball = Ball
{ ballPos :: Vector2
, ballVel :: Vector2
, ballRad :: Double }
私はこうやって、位置を表す Pos や速度を表す Vel などに、接頭辞として
必ずそのデータ型の型構築子(値構築子ではなく)の名前を付けるようにしています
と言うのも、ではボールの他にバーやブロックの情報はどうなるかと言えば、
こちらも位置を表す情報は必要で、他にも重なる部分がいくつか出てきます
同じ pos という関数名を使い回すことが文法上できないので、
上記の方法でやるなら名前の中で何らかの区別をしなければならず、
であるなら変に省略文字で区別するよりは、もうフルネームで区別した方がマシだろ
という判断です
このように、複数のデータ型で同じ意味の情報を扱う場合のラベル名(アクセス関数名)は、
みなさんどうしてるのでしょうか
共通の情報は型クラスに追いやって、インスタンス化してるのでしょうか
その場合は、その関数の引数として対象のデータ型の値が要りますね
俺も型名やその省略形を接頭辞にする
ぽこぽこサブモジュールを作る。
>>434 http://www.kotha.net/ghcguide_ja/latest/options-sanity.html に
-fwarn-type-defaults:
数値型に対するデフォルト化機構が発動したときに警告・通知する。
これは、あるデフォルトを前提としたコードを別のデフォルトの下のコードに変換するときに便利である。
例えば、1という値に特に制約がないとき、Haskell 1.4の「デフォルトのデフォルト」は型Intを与えるが、
Haskell 98以降ではこれはIntegerである。
これは実行時性能と挙動に影響を与える可能性があるので、通知されると便利である。
って書いてあるからまさにその通りだと思う
パフォーマンスをカリカリに追求する場合にはこの警告が必要なんだろう
俺はそんなコード書いたこと無いけど
>>435 > その場合は、その関数の引数として対象のデータ型の値が要りますね
これはデータ型に直接ラベルを定義しても同じ事でした、すいません
>>436 やはり、そうしますか
>>437 サブモジュールをどのように作って、どのようにアクセスさせているのでしょうか
モジュールを分けても、データ型のその情報にアクセスする為には関数が必要で、
当然その関数は各モジュールからエクスポートさせるのですよね
ボールの位置、バーの位置、ブロックの位置などの情報に対するアクセス関数の
名前のバッティングはどうしてるのでしょうか
もしかして、各モジュールをインポートする時に as で別名を与えてるのでしょうか
確かに(a^2)と書いただけで(2::Integer)と推論されて
重いIntegerの(^)が呼ばれるのは嫌なことがある(aはDoubleとして)
先に型を書くというのはそういうのを防ぐためにも役に立つのかな
はい
役に立ちます
いや役に立たんだろ
コードを書いてない段階でどうやって(a^2)の2に型を指定するんだ
>>444 え、どう言う型を受け取って、どう言う型を返したいか、を考えて指定すれば良いだけだよ?
>>418 Yampa 関連のドキュメントは論文も含めてけっこう多いので、
どれがオリジナルなのかもさっぱりなんですが、
どれも個々の特徴を割り下げてたり、活用したり、
さもなければ全体を長々と解説してる感じのものばかり
もっと、全体の構造をスパッと語ってくれると、
それだけでもありがたいのですが、無いですね
reactive も勉強してみたんです
シンクの仕組みがなかなか独特で面白かったんですけど、
結局これは「今はまだ」使えんと思いました
挙動が予測と噛み合わない部分や、予測し難い部分がちょくちょくあるんですよね
例えば integral 関数を使ってると、タイムリークを起こすと言うのかな、
間に合わなかった計算処理がどんどん積み上がっていって次第に処理が遅くなりました
この辺り Yampa なら react 関数を呼ぶ(呼ばれる)タイミングを
そのタイミングの処理の重さに合わせてリアルタイムに調整することは楽にできるんですが、
reactive ではその辺りどうやればいいのかよく分からない
>>445 (^) :: (Num a, Integral b) => a -> b -> a
だから、(a^2)の2の型が何になっても、式全体の型には関わってこない
>>447 こうすりゃいいじゃん
(^(2::Int))
>>449 自作の関数作るときとかは、型推論に任せるより自分で決めた方が速かったり、逆に遅い代わりに大きな数を扱えたりする
length関数と同じ機能の関数mylength作るとき、
mylength [] = 0
mylength (_:ns) = 1 + mylength ns
の型は[a]->aだが、
mylength::[a]->Int
mylength [] = 0
mylength (_:ns) = 1 + mylength ns
とすれば、当然ながら型は[a]->Intになる
訂正
x [a]->a
o [t]->a
>>450 だからそれは(a^2)のケースでは関係ないよね
>>452 自分で作る関数なら自分で型を決めればいいし、すでにある関数なら、引数に渡す値の方の型を決める他あるまい
>>453 大抵の場合は、自分で作る関数の型さえ決めれば型推論で自動的に全ての型が決まるんだよ
それだけで決まらないこともときどきあって、(^)はそれを発生させる例の筆頭
>>454 そういう話だっけ?
速い型を使いたいけど、型を明示した方が良いのか?って話だった気が・・・
単なる数字(例えば5とか)は、通常Num a。定数として宣言すると、Integralにデフォルトでなるから、数字をInt型にしたいなら、5::Intって具合に宣言しないとダメ
>>441への回答としては(^(2::Int))と書け。が、妥当だと思うんだが・・・
*Main> :t 5
5 :: Num a => a
*Main> let a = 5
*Main> :t a
a :: Integer
*Main> :t 5::Int
5::Int :: Int
>>456 ん、んんん?
だったら、
>>450の通り、先に型を書けば防げてるだろ?
(^(2::Int))は併用すればいい話じゃね?
ごちゃ混ぜに話すなよ
何が防げてるの?
>>458 遅いIntegerやNum aを使うのを防げてるだろ
だあ、もう
beki1 a = a ^ 2
beki2 :: Int -> Int
beki2 a = a ^ 2
beki3::Int -> Int
beki3 a = a ^ 2::Int
下に行くほど、遅い型を使うの防げてる
以上
先に書くだけじゃ、2がIntegerになるのは防げないんでしょ?
>>460 そうだな
ただ、一般的には自分で型を書いた方が速い型を選べる
(^(2::Int))も出してるのに、そこに拘るってのもどうなのよ?
併用すればいいじゃないかって書いたよな?
そこは認めるのか?
>>462 絡むんじゃなくて、こうだから、間違いって指摘しろよ
時間の無駄
それこそ
beki n = beki' n 2
書き損じ・・・
それこそ
beki n = beki' n 2
where
beki'::double->Int->double
beki' n m = n^m
なら、ちゃんとn^2そのものを書く前に2の型も決められるしな
(さすがに、こんな反論もどうかと思うが)
要するに型を書けば解決する話。
先に書くか後で書くかは無関係ですな。
c言語でのint (*)[4]型っぽいものをhaskell的に表現する場合、
* = Pointer, [] = Array4, int = Intと置き換えて、
Pointer (Array4 Int Int Int Int)とでも書けるんだろうけれど、
int (*)[100]型とかになってくるととても書いていられない。
何か上手い方法はないだろうか。
用途ねーだろって突込みは無しで。
Data.Arrayってそういうのじゃないの?使ったことないけど。
reactive-glutを試そうとしたら依存パッケージのcategory-extrasがインストールできなかった。
out of dateなパッケージかどうかすぐに分かる手段ってあるのかな。
ListはもうEducationalモジュールに引っ越せ
>>471 引っ越したとして、代わりに何を標準ライブラリに入れるの?
今までの List と互換が無ければ今まで作ってきた資産が死ぬし、
さもなければ互換性を捨ててでも入れる大きなメリットがあるものじゃないと
>>473 こういう総合的使い勝手に関して
関数型言語は時の洗礼を十分に勝ち抜いてはいないと思う
当面C#からF#を操作すればいいと思うしまだまだ本格使用はしない
>>473 そこで挙げられてる事に関しては俺もそうだと思う。
回避策はあるにはあるけど、いつも使える訳じゃないし。
>>473 名前空間の問題はasでimportすれば解決するんじゃ?
module が抽象化の単位だから module毎に名前空間を設定できればいいわけだし
操作とデータ型の分離はいわゆるexpression problemによくあるトレードオフそのもので
どっちがいいとかじゃないと思う
分離してmoduleで管理でいいと思うけど
class前提の人には受け付けないのか
>>473 SMLならモジュールで名前空間を実現しているから
uri.schemeやuri.pathみたいに書けて、Rubyと遜色ない
Haskellって大規模開発には適していないのかな?
Haskellわかってないやつが批判してるってのは理解できた
名前についてHaskellよりRubyの方がうまくやってるのはその通りだな
qualifiedでインポートしても結局修飾しなきゃいけなくて、.fooで済むオブジェクト指向言語には負ける
それ以外の点は的外れだと思った
関数の部分適用とsetterはまるで別物だし、パターンマッチはかっこいいifじゃないし、
高階関数の「固まり」を苦労して扱わなくて済むのはそれだけで利点だし
>>477 そのuri.schemeのuriってモジュール名?そうならRubyと遜色ないとは言えないだろ
Ruby(や他のオブジェクト指向言語)はモジュールで修飾する必要がないのが自慢なんだから
>>477 バイナリ互換性が糞だからな
それが一番大問題だと思う
名前空間は一長一短だろ、エディタでの補完考えるとhaskellみたいに関数名で完結してたほうが良い
補完は静的であれば何でもいけるんじゃないかと
>>480 SMLなら、open uri と宣言すれば、Rubyと同じように修飾を省略できるよ
Haskellはできないの?
>>481 >名前空間は一長一短だろ、エディタでの補完考えるとhaskellみたいに関数名で完結してたほうが良い
まるでイソップ童話の「酸っぱいブドウ」みたいだ....
>>484 できるけど、名前が衝突しない場合に限る。これはSMLも同じだよな?
Haskellで短かい名前を多用すると、けっこう頻繁に衝突して、けっきょく修飾インポートするはめになる
Rubyだとメソッド名はグローバルじゃないので衝突を気にする必要すらない
>>486 >これはSMLも同じだよな?
いや、ゼンゼン(理由は下記を参照)
>Haskellで短かい名前を多用すると、けっこう頻繁に衝突して、
ナゼこんなことが起きるの?
SMLなら名前空間は(Rubyと同じように)階層化されているから、
適切にモジュール設計していれば、衝突なんて全く気にならないんだけど....
もしかしてHaskellの(モジュールに関する)名前空間というのは
フラット(平坦)なの?
>>485 >>481は関数名しか補完してくれないテキストエディタしか使ったことが無いのかもしれない。
型を認識するIDEを使ったことがあれば、こんな発想にはならないだろ。
>>487 Haskellの名前空間はフラットだよ
階層化されているから名前が衝突しないってのが良く分からん
実例かポインタある?
>SMLなら名前空間は(Rubyと同じように)階層化されているから、
Rubyで衝突を気にしなくていいのはメソッド名の解決に型情報を使う
(正確にはレシーバがメソッド名を実行時に解釈する)からであって、
階層化うんぬんは関係なくね?
>>487 > もしかしてHaskellの(モジュールに関する)名前空間というのは
> フラット(平坦)なの?
どういうのをフラットと言うのか分からんが、
俺が Haskell のモジュール関係で不満なのは次のことができない事
AAA.BBB.CCC.DDD というモジュールがあったとして、
モジュール AAA.BBB をインポートして CCC.DDD.fff で関数 fff を使う事
関数 fff を使いたかったらモジュール AAA.BBB.CCC.DDD をインポートしないといけない
491 :
デフォルトの名無しさん:2011/11/12(土) 17:36:29.05
すいません、Haskell初心者で
オライリーのプログラミング言語Haskellを買ってきたのです
プログラムをかきながら本を進めていくと
後半からimportできないモジュールばかりになるのですが…
環境はWindowsでGHC6.4.1ですが、CentOSでGHC6.10.4でもダメなので
単純に環境問題ではない気がするのですが…
>>489 >実例かポインタある?
階層化されたディレクトリの無いファイルシステム(CP/Mや初期のMS-DOS)
過去の階層化されていないWindows Network(NetBIOS)
名前の衝突回避と階層化との関連はコンピュータ科学の知識があれば常識だよ
>階層化うんぬんは関係なくね?
Rubyのインスタンスメソッドについては、その通りだね。
ただし、Rubyにはクラスメソッドあるいはモジュール関数という概念がある。
これらのメソッドは(実際の実行は動的であっても、)構文上は静的に解釈できる。
ここで、M::N::O.func と M::N.func は同じモジュール関数名 func を使っているけど、
それぞれ名前空間が M::N::O と M::N とで異なっているから静的に区別できる。
>>492 いやプログラミングの文脈ではぜんぜん常識じゃないと思うんだが
あるモジュールMを書いているとする
別のモジュールA.B.Cの関数fと、A.D.Eの関数fを使いたくなったので、両方ともインポートする
すると、単にfと書くだけではどちらを意味しているか決まらないので、なんらかの修飾が必要になる
これは名前空間が階層化されていようがいまいが関係ない
という理解だけど
>>485,488
たしかに変なこと言っちゃったな
大規模開発云々で名前空間のrubyとhaskellでの差なんて大した問題じゃないってことが言いたかった
>>493 修飾の無い名前 f だけじゃ区別がつかないのは、常識以前の当たり前な話だろ
>>493の例の場合、RubyやSMLならばモジュール空間Aだけをインポートして
B.C.f と D.E.f と書くことができる。あるいは、X=A.B.CおよびY=A.D.Eという
局所的なモジュール空間を宣言してX.f および Y.f という短い別名での参照が可能。
HaskellではAだけをインポートするとか、
あるいは局所的なモジュール空間を宣言するとかできないの?
RubyやSMLなら「普通に」できるんだけど....
>>495 >修飾の無い名前 f だけじゃ区別がつかないのは、常識以前の当たり前な話だろ
Rubyのインスタンスメソッドについてはそれができるんだよ。ずっとその話をしていたと思ったんだが
>HaskellではAだけをインポートするとか、
>あるいは局所的なモジュール空間を宣言するとかできないの?
できません
>局所的なモジュール空間を宣言してX.f および Y.f という短い別名での参照が可能。
これについては同様のことができるな。局所的なモジュール空間を宣言するわけじゃなくて
単なる別名の導入だけど
import qualified A.B.C as X
import qualified A.D.E as Y
>>496 >Rubyのインスタンスメソッドについてはそれができるんだよ。
Rubyのインスタンスメソッドもレシーバで修飾しなければ区別できないよ。
たとえば
c = A::B::C.new; e = A::D::E.new
という文脈の下で、レシーバで修飾された
c.f および e.f
という式は正しく評価できるけど、単なる
f
ではRuby処理形は式を評価できない。(当たり前の話だよね?)
>>498 もちろん。でもHaskellにはその能力がない
Rubyでuri.schemeと書くときにメソッド名schemeが他と衝突するのを心配する必要はないけど、
Haskellで(scheme uri)と書くならそうはいかない
これを指して
>>486で「けっこう頻繁に衝突」と言った
>>487で否定されたのでSMLにもRubyみたいなレシーバ依存の名前lookupがあるのかと思ったけど、
そういう訳でもないってことで良いかな
なんか一人すごい天然がいるなw
お願い
感情に走らずに、もっと落ち着いて議論して
>>499 >そういう訳でもないってことで良いかな
SMLはオブジェクト指向では無いし静的型付け言語だから、
Rubyのようなレシーバ(インスタンス)依存の名前参照は存在しない
ただし、SMLでは uri.scheme と書く時に、uri以外の他のモジュールで
schemeというアクセサ名が使われているかどうかを心配する必要はない
つまりHaskellのような urlScheme という冗長な命名は不要
こういう事で理解してもらえるかな?
>>502 >つまりHaskellのような urlScheme という冗長な命名は不要
Haskellでもこれは原理的には不要なんだよ
衝突が発生したら修飾した名前に切り替えればいいだけ
uriSchemeのような命名がされるのは修飾を面倒だと思っているから
これに関してHaskellでできないことをSMLができる訳じゃないと理解した
もちろん名前空間が階層化されてるのは良いことだけど、この話題には関係ない
あと、Haskellだってオブジェクト指向じゃないし静的型付けだけど、
レシーバ(に相当するもの)の型に依存して名前解決を行えるようにしようという提案があって、
それが
>>483
SMLとHaskellは同じ
Rubyは普通のOOPをやってる
新しい話題は無いわけね
ようやく数セミにモナドの解説出たか。やっぱ京大スゲーわ。
ここで出ている話題だと
コンパイル時に実装が選択できれば十分で
OOPの動的束縛を持ち出すのは道具が大きすぎな気がした
僕ハスケルでOOPしたいです先生
>>508 どういうのをOOPと言ってるの?
何がどうできたらOOPと言っていいの?
どんな言語でもまともなプログラムを作ろうと思うったらOOPしない方が難しい
隠蔽かあ。あんまり良い定義とも思えないな
PythonとかOOPLでなくなってしまう
なんでこう日本語版のWikipediaは(略
> ダイナミックバインディング (動的束縛) --インタープリタの言語 この機能
これ dynamic dispatch のことだよね
インタープリタの言語じゃなくてもあると思うんだけど
宣言的とのことなので、ロールじゃ無くてルールだった。
そういえば、動的型付け言語も動的ディスパッチする部分を型推論したり、
宣言する方向で高速化してるな。
What is "Object-Oriented Programming?" [B. Stroustrup ECOOP '87] によれば
(subtype) polymorphismとADTの組み合わせだと言ってる
データ隠匿やデータ抽象だけならADTで可能だけど、これだけではOOPじゃない
それは二つに分岐した一方のオブジェクト指向ではないかい?
Haskellの型クラスとかインスタンスという用語は
OOPの用語と重なっているからまぎらわしい
もちろんHaskellの型クラスがOOPのクラスとは全く異なる概念であることは
調べればすぐに理解できることだけど、
いざHaskellのFPとOOPを対比させた説明を始めようとすると、
いちいち「Haskellのクラスは...」と「OOPのクラスは...」というように修飾が必要
#Ruby の人でHaskellを勉強したいと思っている人はけっこういる。
Haskellの人でRubyに興味がある人はあんまりいない。
両方使えるならHaskell使うだろ。
つまりそういうことだ。
ちなみにRubyはListをmapしたらArrayになる。こんなのをほったらかし
たままで新しい構文がどうのこうの言っている。Rubyはオワコン
>>506 は?京大なんて傲慢レポート何位だと思ってんだよ?
>>523 > ちなみにRubyはListをmapしたらArrayになる。
どゆこと?
言葉通りの意味だろ
いやだってRubyにListってクラスは(多分)無いし、
Listと同じように扱えてmapを呼べるArrayはmapしてもArrayを返す
rb> a1 = [1, 2, 3]
=> [1, 2, 3]
rb> a1.class
=> Array
rb> a2 = a1.map{|e| e * 2 }
=> [2, 4, 6]
rb> a2.class
=> Array
なのでもう少し説明が欲しい
トートロジー
イテレータであるEnumerableから実際のコンテナにアクセスするとかそういう意味ならばまだ分かったんだけどなぁ>rubyのmap
>>523 そもそもRubyは関数型言語ではないんだよね
関数風の(=関数型言語スタイルの)プログラミングも可能だというだけで....
厳しく言えば、Rubyでは関数(メソッド)はファーストクラスじゃないし、
末尾再帰も最適化されないからすぐにスタックオーバーフローする
自分達の優位な土俵で下位レベルの言語をつかまえて、
自身の優越感に浸るとは、なんともはや心の狭い発想じゃないのかと思われ
そんなにもHaskellという言語に対して自信が無いの?
もっと胸を張ってもいいと思うんだけどなあ....
その点トッポって凄いよな
末尾までちゃんとチョコが再帰してる
>>530 >>473のどこから優越感が云々という話になるのか分からんのだが
Rubyは言語仕様を読むとけっこう滅茶苦茶、細部をつつくと大変な事になる言語だが
一方で、言語仕様の「良さ」で支持されてきた言語でもある
悪い意味じゃなくてHaskellとは対照的な感覚があると思うけど
>>532 どこから473が出てきたのか分からんのだが
523は俺が読んでも酷いレスに思える
そろそろ純粋関数型とそうじゃないやつは分けて話そうぜ
Lisp対Haskell並に不毛な議論
最強を決めたいなら、とりあえずラムダ計算にしとけばいいよ
ラムダ計算vs型付きラムダ計算
Typed Pi-CalculusとTyped Join Calculusも虎視眈々と最強を狙ってる。
まーちんれふでも意味分からんのにホモとピーとか有向型理論とかどんどんでてきてついていけせんねん
君たちがなんかやっても、外人Haskell使いのほうが詳しいし
何でHaskellやるの?教えて???
釈迦の教えに通じるから
Haskellは現代数学をWikipediaで勉強するレベルの人間が
粋がって数学用語を多用するのがなんか鼻に付く。
にわかほど語りたがる -- あるハッカー
>>538 単純に楽しいから・・・かな
なぜか組み込み関数と同じもの自分で定義したり、+演算子と同じ機能定義しようとして数学の世界に片っぽ足を突っ込んで「おお!!これ、数学スレやLispスレで見たぞ!!大学数学を高卒なのに解いてる!!」とか、そんなことに興奮してるけど…
証明するより、プログラムのが楽しいというのもあるし、、、
>>543 証明するつもりなかったんだけどね…
単に+演算子と同じもの作りたかっただけだったのに、自然数から定義しなおす羽目になって、それがHaskellで動くもんだから、興奮しちゃうという…
Yampa を調べているのですが、意味が分からない部分があります
dpSwitch 関数が第1引数として適用する関数
forall sf . (a -> col sf -> col (b, sf))
これの sf はこの関数においてどのような役割を果たすのでしょうか
出番だ、>544
547 :
545:2011/11/14(月) 22:23:14.00
>>545 質問がやや曖昧でした
> これの sf はこの関数においてどのような役割を果たすのでしょうか
これの sf は dpSwitch 関数おいてどのような役割を果たすのでしょうか
>>542 楽しいとか病気かよ
数学やればいいじゃん
なんか モナドとか国論とかまじ意味不明
>>540 の言うとおり、花につくんですが
プリン吹いた
天才でも頭悪くもない
”普通”のやつがなんか 数学とか知的ぶったりしてて気持ち悪い
花につく
本当に気持ち悪いよ
エジソンとか気取ってるのかな?
知的遊戯好きアピール ”パズル、知恵の輪、囲碁、将棋、Haskell、数学”
インテリジェンス気取りたいだけ
せいぜい、こういうのはMatzとかそういう頭のいい連中レベルになって語って
まじ気持ち悪い
花につきます
以上
>>539-544 窓ガラスぶち壊してくれてありがとう
汚れたスレになったから書き込みやすくなったよ
またよろしく
>>550 >インテリジェンス気取りたいだけ
インテリゲンチャだろwwwwwwwwww
これでよろしい?
555 :
545:2011/11/14(月) 23:16:31.05
>>553 forall sf . (a -> col sf -> col (b, sf))
これが返す値 col (b, sf) の sf は何に使われるのでしょうか
b は分かります
dpSwitch 関数が管理するシグナル関数の入力に使われるのですよね
でも dpSwitch 関数の残りの引数には sf 型は無いです
論文「The Yampa Arcade」を読むと、
そこでは dpSwitch 関数の第1引数として自作の route 関数を敵用させていますが、
この route 関数を見てもやはり sf の意味が分からないです
556 :
553:2011/11/15(火) 00:06:14.72
>>555 ソースは見た?
今見てきたんだけど、内部での使われ方はそんな複雑じゃなかったよ。
sfはdpSwitchの第3引数として渡した関数に与える値を生成する為に使用されるSF a b型の値。
Yampaを知らんから適切な説明ができん。
>>546 いや、自分、基本バカだから
数学やりたかったんじゃなくて、+演算子を自分で作りたかっただけだから
558 :
545:2011/11/15(火) 07:37:16.66
>>556 私も一応ソースは見ましたが、私にはけっこう複雑でまだ計算を正しく追えていません
> sfはdpSwitchの第3引数として渡した関数に与える値を生成する為に使用されるSF a b型の値
ということは、SF a b型の値ではなくて SF b c 型の値ではないでしょうか
どちらにしても、それなら dpSwitch 関数が第1引数として適用する関数は
次のような型で良いはずです
a -> col (SF a b) -> col (b, (SF a b))
あるいは(もし私の認識の方が正しければ)、
a -> col (SF b c) -> col (b, (SF b c))
そうではなく、わざわざ forall を付けて汎用の sf 型としているからには、
シグナル関数以外のどのような型でも受け付けるという事ではないでしょうか
そう考えると、ではこの sf とはどのような意味を持つものなのか、疑問が沸きます
花・・・
それより国論にツッコみたい。圏すら読めない奴がぐだぐだ語るのは(ry
踏むなよウンコを
気に入らないから勉強やめろってのは豪快でいいなw
扁桃体が直接口を利いてるようなものだな
厳しい親元なら、たいてい娘に浪人するなら結婚しろという時代もあった。
その前は大学には行かさんか。
今時彼氏や旦那の助けにもなれない女はダメだろ。
haskellのために国富論なんて勉強してられないよ・・・
566 :
デフォルトの名無しさん:2011/11/17(木) 16:27:25.00
だからやめろよ?
や め ろ
中途半端なやつは嫌われる
天才でも馬鹿でもない=Haskell使ってるやつら
不良でもギャルでもヤクザでもない=パギャル、つっぱり、チンピラ ウザがられる
赤ちゃんでもない大人でもない=不細工な小学3年生 ポケモンでいうフシギソウ、カメール、リザード バッタでいう幼虫
Matzでもない小飼弾でもない=コガイよりつまらなくて、Matzより頭悪いHaskelやってるやつら
お前ら中途半端
中途半端は悪
なぜ悪か?悪いか答えてみてください 早く答えろ
ジャップ技術者=英語ができない、技術力も欧米以下、WEBサービスも微妙=中途半端
>>567 じゃあ、俺の代わりにhaskellやってくれ
天は自らHaskellものを助く
>>567 おら、返事は?
お前も中途半端なのか?
中途半端を見下すってことは、お前は中途半端じゃないんだろ?
>>570 >>567はツンデレだろ?
>>天才でも馬鹿でもない=Haskell使ってるやつら
「天才でも馬鹿でもない」のが世間の大半なんだから、567はHaskellerが実はメジャーだと言いたいんだよ。
シャイな奴だ。
定期的にこういうやつ沸くな
定期券破棄しろ
初歩過ぎる質問なんだけど、引数の整数から1を減らした整数を返す関数
f x = x - 1
これをポイントフリーの無名関数で表現するのってどうやるんだっけ?
((-)1) これだと 1 - x になっちゃう
Enum クラスの関数 pred を使うしかない?
別にいいんだけど、マイナス演算子を使ってできなかったかなと思って
(flip (-)) 1
subtract = flip (-)
がPreludeに定義されてる
f = subtract 1
577 :
デフォルトの名無しさん:2011/11/18(金) 10:27:44.65
>>574 ねえ?なんでHaskellやるの?!!!?!?!?!
int a(x)
{
return x-1;
}
ねえ?!!?!!?!?!?これでできるじゃん
あほかよ
何でHaskell使ってそんなくだらない低レベルなことやってるの?
早く死ね中途半端
天才Haskell研究者でもないゴミ お前はただのヘラクレス本あがめてるニワカ
社内でHaskell Haskell!とかほざいて共感意識あげてる 底辺の馴れ合い
国論やってろよゴミ
お前がやってることはただの低レベルな意味がないこと
ただHaskellを触って 「本物のプログラマはHaskellを使う」という記事に自分を当てはめて優越感
にひたってるごみ?!?!?!?!?!
>>577 あなたの発言は傾聴に値する.是非これからは鳥あるいはコテハンをつけて発言して欲しい.
http://www.f13g.com/や http://www.sampou.org/haskell/ipsj/のデモを動かしたくて Haskell Platform 2011.2.0.1-x86_64.pkg
をインストール、.zshrcにexport PATH="~/Library/Haskell/bin:$PATH"追記
しかし、importを使ったプログラムが動きません。
$ ghci -v
Using binary package database: /Library/Frameworks/GHC.framework/Versions/7.0.3-x86_64/usr/lib/ghc-7.0.3/package.conf.d/package.cache
wired-in package ghc-prim mapped to ghc-prim-0.2.0.0-d9df11f804556f362beb0ea4e67261ba
wired-in package integer-gmp mapped to integer-gmp-0.2.0.3-298c59ba68b7aaa7e76ae5b1fe5e876e
wired-in package base mapped to base-4.3.1.0-f5c465200a37a65ca26c5c6c600f6c76
wired-in package rts mapped to builtin_rts
wired-in package template-haskell mapped to template-haskell-2.5.0.0-b46cde34bfee890dc536d5be377e906f
wired-in package dph-seq not found.
wired-in package dph-par not found.
Hsc static flags: -static
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
Loading package ffi-1.0 ... linking ... done.
Prelude> :show packages
active package flags: none
$ghc-pkg check
$ghc-pkg recache
環境は10.6 Xcode 3.26 です。どなたかご教授お願いします。
肝心のエラーは?…
>>581 四角形をぐるぐるまわすを
$cat > main.hs
-- コピペ
$ghc -package GLUT main.hs
main.hs:11:9:
The last statement in a 'do' construct must be an expression:
rot <- newIORef 0.0 initialDisplayMode
$=
[RGBAMode, DoubleBuffered] initialWindowSize
$=
Size 640 480 createWindow "guruGuru" displayCallback
$=
display rot reshapeCallback
$=
Just reshape addTimerCallback timerInterval
$ timerProc (display rot) mainLoop display rot
ほかのものは
Failed, modules loaded:ほにゃらら
となってしまいます
>>575,576
アドバイスありがと
なんかか昔、関数の中置化とかいろいろこねくり回してたら
いつのまにか減算関数が (-) を使って綺麗に作れたような気がしてたけど、
気のせいだったかも知れん
Prelude に定義されているということで、subtract を使うことにする
>>577 Yampa でゲーム作ってて、敵の体力を1減らす処理が必要だったんだ
べつに
>>577 のような方法でも全く問題ないんだけど、
なんかもっとスマートに書ける方法があったような記憶があって、
でもどうしても思い出せないから質問してみた
こういう事、時々ある
教えてもった後で、なんでこんな事思い出せなかったんだろ、
分からなかったんだろって思うんだけどね
>>582 GLUT必須みたいだけど、入ってる?
HaskellじゃなくてOS側に。
>>584 入れてません
GLUTによる「手抜き」OpenGL入門
をみてXcodeに入ってると思っていました
(引文)
シンボリックリンクを張っておく必要があります.〜
この最後のシンボリックリンクを作成しない場合は, 以下のソースプログラムにおいて GL/glut.h ではなく GLUT/glut.h を #include するようにしてください (Mac OS X ではそうするのがスジでしょう).
が原因でしょうか
もっと調べてみます!
>>585 すまない。実はMacはよくわからないが答えてるんだ。
.soがHaskell側で読み込まれてないのか?と思った。
そのシンボリックリンクは必須だと思うよ。
587 :
デフォルトの名無しさん:2011/11/18(金) 13:09:14.19
GLUTによる「手抜き」OpenGL入門
手抜きってつけた理由は、指摘されたり 批判されたとき
「手抜き」って書いてあるだろwww
っていうため
言い訳なんだよ
588 :
デフォルトの名無しさん:2011/11/18(金) 13:10:07.41
書いたやつはセコくさそう 他人の評価におびえてそう
セコイヤチョコレート
>>577 なんでって、haskellスレだからに決まってるだろ。
>>590 とりあえずググり、それからhackageとかで探してる。
標準ライブラリは何回も見てるうちに勘が働くようになる。
hoogleやhayooとかあった。
使う言葉が一般的すぎ。
Environment とか Args とかは色々な意味で使うから検索しにくい。
System に属しているからわかるっちゃわかるけど、
getArgs は getCommandLine とかの方が探しやすいんじゃないかと思った。
まぁ、それも慣れか。
argsは他のプログラミング言語でも起動時の引数として頻出だけど、
getContentsってのはどうかと思うの。
PHPにfile_get_contentsとかあるよ
597 :
増田:2011/11/19(土) 17:53:33.65
sutegoma2っていう最強ハッカーチーム知ってるか?
ハッカーの大会 CTF Defconで優勝したチーム
知らないなら帰っていい
malaなら勝てるかもしれない
君たちじゃ無理
君たちは本当に生産性のないことしてるね
なにが + を自作したいだよ
君たち本当に脳みそ使い方間違えてるね
Haskellとか言ってる連中よりセキュリティストのほうがマジすげーわ
じゃなあカーーーーーーーーース
お前らでてみろよw Haskellがいかにクズで役にたたねーかわかるからw
ボコボコだぜお前らなんて
真のインテリゲンチャの集いだから
初耳
うん、素晴らしいこと言ってるから是非コテつけて欲しい
>>597 あなたの発言は傾聴に値する.是非これからは鳥あるいはコテハンをつけて発言して欲しい.
xmonad-0.10 released!
>>597 Hack In The Box
HITBなw
604 :
デフォルトの名無しさん:2011/11/22(火) 12:56:10.35
みなさーん モナ道を極めましたか〜!
今お前ら何にくびったけなの?
お前のゲイ棒
start $ start haskell が必要
型推論と型検査は同じ技術なのか?
型検査って何?
具体的にどういう処理をするのが型検査なの?
612 :
デフォルトの名無しさん:2011/11/28(月) 20:35:18.62
>>610 有限時間内に終わることを期待しないならば同じものだと思う
MLでは型システムがプログラム全体に対して閉じているので、
同じというような話しを又聞きした
「なあ、女の子に『可愛い』って言い続けたら、本当に可愛くなるらしいぜ」
「……それって、女の子だけなのか?」
「え?」
「お前、可愛いな」
「何の話だ」
「とぼけるお前も可愛い」
「だから何の話だ」
「マジで可愛い……」
「やめろ……」
「嫌がる姿も可愛いなあ……」
「やめろ!」
ここPerl忍者スレじゃないから
ニンジャ死すべし
hmatrix を使ってます
行列とスカラーの積ってどうやるのでしょうか
>>618 * 演算子を使ってできましたけど、なんか変です
ghci 上で
(3><3) [1.0 ..] * 3.0
これだとエラーです
3.0 の所で No instance for (Num (Vector a0)) と
No instance for (Container Vector a0)
でも
let m = (3><3) [1.0 ..]
m * 3.0
これだと問題なく意図通りの計算がされます
なんで?
((3><3) [1.0 ..]) * 3.0
>>620 それでも同じエラーですね
というか、* 演算子よりも、関数 (3><3) を [1.0 ..] に適用する方が
優先順位が高いので、その括弧は計算順の指定としては意味が無いです
今気づきましたが、
Matrix Double や Matrix Float などの型を特定しないとダメでした
(3><3) [1.0 ..] * 3.0 :: Matrix Double
これ、出力されたエラーからは原因が分かりにくいですね
mapMatrix (3*) (3><3) [1.0..]
>>622 そちらの方は括弧が必要ですよ
mapMatrix (3*) ((3><3) [1.0..])
あるいは $ 演算子
mapMatrix (3*) $ (3><3) [1.0..]
いずれにしても、問題は解決しました
なんかmapMatrixの方じゃないと通らない
Matrix DoubleはNumでもFractionalでもねぇよって言われる
(ε><3) にしたほうが 謎
>>624 そうなんですか
バージョンの違いですかね
私のは GHC 7.2.1、hmatrix 0.12.0.1 です
この環境において、ghci 上で
>>621 ので通りました
(ちなみに、Numeric.LinearAlgebra モジュールをロードしておきました)
(忍^人^殺)<ドーモ、パール・ニンジャ=サン。ニンジャスレイヤーです
(^^) 9 4とか
(><) 3 3とかみてるとネットの暗号か何かに見える。
Data.Bits の顔文字はイマイチだよね
使い所もイマイチ
今までアプリ作ってて Data.Bits のお世話になったことがない
Data.Bitsのお世話になった事があったのはGUIでフラグ渡す時くらい。
grepしてみたら乱用してた
代数的データ型だと遅すぎるから手動でIntのビットフィールドに押し込めるとか
>>633 勉強以外で、専用ライブラリを使わずに自作する理由が特に見つからない
635 :
日系アメリカ人 ◆japYJPNx6A :2011/12/02(金) 00:05:27.78
くだらね
つまらないやつばっかり
セッツァーノ イタリアじん
>>637 許容できる速度に達していないライブラリしか存在せず、
かつ、絶対に遺伝的アルゴリズムが必要なら何らかの方法で自作するしかない
しかし、FFI によって C のライブラリも使える中で、
専用ライブラリが問題になるほど遅い状況が考えにくいのだが、
そんな状況があったの?
>>638 結果が出るのに何時間もかかるような大規模演算が必要な状況なら
ピンポイントでそういう部分がボトルネックになることが多いんだよ。
>>639 じゃあ、そういう部分だけ C 用の高速ライブラリを使えば良いのではないか?
探したことないから知らんが、商用とかではいくらでもあると思う
Data.Bits を使う理由がないな
>>641 ああ、Data.Bitsの話だったか。
Haskellは遅いから速さにシビアな部分はどうしてもCで書いて呼び出すことになるね。
簡単に切り出してCで再実装できるような部分なら
大抵Haskell内部でもチューニングしやすいと思う
「ボトルネックだけCで書いて最適化」って良く言われるけど成功したことがない
コードの大部分を最適化のためにC++で書き直したことならあるけど
前 Haskell で物理シミュやった時に、
初めは処理は遅いわ、メモリは食うわでとてもシミュできなかった
ボトルネックを探したら、行列演算の部分がヤバイ感じだったから、
その部分だけ hmatrix(つまり LPACK)に変えた
そしたら、笑っちゃうほど速くなって、メモリ使用量も適正になった
知識が増えた今なら、All Haskell の行列演算ももう少し速くできそうだが、
それでも、やはりそういう部分は素直に他言語用ライブラリを使った方が良い
特に、Haskell(関数型)らしい適切なラッパーが用意されているのなら、
迷わず使うべきだよ
既にCライブラリがあるならそうだな
647 :
日系アメリカ人 ◆japYJPNx6A :2011/12/02(金) 21:04:22.55
無駄なんだよ
FFI書けるようになると成長した気になれる
haskellで速いプログラムを書くって大変なんですね。。。。
とhaskell初心者 orz...
650 :
日系アメリカ人 ◆japYJPNx6A :2011/12/03(土) 09:23:15.48
お前が早いプログラム書いてもそれが意味がない
自分で動作チェックする程度のプログラムだから別にいい
意味がわからない
なぜHaskellをやるのか
早く死ねよ??・!?!お願い死んで
653 :
日系アメリカ人 ◆japuuq4c3Y :2011/12/03(土) 19:42:53.36
日本はクソ
Haskellやっても天才数学者とかがいるわけでもない
ゴミ
カスに等しい国=Japan
>>649 大丈夫!ハードウェアが進化していくからo(^-^)o
ヴィルトの法則ですね。
660 :
デフォルトの名無しさん:2011/12/08(木) 21:32:34.36
「Perlで有名な小飼弾に暴言を吐いたキチガイw OSSコミュニティから物凄いパッシングw」
http://blog.livedoor.jp/dankogai/archives/51733482.html 北畠徹也氏が代表の「テラ・インターナショナル」がPerlを勝手に商標登録
>>この北畠って人は、ツイッターとかでも自殺するって言って話題になったり
よく分からないNPOか何かに募金をしてくれってメールを数万人規模のMLに流したり
それらは実はチョットした技術的ミスだって釈明してたりする人らしいね
Tetsuya_K 北畠徹也
@dankogai の家に電話したら、「小飼弾は死にました」らしい。ざまみろ。ざまみろ。というか、死んだ方が社会にとって幸せ。以上。# どうでもいいが、jcode.plなんて簡単につくれるじゃろ。あんなので調子に乗るアホもどうかしてるぜ。
Tetsuya_K 北畠徹也
I compared my @klout with @dankogai, how does your @klout compare? klout.com/user/dankogai/… @Tetsuya_K に比べたら全く大したことねーな。大口叩く愚か者が。
コメントの一覧
「みんなおもしろいおもしろいいってるけど北畠さん完全にかわいそうな精神病の患者ですよね」
「コメント欄が病的で怖い。人格が分裂してる?」
「本当に何がしたかったんだろう・・・」
「無事取り消されたそうで。本当によかった。」
小飼弾相手だったら北畠を応援したくなる
HaskellスレでなぜにPerlの話題?
キモいからよそでやって
純粋にHaskellの話してよ
人格分裂してるな・・・怖い怖い
665 :
デフォルトの名無しさん:2011/12/09(金) 17:02:50.08
質問です。
[1, 2, 3, 4, 5, ...] のようなリストを受け取って、
先頭から各要素までの総和のリスト [1, 3, 6, 10, 15, ...] を返す関数の上手い書き方ありますか?
頼むからこのスレでそんな質問しないでおくれよ
667 :
665:2011/12/09(金) 17:11:31.39
すみません、scanl で行けました。
>>666 どこで質問したらよかったのでしょうか?
>>667 いいえ、ここで良いです
そのような下等な質問に文句があるというのなら
Haskell初心者質問スレを立てていない彼らにこそ非があります
堂々とここで質問なさい
ここまでワンセット
質問です。
[3,1,4, ...] のような任意の整数のリストを受け取って、
各要素の階乗のリストを、同じ階乗の計算を繰り返さずに計算する方法はありますか?
つまり、3!を計算した後で4!を計算する場合では
前回計算した3!の答えを使って4*3!=4*6=24
と計算するコード。
Haskellはscanlとか便利な関数多くて助かるけど、一所懸命実装してたら実は既にライブラリにあった事も時々ある。
欲しい機能から検察出来れば良いんだけど、皆さんはどうやってますか?
主な関数は覚えちゃってるのかな?
factorials :: [Integer]
factorials = scanl (*) 1 [1..]
f :: [Int] -> [Integer]
f = map (factorials!!)
(!!)でO(n)掛かるのが嫌ならリストじゃなくて木で持っておく必要がある
>>671 Hoogleなら型から検索できる
しかしPreludeとData.Listくらいは使ってれば大部分覚えることになると思うけど
674 :
665:2011/12/09(金) 19:30:51.46
>>670 階乗特有の性質を利用するのではなく、一般的に解決する方法のひとつとして
メモ化 memoization という方法もある
関数の一度計算した戻り値とその引数とを紐付けして記憶させておき、
次回同じ引数に同じ関数を適用した時、再計算する代わりに、
記憶しておいた戻り値を即座に返すメカニズム
正格的な方法、非正格的な方法、いろいろある
もし興味があるなら調べてみると良い
調べてみるといい! ( ー`дー´)キリッ
>>673 レスありがとうございます。
Hoogle便利ですね。
自分で実装した機能が、ライブラリ関数数個の組み合わせで出来る事もあるので、
やっぱり主な関数は覚えちゃった方が良さそうですね。
Cabal でパッケージをインストールする際に、
「ソースへのリンクも付いたドキュメント」を生成して登録するには
どうすればいいのでしょうか
Cabal のコンフィグファイルに documentation:True を指定しただけでは、
ドキュメントはインストールされますが、ソースへのリンクは付きませんでした
haskell始めかけては、他が忙しくなってストップ。忘れた頃に再開、またストップ。
を繰り返してるわいはどれを見ればいいかな。HuttonのプログラミングHaskell本もあるからこれの方がいいかな
>>680 それだけの情報では貴方が今Haskellで何ができるレベルなのか分からない
モナド以外は大半を読んで知ったよ。
でももう忘れかけてるから、また見て思い出して、あーこれこれ、はいはい、これね、って感じ。
表面的なことは理解したけど、浅いと思う。
じゃあ「プログラミングHaskell」は要らないと思う
モナドも、学ばなければ先に進めない、理解しなければ問題が解決しない、
という時になるまで覚えようとする必要はない
使わなきゃどうせ忘れる
使ってるライブラリがやや古いが「Real World Haskell」見てアプリを作りながら、
内容がやや難しいが「Algorithms A Functional Programming Approach」や
「Pearls of Functional Algorithm Design」見て
関数型らしいアルゴリズムを体験するのが良いと思う
とにかく、表面的なことを理解したのなら、
後はもういっぱいいっぱいアプリを作れ(小粒でも大粒でも、トイでも本格的なものでも)
IOが必要になったら、それからIOを学べばいいし、
GUIが必要になったら、それからGUIを学べば良い
モナドについては、Haskellプログラミング的には
「ある演算ができる箱」でしかないことは自然に分かる
685 :
680:2011/12/10(土) 18:04:11.70
今Haskellのホットな話題ってなんなの?
イテレーティ?
JVMへの移植
だったらいいなあ。
仕方ないのでscalaをつかってるけど。
Cabal について質問です
cabal install の --package-db オプションで指定するパスの先には、
どのようなファイルが存在していればpackaheDBとして認識されるのでしょうか
690 :
日系アメリカ人 ◆japYJPNx6A :2011/12/11(日) 22:21:02.87
タイムイーターの巣窟・・・
Haskellでメモ化って相性が悪そうに思うけど、どうやってるの?
メモ化とメモカではだいぶん意味が違うなぁ
メモを持って回る必要があるだけだよね。
無限リストとか無限木とかでグローバルにメモを置けば持って回る必要がない
>>693の一番上のリンクとか
スコープの話じゃないからグローバルってのはおかしいか
トップレベルにメモを置けば、ね
HaskellらしくStateMonad使って持ちまわればいいんじゃね
>>697 そうやってモナドの階層がどんどん深くならない?
男ならIORefで
StateMonad って全然 Haskell らしくない
関数的と手続き的の真ん中で、どっちつかずの中途半端な感じがする
Data.StateVar の方がまだ潔いし、見た目綺麗だし、使いやすい
手続き的だけど OpenGL のラッパなど広く使われてて、
もうほとんどデファクトスタンダードでしょ・・・ そこまでは普及してないか
プログラムにおけるグローバル変数的なものはトップレベルにおくのと、
IORefやらReader/Writerやらで持ちまわるの
どっちが美しいのだろうか。
メモリを圧迫してきたら消したいとかいう要求がない限り
純粋なメモ表はトップレベルに置いとけば素直だし簡単
トップレベルのメモを書き換えられるのが不思議だ。
無限リストを使うとしても、どんな順序で関数を評価してもいいとか、どんな魔法なんだ。
諸君、議論したまえ
ゲーム会社は凄いと思う
Haskell使いと違って
何がHaskellだよ
小さい黒い画面に計算結果表示させて俺ハッカーってドヤ顔してるレベル
ゲームとHaskellプログラムじゃ驚きも違う
見てビジュアル的
Haskellは何がすごいの? 意味がわからない 素人には見てて苦痛にしか思えない
どう凄いか素人たちにも教えてくれ!!
アホじゃん
ゲーム会社のやつは凄いと思う
あんな人間離れした
3Dグラフィック+C++プログラミング+サウンド
すべてを束ねるコンピューター技術者最強
最強だよ
そうおもわないかい?
706 :
デフォルトの名無しさん:2011/12/18(日) 00:09:00.06
ゲーム会社はぱねぇと思う
Haskell使いと違って
何がHaskellだよ
小さい黒い画面に計算結果表示させて俺ハッカーってドヤ顔してるレベル
ゲームとHaskellプログラムじゃ驚きも違う
見てビジュアル的
Haskellは何がぱねぇの? 意味がわからない 素人には見てて苦痛にしか思えない
どう凄いか素人たちにも教えてくれ!!
ぱねすぎる
何であんなにぱねぇんだろう
ぱねぇ
ぱねぇよ!?!?!?!!!!!!!!!!!!!!!!!!!!!!!!!
ぱねぇい!!!!!!!!!!!!!!!!!!!!!!!!!!!!
ゲーム会社のやつはぱねぇと思う
あんな人間離れした
3Dグラフィック+C++プログラミング+サウンド
すべてを束ねるコンピューター技術者最強
最強だよ
そうおもわないかい?
>>705 「ゲーム」の作成技術がいくら高かろうと、最終目的が「ゲーム」にしか過ぎない点で、以下略
708 :
デフォルトの名無しさん:2011/12/18(日) 00:11:16.73
お前の目的何?
Haskelha??マジ意味不明
709 :
デフォルトの名無しさん:2011/12/18(日) 00:13:35.52
Haskellは何がしたいのか言ってみろ
「わからないことをわからないままにしたくないが、勉強も調べ物も一切したくない」
「自分の漠然とした感情は正しく、その合理的な理由は必ずどこかにあるはずだ」
「情報や知識は口を開けて待っていれば勝手に入ってくる」
この3つが揃うと、出所不明のデマは信じるわりに他人の話を聞かなくなる感じ。
煽るにもテクノロジーのバックグラウンドが要るが、最近はν速から逃げ込んで来てるからなあ。
Windows + ghci での日本語表示について質問です
コンソールの文字コードを cp65001 (UTF-8) に変えて、
フォントも UTF-8 が表示できる [MS ゴシック] を使ってます
Haskell 関係無しに、コンソール上で type "ファイル名" とコマンドを打てば、
UTF-8 エンコードされた日本語テキストファイルは問題なく表示されます
この状態で ghci を立ち上げて、
s = "テスト" と記述された hs ファイルをロードし、
putStrLn s とすると、「テ・・ス・・ト・・」と表示されます
どうして余計な文字まで表示されるのでしょうか
ちなみに、実際のところ余計な文字は全角中点「・」ではなく「�」です
MSゴシックだとたまたま全角中点に見えるだけで、何か別の文字みたいです
[環境]
Windows 7
GHC 7.2.2
713 :
712:2011/12/18(日) 01:55:56.12
>>712 > MSゴシックだとたまたま全角中点に見えるだけで、
すいません
コンソールの表示をよく見たら、全角ではなく「半角中点」に見えます
つまり 「テ・・ス・・ト・・」 と表示されているように見えます
で、実際問題、Haskellって何の役に立つの?
GUIも含めたアプリを作るのに、C++やJavaよりも生産性が高いの?
それとも計算結果をコマンドプロンプトに表示するだけでドヤ顔?
なんでコテ外すの?
少なくともGUIでは終わってる
HaskellでまともにGUIのガワが作れるようになるのはC++11がまともに使えるようになるよか遅いだろうね
「わからないことをわからないままにしたくないが、勉強も調べ物も一切したくない」
「自分の漠然とした感情は正しく、その合理的な理由は必ずどこかにあるはずだ」
「情報や知識は口を開けて待っていれば勝手に入ってくる」
この3つが揃うと、出所不明のデマは信じるわりに他人の話を聞かなくなる感じ。
「わからないことをわからないままにしたくないが、勉強も調べ物も一切したくない」
「自分の漠然とした感情は正しく、その合理的な理由は必ずどこかにあるはずだ」
「情報や知識は口を開けて待っていれば勝手に入ってくる」
この3つが揃うと、出所不明のデマは信じるわりに他人の話を聞かなくなる感じ。
それとも計算結果をコマンドプロンプトに表示するだけでドヤ顔?
それとも計算結果をコマンドプロンプトに表示するだけでドヤ顔?
それとも計算結果をコマンドプロンプトに表示するだけでドヤ顔?
それとも計算結果をコマンドプロンプトに表示するだけでドヤ顔?
それとも計算結果をコマンドプロンプトに表示するだけでドヤ顔?
Haskellで概念を学びScalaで応用する。GUIも簡単だぞ
あとはIDEサポートがJava並になれば最強(typesafeが開発中らしい
>>706 ゲームプログラミング界の巨人、Tim Sweeneyが「未来のゲーム開発テクノロジー」を語る
超並列処理、次世代のゲームグラフィックスはソフトウェアレンダリングに回帰する
http://game.watch.impress.co.jp/docs/20080911/epic.htm 抜粋
Sweeney氏は純粋関数型言語のもつ並列処理安全性に着目しており、将来的にゲームプログラミングはそういった処理系に移行していくべきだとした。
Sweeney氏はそのひな形として言語“Haskel”を挙げているが、ゲーム開発のメインストリームたり得る言語はまだ登場しておらず、将来に期待しているという。
やーよ!やーよ!
>>720 > ゲーム開発のメインストリームたり得る言語はまだ登場しておらず
> ゲーム開発のメインストリームたり得る言語はまだ登場しておらず
> ゲーム開発のメインストリームたり得る言語はまだ登場しておらず
> ゲーム開発のメインストリームたり得る言語はまだ登場しておらず
> ゲーム開発のメインストリームたり得る言語はまだ登場しておらず
> ゲーム開発のメインストリームたり得る言語はまだ登場しておらず
> ゲーム開発のメインストリームたり得る言語はまだ登場しておらず
まだまだドヤ顔するには早すぎるってことだなw
>>718 顔真っ赤にするのはいいけどさ、GUI全盛のこの時代に、
Haskellプログラムのほとんどが文字列入出力だという
現実を直視しろ。
GUIのコーディングなんて年収300〜400万円の仕事だろ
底辺すぎる
VB厨はVB使ってれば?
実際あのポトペタ環境の出来の良さだけは他に比肩するものがない
ここで話すことじゃない
議論に戻りたまえ
VBにも劣るわけかw
>>727 関数型じゃなくても、大抵の言語はGUIに関してはVBやC#、Delphi・C++(Bilder)に劣る
MS(または円馬鹿出ろ)に気に入られるかどうかの問題
>>724 VBにも劣るハスケルドカタは年収100万円を切っちゃうの?
かわいそう…
730 :
712:2011/12/18(日) 19:04:38.59
年収100万切ったら、Haskell なんかやってる場合じゃないと思うんだ
731 :
712:2011/12/18(日) 19:08:03.37
それはそうと、私の質問
>>712 はだれか分かりませんか
一応あれから色々やってみて、wtiteFile など使えば、
UTF-8 でファイルに保存できることは確認しましたが、
それで済ますならコンソールをわざわざ UTF-8 に切り換えなくても良いわけで、
なんとかコンソールに普通に表示させたいです
年収の話は板違いなのでやめましょうか。
>>729 >>720の記事に載ってるとおり、今Haskell覚えるのは趣味や投資目的の意味合いが大きいしね
RubyやC#、Javaとかも、今でこそ仕事有るけど、出た当初は個人の趣味でしか無かった
記事抜粋
それにプラスして、Sweeney氏は現在のゲームプラットフォームハードウェアが複雑すぎることも指摘した。
もし、Sweeney氏のいう純粋関数型言語によるゲーム開発が実現したとして、それを基準とするならば、C++によるプログラム開発コストは、マルチスレッド版で2倍、
プレイステーション 3版において5倍、シェーダー言語で記述するGPGPU版において10倍かそれ以上にもなるという。2倍以上のコストはゲーム会社のビジネスにとって合理的とは言えない。
従って、6コア、8コアどころでは済まないメニーコア世代のプラットフォームに備えて、ゲーム会社は開発基盤を備える必要がある。このような議論を踏まえた上で
、Sweeney氏は最後にこう述べた。「『Unreal Engine 3.0』の開発には3年の期間を要しました。そして、次世代のエンジンを開発するには5年くらいはかかるでしょう。
つまり、今年開発をはじめたなら、出荷可能になるのは2013年です。だから、今はじめるべきなのです。我々は既に、次世代への投資をはじめています」。
お前はスレ荒らしたりHaskell勉強は先行投資と言ってみたり
本当にいそがしいな
>>734 >>706見て、たまたま記事を思い出しただけだよ
もともと、自分がHaskellに興味持ったのもマルチスレッドプログラミングに向いてるってのが取っ掛かりだったしね
>>731 もっと詳細を書いてくれないと、同じ環境で同じ問題にぶち当たった人しかアドバイスできないよ。
>>705-706って有名なスクリプトだよね?単語入れると自動でテンプレが出来上がるやつ。
こういうスクリプトもHaskellで書けるのだろうか。
javascript版をHaskellで書き直したというなら最高の釣りだなw
738 :
712:2011/12/18(日) 21:56:10.45
>>736 すいません
まず最終的にやりたいことは、PostgreSQL に作ったテーブル内のデータが UTF-8 の日本語で、
その文字列データを取得してコマンドプロンプトに表示するプログラムをHaskellで作る
ということ
Haskell コード内でその文字列データ([Char] 型)を変数に束縛するとことは問題なくできた
というのも、その変数に System.IO.writeFile 関数を適用して得られたファイルを見ると、
正しく UTF-8 エンコードの日本語になっていたから
(当然だけど、writeFile の前に hSetEncoding 関数を utf8 に適用している)
コマンドプロンプトの方は、cmd.exe へのショートカットファイルのプロパティで
[オプション タブ]-[現在のコードページ] を "932" に、
[フォント タブ]-[フォント] を "MS ゴシック" に、
[ショートカット タブ]-[リンク先] を "%windir%\system32\cmd.exe "/K chcp 65001" に設定
このプロパティでコマンドプロンプトを起動し、その上で ghci を立ち上げ、
自作の *.hs ファイルをロードして、関数を評価しているが、
先ほどの [Char] 型の変数を ghci 上で評価すると utf-8 文字がエスケープされる
( ascii 文字以外は \ マークと数字数桁で表示される)
同じ [Char] 型の変数に putStrLn 関数を適用すると、
>>712(正確には
>>713)のように日本語部分だけ各日本語文字1字に対して
余計な文字が2つずつ後に付随してくる(まぁエスケープに比べて読めなくはない)
どうすれば、コマンドプロンプト(コンソール)に UTF-8 日本語を正しく表示できるのだろうか
上記の現象はデータベース処理とは関係なく、UTF-8 エンコードされた
Haskell プログラムが書かれたファイル内に直接 s="テスト" と書いて、
それを ghci 上で同じように評価したりしても再現できるため、
>>712 では現象再現のための最低限の情報だけで質問しました
739 :
712:2011/12/18(日) 21:58:27.43
>>738 訂正
> [ショートカット タブ]-[リンク先] を "%windir%\system32\cmd.exe "/K chcp 65001" に設定
[ショートカット タブ]-[リンク先] を "%windir%\system32\cmd.exe /K chcp 65001" に設定
これってコマンドプロンプト側の問題じゃなかったっけ・・・
他の言語でも似たようなことになった記憶が
申し訳ないがhaskellでの解決法は知らない
>>737 自動でテンプレとかはHaskellだけじゃなく、関数型全体として得意分野だから、
>>720の記事の企業が作ってても全く不思議じゃないな
Haskell使ってるゴミが小学生やガキ相手に
コマンドプロンプト開いて計算結果みせてみろよw
ガキ「なにこれ 意味不明」
大人「なんですかこれ DOS窓っていうやつですか? ハッカーですか?」
ゲーム開発者のほうが驚きや感動がすごいね
まじ君たち意味ないじゃん
なんかすげーでかいシステムとか 最適化 ノーベル賞とかもらってるわけじゃない
クソ研究しちゃって
頭大丈夫かよ病気かよ
Haskellを作ったやつはすごいけど
それ使ってインテリゲンチャ気取ってる天才でもないお前らはマジゴミのきわみ
お前らがHaskell使っても アルバイト以下の賃金量だろWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
ヘラクレス本片手に持って くそみてーな計算式
足し算とかモナドとかほざいちゃって
Macbook片手に持って 作ってもくだらねえ 計算式やHaskell GUI
そんなのVBでできますよ レベルの
まじごみなんじゃないんですかね ぱねえっす ぱねえ まじぱねえ
頭おかしい印ですか??
ぱねぇまじぱねぇ
744 :
デフォルトの名無しさん:2011/12/19(月) 15:05:56.65
はい
>>743 プログラミングの話をしないなら板違いなのでマ板行ってください
金正日死んだのがそんなにショックなのか
正日がGHCコミッタだったという可能性がヒッグス粒子レベルで存在している?
諸君、そろそろ議論に戻りたまえ
742が言ってることは事実だからな
742乙
>>742が小学生やガキまたはそれに準ずるものという事が読み取れるわけですね
理解できない人間を病人と呼ぶ病気にかかってるから仕方がない
haskellでWEBアプリって簡単にでける?
作ってる奴いるか?
754 :
712:2011/12/19(月) 18:48:59.59
>>753 snap とかのフレームワークを使え
簡単かどうかは気分次第
755 :
712:2011/12/19(月) 18:51:02.49
>>740 そうですか
私も心が挫けそうで、もう諦め気味です
Windows 標準搭載のコマンドプロンプト以外のコンソールでもダメだったら諦めます
精神科医の春日武彦先生から統合失調症の前駆症状は「こだわり・プライド・被害者意識」と教えていただいたことがある。
「オレ的に、これだけはっていうコダワリがあるわけよ」というようなことを口走り、
「なめんじゃねーぞ、コノヤロ」とすぐに青筋を立て、「こんな日本に誰がした」というような他責的な文型でしか
ものごとを論じられない人は、ご本人はそれを「個性」だと思っているのであろうが、実は「よくある病気」なのである。
統合失調症の特徴はその「定型性」にある。
>>742 あなたの発言は傾聴に値する.是非これからは鳥あるいはコテハンをつけて発言して欲しい.
758 :
yuitest:2011/12/19(月) 20:00:59.47
相手が会話の主体なのか、会話の内容が主体なのかという議論をするときの主体は何か
742は主体
やっとこさ新版 Hasklell Platform2011.4.0.0 がリリースされてたよー
ghc 7.0.4 で 7.2 ぢゃないんですね。
760 :
712:2011/12/20(火) 12:36:53.70
7.2 はライブラリの方がまだ追いついていない場合が多い
base のバージョンとかコンパイル仕様の変更とか
761 :
712:2011/12/20(火) 12:40:57.01
>>755 msys とかでもダメっぽいんで、もう諦めました
統合失調症に定型性なんてねーよ。
陽性症状、陰性症状、人によって症状は様々。
精神医学の専門書の一つでも読んでからそういうこと言えよ。
大雑把にいえば、心の中の自分と他人の境界に穴が開く病気だ。
だから、自分が思っていることが人の声として幻聴で聞こえたりする。
5年から10年ぐらい前ぐらいに思考盗聴こえええ皆も気をつけろとか叫んでた人を結構みたけど
あれがそうだったのか・・・
764 :
デフォルトの名無しさん:2011/12/20(火) 13:50:48.26
Database.HDBC.MySQLのfromSqlでstringに変換するとasciiデータはputStrLnで表示出来るのですがunicodeは文字コードが表示されます。
まだunicodeに対応できていないのでしょうか?
765 :
デフォルトの名無しさん:2011/12/20(火) 15:03:12.99
unicodeも表示出来ました。
742がやってることはホームレスを無差別にいじめてる事と同じでしょ。
767 :
デフォルトの名無しさん:2011/12/20(火) 21:54:07.97
listAは重複がないリストとする。
listBは空でなく、順序は不明だがlistAの要素の連続になっている。
listAの要素であるxを渡された時、それがlistBと比較して前方にあるか
後方にあるか、それともlistBに含まれるかを判定したい。
例で書くと
listA = ["A","B","C","D","E",...]
listB = ["C","D","B"]
xが"E"なら、listBに含まれるB,C,Dに対して「後方」ということになる。
このとき、haskellらしい考え方だとどういうアプローチになる?
俺の手続き脳だと
1. xがlistBにあるかどうかを判別
2. xとlistBそれぞれの要素のlistA内での位置を調べる
3. 調べた位置を比較して「前方」「後方」を判定する
と考えたんだけど、ザ・手続きっぽくてダサいよなぁ、と思って。
こんな感じ?
filter (flip all listB . (/=)) listA
ごめん問題読んでなかった。取り除くんじゃないのな。
>>767 めっさ力技
data Pos = F | M | E deriving Show
getPos :: Eq a => [a] -> [a] -> a -> (Maybe Pos)
getPos listA listB = fmap f . (`lookup`listE) where
listC = map (`elem` listB) listA
listE = zip listA $ zip listC $ scanl1 (||) listC
f (True,_) = M
f (False,False) = F
f (False,True) = E
listA = [0,1,2,3,4]
listB = [2,3,1]
x=0
main = do
let g = getPos listA listB
print $ g 0
print $ g 1
print $ g 2
print $ g 3
print $ g 4
>>767 1. listAをlistA1 ++ [x] ++ listA2にわける
2. listA1とlistBのintersectionを取って判定
f listA listB x =
if y == 0 then 1 else if y == length listB then -1 else 0
where y = length $ takeWhile (/= x) listA `intersect` listB
>>767 f listA listB x = (elem x as, elem x listB) where as = takeWhile (not.flip elem listB) listA
>>771 (y == 0)のあとに(elem x listB)でもう一回場合分けが必要でない?
>>767 の解法としていくつか提示された例は、
たとえば1ヶ月後とかに自分が読んでも、あるいは他人が読んでも、
どんな計算をして答えを求めているのか簡単に分かるもんなの?
listBの要素はソートすればlistAの連続部分列になるってこと?
>>776 listAは整列だという仮定はない。「listAでの出現位置」に基づいてソートするなら話は別だが。
>>767 data Where = Before | Here | After
whereIncluded :: (Eq a) => [a] -> [a] -> a -> Where
whereIncluded _ [] _ = After
whereIncluded (a:as) (b:bs) x
| x == b = Here
| x == a = if elem x bs then Here else Before
| otherwise = whereIncluded as bs x
[説明]
・listA と listB それぞれの head と x を比較する
・listB の head と x が同じなら、x は listB に含まれる
・そうではなく listA の head と x が同じ場合、
x が listB に含まれていなければ、x は後方にある
・どちらの head とも異なっていれば、両者の tail に対して同計算を繰り返す
・計算を繰り返した結果 listB の tail が空なら、x は後方にある
提示された条件を全て完全に満たすものとして式を書いたので、
エラー処理は省いてある
779 :
767:2011/12/21(水) 21:02:56.56
>>770,771,772,778
まさかこんなに素早く返事があるとは思ってなくて
反応遅れました。すみません。
具体的なコード例までわざわざありがとうございます。
見事に誰一人としてelemIndexなんて使ってないですね……。
順序を調べる、という発想自体を捨てないと駄目だということが
よくわかりました。
>>775 個人的には770さんの例以外は見て何をしているかは
すぐ把握できました。
>>776 777さんが返してくれていますが、listAは整列とは限らないです。
listAの位置に基づいてlistBをソートすれば、listBは確かに連続
部分列になります。
というわけで、どうも皆さんありがとうございました。
>>778 whereIncluded [1..6] [5] 4 = whereIncluded [2..6] [] 4 = After
>>780 あぁなるほど、そうか
ちょっと修正案を考えてみる
782 :
778:2011/12/22(木) 07:52:15.94
>>780 に指摘されて修正案を考えてる時に、
全然違うアイデアが思い浮かんだんだが、
これは今まで出てきたかな(特に
>>771 と同類か)
listA から x の位置を探す
x の位置の直後から
783 :
778:2011/12/22(木) 07:55:25.77
途中でレスってしまった
>>780 に指摘されて修正案を考えてる時に、
全然違うアイデアが思い浮かんだんだが、
これは今まで出てきたかな(特に
>>771 と同類か)
listA から x の位置を探す
x の位置の直後から listB の要素数分の要素をリストとして取り出す listC
x が listB に無い場合、head listB が listC に有れば「前」
head listB が listC に無ければ「後ろ」
784 :
778:2011/12/22(木) 08:55:12.79
>>783 訂正
> x の位置の直後から listB の要素数分の要素をリストとして取り出す listC
x の位置の直後から末端までをリストとして取り出す listC
785 :
778:2011/12/22(木) 12:54:37.61
>>783,784
式にするとこんな感じ
whereIncluded :: (Eq a) => [a] -> [a] -> a -> Where
whereIncluded as bs@(b:_) x
| elem x bs = Here
| elem b as' = After
| otherwise = Before
where as' = takeWhile (/=x) as
ダサいかな
Haskell Platform じゃなくて素の GHC の方には、
random パッケージってデフォルトでは入ってないんだね
地味に驚いた
QuickCheck を調べてて、ステキなリファクタリング テクニックに出会った
http://www.haskell.org/haskellwiki/Introduction_to_QuickCheck リファクタリング前は(インデントに全角スペースを入れた)、
getList = find 5 where
find 0 = return []
find n = do
ch <- getChar
if ch `elem` ['a'..'e'] then do
tl <- find (n-1)
return (ch : tl) else
find n
というコードなんだが、副作用がある処理と無い式とが混ざっててテストし難い
(また、全体の処理もぱっと見分かりにくい)
これがリファクタリングで次のようになる
getList :: IO [Char]
getList = fmap take5 getContents
take5 :: [Char] -> [Char]
take5 = take 5 . filter (`elem` ['a'..'e'])
ちょっと感動した
こういうことがサラっとできるようになりたいもんだ
遅延I/O怖い><
789 :
デフォルトの名無しさん:2011/12/22(木) 22:55:08.11
モナドって大した概念なの?
ものごとを抽象化するための仕組みとしては大したもんだよ
791 :
デフォルトの名無しさん:2011/12/23(金) 10:28:44.71
>>790 なんかいい例希望
モナドはものごと全部を抽象化するんじゃないよね?
STMとか?
793 :
デフォルトの名無しさん:2011/12/23(金) 12:02:29.11
>>790 >>791 そうだな。なんでも抽象化できるんならこれまた意味不明になるし。
だいたい、何なんだよ抽象化って。
モナドによる抽象化ってのは、だいたい(Monad m) =>で始まる型のある関数を書くこと
具体例はControl.Monadとか見れば
それで、何をどう抽象できて、何は抽象できないの?
モナドで抽象する前と後とで何が変わるの?
いつもの糖質が現われる頃合いだな
>>795 Control.Monadにあるようなものは抽象化できるし、
(Monad m) =>で書けなさそうなものは抽象化できない
言葉で言われて分かる類の問題じゃないから具体例を見たり書いたりして慣れるしかないよ
>モナドで抽象する前と後とで何が変わるの?
関数の型が変わって任意のモナドに対して使えるようになる。たとえば、
foreach :: [a] -> (a -> IO ()) -> IO () -- foreach xs f はxsの各要素に対してfを実行
をモナドに関して抽象化すれば、
forM_ :: (Monad m) => [a] -> (a -> m b) -> m ()
になって、IO以外でも使えるようになる
抽象化できないものの証明って難しいな。もうあるのだろうか。
コードが書いてあるあたりだけでもざっと見ればいいよ
801 :
デフォルトの名無しさん:2011/12/23(金) 18:26:57.57
>>797 それってオブジェクト指向でメソッドの引数の型を
IO型からObject型にするのと、どう違うの?
メソッドの引数に限定する意味が良くわからないが
bindとかreturnというメソッドを持ったIO型を一般化して、
Monadという抽象クラスから派生するようにしたら便利なのと一緒。
>>802 色んなものの「共通する性質」や「共通する関係」を抜き出し、
具体的な実態では無くその性質や関係のみで以て語るのが「抽象化」だから、
抽象化するという意味は同じ
どう抽象化するかという点で、IO型からObject型へとMonadへとで違いがでる
Haskell のモナドは (m を Monad クラスのインスタンスとして)
forall a b. m a -> (a -> m b) -> m b
forall a b. m a -> m b -> m b
a -> m a
String -> m a
という4つの「演算で抽象化」してる(うち2つだけで十分だが)
特にモナド同士の演算がまたモナドになるという性質と、
モナドの外からはモナドの具体的な実態は見えないという性質が特徴的だから、
そういう性質が活かせるところでもてはやされる
オブジェクト指向のObject型がどういう性質の抽象化なのかは忘れた
なんかHaskellPlatform DLできないんだけど鯖どうなってんこれ
806 :
デフォルトの名無しさん:2011/12/23(金) 19:27:53.45
>>802 その例だと、内部でやってることもだいたい同じ
実際の型に応じて実装が選ばれる
実装を選ぶタイミングがコンパイル時か実行時かは違う
型クラスは ad-hoc polymorphism を使いやすくしたものでオーバーロードの親戚
OOPのほうはsubtype polymorphismといって、部分かなり違う部分がある
例えばsubtype relationが推移律をみたすみたいな強い性質がある
subtypeがあるとどうなるかは、Scalaが壮大な社会実験中
Objectにしたらキャストがいるよね
interface Monadみたいの定義しないと
抽象化と言うか普遍化だな。
同じ事やねんで
811 :
デフォルトの名無しさん:2011/12/23(金) 21:51:38.33
モナドって、ひょっとしてHaskellにおけるデザインパターンのことかい?
812 :
デフォルトの名無しさん:2011/12/23(金) 21:52:28.95
>>811 モナドの方が抽象度高いけど似たようなもん(だと思ってる)
普遍化というのはある特定の性質から全体の性質が定まるようにすることで、
単なる抽象化とは違うだろ。
デザインパターンが何を指しているのかわからない。
【普遍化】個別的・特殊なものを捨て、共通なものをとり出すことによって概念や法則などを引き出すこと。
【抽象化】対象から注目すべき要素を重点的に抜き出して他は無視すること。
よかったな。
どっちでも良いと思うけど、性質を式にするような場合は一般化(普遍化)のほうがしっくるくるよね
819 :
デフォルトの名無しさん:2011/12/23(金) 22:31:42.28
>>815 あのGoFのデザインパターンがその代表だが。
>>813 そうか。そうならデザインパターンと同じくつまらんものだ。
長くは続かん。
>>816 >>818 もっと乾いた理解をしないといかんのじゃないか?
>>819 > そうか。そうならデザインパターンと同じくつまらんものだ。
> 長くは続かん。
2ch で質問して、たった1個のレスでそんなに早く結論を得た気になるなんて
ほんと馬鹿としか言いようがない
このまま行くと、お前は一生その考えなんだろうなぁ
そもそもデザインパターンがつまらんという感覚が良く分からない
うむ。つまるとかつまらんてものではないわな
823 :
デフォルトの名無しさん:2011/12/23(金) 23:04:36.28
つまらない物だということにして安心したいんだよ
そうすれば理解する努力しなくていいから
理解できない自分の頭を嘆く必要もなくなるし。
>>804 ,
>>807 ありがとう。
でも、その理屈でIO()をモナドに抽象できるのだとすると、
「IO()で提供されていた種々の関数は全て、
モナドで提供されている演算子に置き換え可能である」
という前提条件が存在すると思うのだけど、どうだろう?
この条件が成立しないと、結局forallはIO()型の値を必要とするよね。
IO()をMonad m=>mで置き換え可能であるためには、forallを使っている
コードも含めて、IO()型に関連する「全ての関数」のモナド版を
用意してあげなくちゃいけないと思うのだけど。
>>=, returnとそれと対応するIO版の関数の範囲に限ってその前提条件は成立する。
それが型クラスとそのインスタンス宣言の意味するところで、
この前提条件の表明がMonad m =>みたいな型シグニチャのコンテキスト。
>827の翻訳
一般にその前提条件は成立しない。
829 :
デフォルトの名無しさん:2011/12/24(土) 11:15:48.48
cabal updateしようとしたんだけど落ちてる?
なんかタイムアウトしてしまうんだが。
取り急ぎ対応したいんだけど、ミラーとか指定できる?
さっき俺の方でも実行してみたけど、問題なくいけた
なんか自分だけっぽいな。どうすればいいんだろう。
pingも帰ってこない。
832 :
デフォルトの名無しさん:2011/12/24(土) 13:21:02.06
最初に言ったのはラオウ
DNS引けてないようだったら、
DNSサーバーをgoogle提供の8.8.8.8にしてみるとかどうだい。
/etc/hostsとかでipアドレス指定してもいいけど。
ほかの要因だったら、proxyかますとか。
硬派なお前らなら勿論イヴもコーディングだったよな?な?
遺伝子をコーディングしてました
アレをコーティングして入れてました
>>835 IO Monadをかぶせて副作用なし。
839 :
デフォルトの名無しさん:2011/12/25(日) 18:31:48.82
いろいろ見てみたけどモナドってやっぱおれには難しいわ。
なんか純粋な関数型言語にふつうのプログラミング言語ならふつうにできることを
組み込みたいという空気かなと思うが、あまりそう強調されてもいないようだし、
まず目的がようわからんわ。
抽象化とか言うけど、それはモナドに限らん関数型の特徴だと思うし。
だれかこういうのちょっと教えてくれんかなスマンが。
「こういうの」って何だ?
具体的に訊いてくれ
まずモナドとIOモナドを区別してくれ
純粋さを保ったまま入出力をする仕組みがHaskellにはあって、IOという名前の型が使われる
モナドというのはある種の型を抽象的に扱う枠組み
(どういう型をどうやって扱うのかは一言では説明できない)
で、IOはたまたまモナドの枠組に適合する(ので、IOモナドと呼ばれる)
で、モナドが知りたいの?IOが知りたいの?
関数に副作用があるかどうかが型を見るだけで解るのは利点
チューしようか
844 :
デフォルトの名無しさん:2011/12/25(日) 19:03:59.38
すぐ反応してくれてうれしいな
>>840 モナドでやりたいことは何なの?ってことなんだが。
関数型にどうのこうのって書いたんだが、そういう「目的」っていうの?
そういうのが知りたいんだが。
いろんなモナドがあるようなんで、それがわかいにくいんだが。
>>841 IOモナドはモナドのひとつじゃないん?
その「純粋さを保ったまま入出力をする仕組み」がモナドなんやろ?
純粋さって関数型のってこと?もしそうなら、どの程度保てるものなの?
知りたいのはモナド。IOがその代表ならそれも知りたい。
>>842 それは型指定を工夫したらできるんじゃないん?
こんな質問じゃったんじゃが、みなスマンのう
>>841 > で、IOはたまたまモナドの枠組に適合する(ので、IOモナドと呼ばれる)
なるほど。
いつまでもIOモナドは難しいと言われ続ける理由がわかったよ。
本当にIOモナドは「たまたま」モナドの枠組みに適合してるの?
わざわざモナドとしての宣言をしているのを「たまたま」というの?
わざわざ色々なIOをモナド則にあわせて整理して宣言しているのを
「たまたま」とか言って誤魔化しているわけでしょ。
学ぶ人達の能力を信用していないから、そうやって誤魔化すわけだ。
そうやって学ぶ人達を信用せずに、ありのままを伝えず、
取って着けたようなすぐバレるデッチアゲばかり言うから、
学ぶ人達はどの言葉を信用すればいいかわからなくなって、
「Haskellは難しい」という結論になっているんじゃないの?
>>844 >IOモナドはモナドのひとつじゃないん?
そうだよ
>その「純粋さを保ったまま入出力をする仕組み」がモナドなんやろ?
IOモナドがその仕組み。それ以外のモナドは全然別のことをする(構文解析とか)
>純粋さって関数型のってこと?もしそうなら、どの程度保てるものなの?
副作用のある関数を一切使わずに入出力のあるプログラムが書ける
モナド則が
{
nop
foo
bar
baz
nop
}
みたいなのを正しく扱うのに都合がいいということはわかる
>>847 > 副作用のある関数を一切使わずに
ダウト。Haskell上の値としては副作用はないが、
裏でランタイムがちゃんと副作用を起こしている。
>>846 モナドは副作用を保証してくれないから、
モナドだけではI/Oは不可能。
副作用をうまく取り扱うための枠組みを、
モナドは提供できているというだけの関係。
厳密には何を以て副作用と言うかを(ここだけでも)統一されて議論すべきだが、
「Haskell上の値としては副作用はない」というのを副作用が無いと認識している
Haskell プログラマは多いし、暗黙の了解になっていたりもする
>>846 なんか誤解してるような気がする
1. IOは、純粋さを保ったまま入出力するための型である
2. IOはMonadのインスタンスである
この二つの事実が両方成り立つのは別に必然ではないという意味で「たまたま」と言った
モナドにならない型で入出力を表現することはできる(ストリームIOとか)し、
入出力と関係ないモナドももちろんある
つまりHaskellの入出力を理解するのにモナドを知っている必要はないし、(助けにはなるが)
モナドを理解するのにIOを知っている必要もない(助けにはなるが)
いや、それはおかしいだろ
OCamlで実装されたHaskellインタプリタだったらそのHaskellは純粋ではないことになるのか?
>>849 そこを気にするなら、「副作用のある関数」を
「呼ばれて評価されたときに副作用を起こす関数」と読み替えてくれ
856 :
デフォルトの名無しさん:2011/12/25(日) 19:21:55.56
>>845 ありがと。ちょっと見てみるけどおれにはわからんだろな
>>846 怒らんで
>>847 >それ以外のモナドは全然別のことをする
うん。そのときの共通性っていうの?それが知りたいんやが
>副作用のある関数を一切使わずに入出力のあるプログラムが書ける
ほんま?そんなことできるわけないやろ。なんかトリックなんやろ?
857 :
デフォルトの名無しさん:2011/12/25(日) 19:25:40.76
>849 から
>>855 わ。レスポンスしたら他の兄さんらの難しい議論が始まって付いていけへん。
しばらく勉強や。
>>856 >うん。そのときの共通性っていうの?それが知りたいんやが
モナドの具体例(2〜3個)を知らない人に説明するのは難しい。俺にはできない
>ほんま?そんなことできるわけないやろ。なんかトリックなんやろ?
うん。おおさっぱに言うと、入出力をする関数がない代わりに、入出力をする変なもの(アクション)がある
関数とアクションは型が違うから、関数を見たらそれが入出力をしないことは保証されてる
859 :
デフォルトの名無しさん:2011/12/25(日) 19:32:00.64
>>850 >副作用をうまく取り扱うための枠組みを、モナドは提供できている
どこで、なんで、それができてるんや?ちゅうのが知りたいんやな
自分は手下に命令しただけで、直接手を下していないことを
「俺は潔白だ」
というようなものだな。
MLのように自分が手を下した範囲をちゃんと自供するほうが
ずっと罪は軽い。
IO aをRealWorld -> (a,RealWorld)とみなした上で外延性から
∀ x :: IO a, ∃s.s' :: RealWorld. x s /= x s'について解釈することで参照透明性をもう少し厳密に言えないのかな
RealWorld型を導入しなくても参照透明にはなるよ
IO a型の値をプリミティブにしたって良いし
>>860 実際にコードを読んだり(自動でも手動でも)最適化する場合に
直接手を下しているかどうかが重要になるんだから仕方ない
Moggiが表示的意味論(もちろんI/O、状態、並列などが扱われている)で
使われている技法に共通構造を見出した。
それがどんな構造かってのは、数学分からない人には、絶対に演繹的に理解できないです。
数々のMonadを体得することで帰納的に理解してください。
帰納的な理解だから身体動かさないと無理です。
頑張ってMonad入門を読みこなして、さらにプログラムを書いてください。
茂木=サン
継続やストリームを使ったIOの表現よりも、
モナドを使ったIOの表現の方がシンプルで、処理を追いやすい
IOモナドが作られた理由はこれに尽きるだろ
867 :
デフォルトの名無しさん:2011/12/25(日) 20:21:39.10
>>858 >>864 ああ、また見捨てられてしもた。いっつもこうや。わしに学がないばっかりに。
ふつうのプログラムはやってるから、あのIOやエラーは知ってるし、
Maybeなんちゅうのがあるらしいのも知ってるけど、そんなんじゃ
話がわからんちゅうこっちゃろな。
Monad入門ってどこにあるんですか?
今日は冷えるわ。
868 :
デフォルトの名無しさん:2011/12/25(日) 20:27:46.78
>>861 問題意識がおもしろそう。
参照透明性が厳密に表現できると、モナドも厳密に表現できるのでは
という動機?
870 :
デフォルトの名無しさん:2011/12/25(日) 20:50:43.45
>>867 俺も学の無い人間だけど、モナドはOOPでいうインターフェースに当たる型クラスって機能を使って構築されてるって言えば何をしたいものか大体わかる?
Haskell で GUI のアプリ作った・作ってる人っている?
XMonadの拡張なら
オセロなら
>>872,873
Haskell でも MVC や Doc-View アーキテクチャが基本なの?
Model あるいは Doc の部分ってどうやって実装してる?
やっぱり IORef のようなミュータブルな IO モナドになっちゃうのかな
MVCっぽい感じだった
モデルにはMVar使ってた
インストール作業が非常に面倒だった記憶があるから、
インストールする前に訊きたいんだが、
以前 windows 上で wxHaskell を使ってた時は、
ghci では動かせず、動作を試すのにいちいちコンパイルしてたんだ
今(ghc 7.2.2、wx-0.12.1.6)でもそうなの?
>>867じゃないけど
>>876面白いな
モナドとモナド変換子を使ってプログラミング言語の意味を表現しておけば
そこからその言語のインタプリタを自動生成してくれるのか
879 :
デフォルトの名無しさん:2011/12/26(月) 10:20:49.85
>> 878
>モナドとモナド変換子を使ってプログラミング言語の意味を表現しておけば
>そこからその言語のインタプリタを自動生成してくれる
そりゃできるに決まってるよ、と思うのだが、そう思うのってあまりにdetailに
鈍感ってことかなあ?
ところで、このときモナドが本質的(モナドだからできる)ってことでもない
と思うのだが、どうですか?
880 :
デフォルトの名無しさん:2011/12/26(月) 10:31:03.06
>>879 構文と意味を分離するのだから、モナドが相当本質的ではないの?
ようやくlearn you a haskell ~ を2周読み終えるわ。この本やっぱり
面白かった。純粋な関数型のデータ構造を扱うための入門にも向いてるよ。
特に最後の2つの章がね。
ただの入門かと思ったけど、そうでもなかった感じがした。
もちろん、ちょっと話題になってるモナド変換子のことは現実世界Haskell
になってくる。でも、Learn you a Haskell~を2,3度読むと基礎は十分
じゃないかと思った。
ええ本ですわ。
他の本も同時に読んでるけど、Tree based tech-nick の言語でもあるし
なにもかも他とは異質という印象があった。LispやSmalltalk,Prologと
は違うまた異質な世界。
でも、オブジェクト指向でやったほうが良いようなシミュレーションの問題
などは向いてないなと思った。Haskellでもできないことはないというのは、
ライブラリを探して、サンプルを見てたら分かるんだけど、無理矢理感が
拭えないな。
簡単なところを学んだあとに改めてHaskellというのを考えたけど、学んで
有益だったのか明確な答えがでなかった。
ここのベテランさん達はHaskellを学んで、そして実用的?に利用して何が良
かったと感じてますか?
technique だったな。
もうひとつ感じたことh,HaskellのタプルはLispのconsみたいなもんなんだな。ってね。consとtupleは違う点ももちろん明確なんだけど。
>>882 ・便利な機能(というより、無いと苦痛な機能)が揃ってる
代数的データ型、型クラス、型推論、…
・構文が簡潔なので書いていて苦痛が少ない(括弧を閉じなくて良いのは大きい)
・静的な型
もっと地味に良いところはたくさん挙げれられる
GC、生ポインタ操作、パーサコンビネータ、ユーザレベルスレッド、並列処理、
do構文、where構文、純粋であること、末尾再帰の最適化、…
でも個人的な感覚としては、他の言語に比べて大きな欠点が少ないから使ってる
>>884 問1. HaskellのタプルとLispのconsの共通点は何?
問2. その共通点は本質的なものか?
>>878 2時間たらずでそこまで理解できたなら大したもんだ。
自動生成というか、各プログラミング言語の概念(環境、ストア、継続)をモジュール化することで、
レゴのブロックのように意味の組み合わせが可能になる言語の枠組みとして使えるという内容。
いろんな先入観を払拭するのに最適だし。
残念ながら入出力については実装があたえられていないので、言語SLは実践的にはまったく使い物にならない。
逆に言えば、入出力をちゃんと理解して組み込めるようにすれば、実用的にも結構すごいことだと思う。
表示的意味論の教科書でも大抵入出力は端折ってる。
>>885 そうですか。更に学べば面白いところありそうですね。:-)
>>886 自分が感じたのは、便利な小物扱いしてるところ。consを使ったもので
associate listというものがあるんだけど、その扱いと特に似てると感じた。
tupleは無名構造体という言い方をするとどこかで読んだことがあるけど、
もちろんtupleでリストを作るわけではないので違いは歩けd.
890 :
878:2011/12/26(月) 23:55:02.17
>>879 俺がモナドをよく知らないから新鮮に思えるだけかも
>>887 説明ありがとう
Haskellerがモナドモナドうるさい理由がちょっと解ってきたよ
うるさくはないよ。控え目だよ。
うるさくはないよ。針小棒大だよ。
うるさくないよ。短小早漏だよ。
>>886 >>884ではないけど、横レスしてみる
Lispのような動的型付け言語の場合、2つの要素から構成されるタプルと
リスト構成子である cons は同一であり、互いに置き換えることができる
Haskellのような静的型付け言語の場合、
タプルは直積構造であるから各要素のデータ型は互いに異なっていてもかまわないが、
リストにおいては各要素のデータ型は同一でなければならない
したがって、2要素のタプルとリスト構成子との間に互換性はない
無理矢理なぐらい広議にしたモノイドという観点に立てば関連性が無いとも言えない
cabal で stm をインストールしようとしたら、
Control\Concurrent\STM.hs:0:4: lexical error (UTF-8 decoding error)
というエラーで止まってしまい、インストールできません
そもそも cabal の lexical error というのはどういう時に起こるのでしょうか
[環境]
GHC 7.2.2
cabal-install 0.10.2
Cabal library 1.10.2.0
897 :
896:2011/12/27(火) 23:18:53.79
問題がだいぶ絞り込めました
{-# LANGUAGE CPP #-}
たったこれだけ書かれた Test.hs ファイルを ghci 上でロードすると、
Test.hs:0:4: lexical error (UTF-8 decoding error)
Failed, modules loaded: none.
と表示されエラーとなりますが、エラーの意味が分かりません
{-# LANGUAGE Arrows #-}
例えばこれだけ書かれた Test.hs ファイルなら、普通にロードできます
これ GHC 7.2.2 のバグでしょうか
それとも意図された振る舞いなのでしょうか
後者なら、このエラーはどのような意味なのでしょうか
898 :
829:2011/12/28(水) 03:00:47.10
>>829です。解決しました。
原因はIPv6周りだったらしく、Ubuntuの設定をしたら直りました。
自分の対処法としては。参考にしたサイトとは若干違い。
/etc/ufw/ufw.conf にIPV6の記述がなかったので
IPV6=yesに。
/etc/NetworkManager/system-connections/Auto eth0の[ipv6]のmethodがignoreになっていたのを、
method=autoにそれぞれ変更し直りました。
参考にしたサイト
hackage.haskell.org に繋がるようになりました。 - sirocco の書いてもすぐに忘れるメモ
http://d.hatena.ne.jp/sirocco/20110905/1315255573
899 :
829:2011/12/28(水) 03:12:45.40
まずプロバイダに特定のサイトが繋がらないんだけど?と連絡したら中の人がぐぐってくれたらしく
ipv6の設定を変えてみてくれという返事が帰ってきました。なんか検索したらそういうものが見つかったとのこと。
ipv6の問題とか自分の身に降りかかってくるとは思ってなかったのでパニクリました。
向こう側がググったサイトは教えてくれない感じで、Windowsでの設定方法を教えますって言われたので、うは、逆にUbuntuでの設定方法を教えてくれwと思いながらWinじゃないので、と言ってとりあえず引き下がって自分で対処しようとすることに。
うわー、面倒くさそうと思って、プロバイダ側で何が引っかかったのだろうとぐぐってみたら1番上が思いっ切りUbuntuの人のページでしたw
ちなみにAndroidケータイがXperiaなんですが、それでもhackageのサイトに通じなかったので、ipv6の設定がどうかなってるんですかね。
Windowsでipv6とかgoogleのグローバル版で調べてみてもあまりipv6と関連した情報みたいなのは出てきませんが。
外人さんは困ったりしないんだろうか。全くよくわからないところです。日本人・日本語だと困ってる人が少し出てきましたね。
で、結局Ubuntuでipv6の設定しなおしたらなんで繋がるようになったのかは理解してません。w
どうしてなんでしょうか?
この方のところも参考にしました。
UbuntuでIPv6 - とある技術屋の戯言
http://www.sonorilo.net/2010/05/10/2730
馬鹿には無理
901 :
896:2011/12/28(水) 07:35:30.95
>>900 賢い人でしたら
>>897 の問題分かるでしょうか
ちなみに、ghci -XCPP というオプションで ghci を起動させれば、
たとえ何も書かれていない空白の hs ファイルをロードしても、
全く同じ lexical error になります
適当に推測すると、cppの出力が非UTF-8の何かを含んでるんじゃないの?
cpp -traditional Test.hs
の出力を見てみるとか
まさにそれでした
ありがとうございます
904 :
896:2011/12/28(水) 07:54:57.28
>>902 ありがとうございます
色々な ghc のバージョンで試す環境が作れたので、
丁度今試していたのですが、どうも 6.12.3 なら OK で
7.0.0 以上なら NG みたいなんです
もう仕事に向うので、帰宅したら cpp -traditional Test.hs の方を試してみます
905 :
896:2011/12/28(水) 19:09:32.91
>>902 cpp -traditional Test.hs の結果が以下のように出力されました
-------------------------------
# 1 "Test.hs"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "Test.hs"
{-# LANGUAGE CPP #-}
-------------------------------
何か問題あるでしょうか
>>905 わからん。念のためghci -v Test.hsをやってみて、
そこで出てきたプリプロセスコマンドをそのまま打ち込んでみたら出力はどうなる?
カレントディレクトリかテンポラリディレクトリのパスに日本語が入ってるとか
907 :
896:2011/12/28(水) 19:58:14.00
CPP 言語オプションだけを記述した Test.hs に対して ghci -v Test.hs すると、
*** C pre-processor: でプリプロセスコマンドが表示され、
その直後に次のように表示されて処理が止まります
ghc.exe: fd:5: hGetContents: invalid argument (invalid UTF-8 byte sequence)
ここで、[Ctrl+C] キーで処理を止めると Interrupted. と表示されてから、
いつもの ghci のプロンプトになります
Arrows 言語オプションだけを記述した Test.hs ファイルの場合は、
全く問題なく(処理は止まらず)いつもの ghci のプロンプトになります
*** C pre-processor: で表示されたプリプロセスコマンドは以下の通りです
(見やすさの為適当に改行を入れ、パスに本名がローマ字で入っているので伏せました
また、最後の -o の出力パスはテンポラリファイルなので適当に変えました)
-------------------------------
"Haskell Platform2011.4.0.0のフォルダ\lib\..\mingw\bin\gcc"
-E -undef -traditional -v
-I "Haskell Platform2011.4.0.0のフォルダ\lib\base-4.3.1.0\include"
-I "Haskell Platform2011.4.0.0のフォルダ\lib/include"
-D__GLASGOW_HASKELL__=700 -Dmingw32_BUILD_OS=1 -Di386_BUILD_ARCH=1
-Dmingw32_HOST_OS=1 -Di386_HOST_ARCH=1 -x c Test.hs -o out.hscpp
-------------------------------
このプリプロセスコマンドを実行してみたところ、
こちらは止まらず、また特にエラー報告もなく out.hscpp が出力されました
このファイルの内容は
>>905 の結果の出力と同一です
どうも、この現象は私だけみたいですね
908 :
896:2011/12/28(水) 20:00:23.21
>>906 > カレントディレクトリかテンポラリディレクトリのパスに日本語が入ってるとか
それは無いです
>>897 暇だったからLANGUAGE CPPの方やってみたけど、問題なかった。当たり前か。ghciはversion 7.0.4でした。
変な制御文字でも埋まってるんじゃない?od -x -c Test.hsで見てみたら?
910 :
896:2011/12/28(水) 20:44:13.27
>>909 od コマンドが無いんで(Windows 7 環境)適当なバイナリエディタで見てみた
-------------------------------
{-# LANGUAGE CPP #-}
-------------------------------
7B 2D 23 20 4C 41 4E 47 55 41 47 45 20 43 50 50 20 23 2D 7D
-------------------------------
全く問題ないですよね
とりあえず、問題の stm パッケージさえインストールできれば作業は進むから、
#ifdef __GLASGOW_HASKELL__ などのマクロを外して自力でプリプロセスしようと思います
ですが、ひとつ問題が
#if ! (MIN_VERSION_base(4,2,0))
これは今使ってる base のバージョンが例えば 4.3.1.0 の場合、
これと #endif で挟まれている部分のコードは生きるんですよね
911 :
896:2011/12/28(水) 21:41:55.67
あかん
たとえ stm パッケージが無事インストールできても、
他の必要なパッケージで同じ問題が起きることに気づいた
もう OS 再インストールしか方法はないのかも知れん
912 :
896:2011/12/28(水) 21:59:15.96
意味も分からず解決してしまった
mingw-get-inst-20111118.exe をインストールしていたんだが、
これをアンインストールして、そのインストール先の mingw フォルダも全て削除したら、
何事も問題なく C のプリプロセッサ(CPP オプション)が使えるようになった
環境変数に mingw フォルダ内のどこかへのパスがあったわけでもないんだが、
なんでこれで解決するのか意味が分からない
GHC 内の mingw と干渉していたのではないかと思うが、
今まで普通に GHC と外部の mingw は共存できてたと思うんだが・・・
まぁいいや
お騒がせしました
windowsなんて捨ててlinux/mac系でやれば楽なのにね。
全くだ
馬鹿には無理
むしろ馬鹿ほどmacだと思う
917 :
896:2011/12/31(土) 11:39:52.12
wxHaskell を使ってるんだけど、以下のコードの挙動が予想外だ
(dc は paint イベントのハンドラの第1引数 DC () 型)
drawText dc "abc" (Point 0 0)
[ textColor := green
, textBgcolor := blue
]
俺の予想だと、青色の背景に緑色の文字が表示されると思ってたんだ
でも実際は、透明の背景に青色の文字が表示される
これは正しい挙動なのか、それともバグなのか?
[環境]
OS : Windows7
GHC : 7.2.2
wxPack : 2.8.12.01
wx : 0.12.1.6
wxCore : 0.12.1.7
wxHaskellは知らないけど
wx的にはwxDC::setBackgroundMode()で挙動が変化したような?
>>918 ありがと
ただ、残念なことに、今の wxHaskell では
DC の BackgroundMode を設定できないみたいだ
それらしい関数やプロパティが見当たらない
>>920 あ、なるほど dcSetBackgroundMode か
頭文字 s とか b で探してた
(部分一致とかで検索できないと不便だなぁ)
ありがと
>>918,920
dcSetBackgroundMode 関数に 100(wxSOLID)を設定してみたところ、
文字の背景に色が付きました
しかし、これだけでは背景の色は真っ白でした
そこで、次の様にしてみたところ、意図通りの結果
背景が黒で文字が赤色になりました
withBrushStyle (brushSolid black) $ \b -> do
dcSetBackground dc b
dcSetBackgroundMode dc 100
dcSetTextForeground dc red
dcSetTextBackground dc black
drawText dc "abc" (Point 0 0) []
どうも、drawText 関数とか set 関数で設定する textColor や textBgcolor は
正しく反映されないみたいです
(textBgcolor が文字の色になり、textColor が反映されない?)
おかげさまで目的は達成できました、ありがとうございました
時間がとれたらバグ報告してみようと思います(英文作るのにかなり時間がかかるんで)
よいHaskellを!
来Haskellは更に良いHaskellになるよう祈ってます。
おめでとう
925 :
デフォルトの名無しさん:2012/01/01(日) 21:54:51.56
なんだよ。789、790あたりを見てから、やっぱりモナドは注目すべきなんだろう
と思ってちょっと調べていたんだが、もうとっくの前に情報処理上で和田英一
さんが喝破しているじゃないか。やっぱりモナドなんて騒ぐほどのものじゃねえよ!
「関数プログラミングの泣き所は入出力を含む副作用である。...Haskellは
シリアルに計算を進めるメカニズムのmonadを考案し、これを解決したと言っ
ているが、関数型を一部手放したと言うべきであろう。Lispにも最初からprog
があった。」
理解が追いつかないことでの話のすり替えだね
和田英一って適当なこと言うんだな
「関数型を手放した」というのは意味不明だし、
モナドとIOを区別してないのは(言いたいことは分からんでもないが)雑な議論
和田サンは鞍とキーボードを同一視するくらいの人だからな
モナドとIOなんて同じようなもんなのだろう
達観してる
929 :
デフォルトの名無しさん:2012/01/01(日) 22:39:50.46
うーん。そうとも限らないよ。
やみくもに理解・学習しようとするだけでなく、理解・学習に値する事か
どうかも時々気にしておいた方がいいよ。
ああ、HHKの人か
キーボードは良いけど発言はいただけないな
932 :
デフォルトの名無しさん:2012/01/01(日) 22:49:34.63
追従する学習者たちは細かい区別を気にする。創造的達人は大きく同一視
できる。いずれ時がたつと後者に収斂する。
933 :
デフォルトの名無しさん:2012/01/01(日) 22:55:26.90
>>927 あなたはモナドを発明した人かそれとも学習しつつある人か
じっじゃんだからなぁ。もう80超えてるんだぜ
935 :
デフォルトの名無しさん:2012/01/01(日) 23:00:33.34
年は関係ない。
若い凡百のHaskellプログラマーの見解を聞くより、ずっと傾聴に
値する。
>>933 モナドを発明した人ではないよ
学習しつつあるとは言えなくもない。別に積極的には学習してないが
>>933 微分積分などの計算方法と違って、
モナドって発明というよりは発見なんじゃないか?
誰かは忘れたが、圏論の中でモナドの構造を見抜いた
違うか、ある共通の構造を見抜いて、それにモナドと名前を付けた
まぁその応用は発明に近いかも知れんが
Moggi氏が、言語の表示的意味論の構造を要素分解するのに、
そのモナドという眼鏡(見方・枠組み)が使えることを見いだした
で、Wadler氏が、表示的意味論に使えるのなら、
ある意味それに近い関数型言語にも利用できると閃いた
上の方にpdfのリンクあったろ
発作起こしてないで読め
>>925
FFI 関連について質問です
C言語で構造体と、それを引数として受ける関数などを作りました(*.h、*.c)
*.hsc ファイル内でそのヘッダファイルを include し、
C言語で定義したのと同じ構造のデータ型を定義しました
そして、Storable 型のインスタンス宣言の中で、
#size や #alignment マクロを使って
Storable.sizeOf や Storable.alignment を定義しました
(#alignment マクロは下記のサイトのものをそのまま使いました
http://stackoverflow.com/questions/8350706/how-do-i-find-the-alignment-value-when-defining-a-storable-instance ghc 7.2.2 ですけど、まだ組み込みマクロではないようですね)
そのあと、ghc2hs コマンドで *.hsc から *.hs を生成し、
また *.c をコンパイルして *.o を生成し、
それらを一緒に ghc でビルドしようと思います
(まぁ実際は、*.c のまま ghc に一緒に放り込んでも良いわけですが)
そこで質問なのですが、この場合、
*.c は ghc 付属の gcc、あるいは別に用意した同Var.の gcc でコンパイルしないと、
構造体のメモリマップが ghc2hs の解釈と(理論上は)合わないと思うのですが、
この認識は間違ってないでしょうか
正確に言えば、ghc の -pgmc オプションで指定したC言語コンパイラ、
hsc2hs の --cc オプションで指定したC言語コンパイラ、
そして *.c をコンパイルしたC言語コンパイラ、
この3つのコンパイラが同じ物でないと危険なのではないでしょうか
(たまたま、VC++ のコンパイラなどとその辺りの仕様が同じ場合もあるでしょうが)
理論を否定する連中は自分の能力を過信してるようだが
そいつらも現場で役立たずであることには変わりない
誰か声のでかい人や、口当たりの良い事をいう人に付いていくだけで
本当に良いのかどうか、今から考えた方が将来の為になると思われ。
そこにハスケルがある
ただそれを楽しむだけ
ただ、それだけなのさ
943 :
デフォルトの名無しさん:2012/01/02(月) 08:20:03.67
だけど関数型と副作用の問題って本当に解けるものなのか?
解けるときはどういう形で解けるんだ?
モナドはどこまでそれを解いたんだ?
まず現状何が問題なのか定義してくれよ
そっからだろ
>>943 ListとIOとMaybeは大体同じだということがモナドによって示された
つまりListが問題ないなら副作用も問題ないしnullポインタも問題ないと思われる
同じだということを否定する連中は自分の能力を過信する
>>939 構造体のレイアウトは、コンパイラが違えば異なる可能性があるし
同じコンパイラでも、コンパイルオプションによっても変わる可能性がある
構造体のサイズやレイアウトに依存したコードは、比較的大きな危険をおかしている、と思っている
実際に問題が起ることは少ないと思うけど
関数型マトモに勉強してたら和田先生をdisるなんて考えられん。
どう考えてもモグリだわw
>>945 それ、MonadどころかLISPのS式の時点で示されてるじゃんw
>>948 京都の先生にSICPの訳をdisられた疑惑が浮上して以来2chでの権威はストップ安です
モナドは中身はともかく、どう書けるかって話だと確かに関数型捨ててるでしょ。
特にdoを使って書いてると手続き型とほとんど変わらんし、似たようなスパゲティ化もしやすいし。
>>948 こういう人は具体的に何故モグリなのか全然説明してくれないから説得力が全くない
権威主義の人って大体そんな感じ
>>954 なんで自分で噂に根拠与えちゃってるの?
そのままほっとけば単なる噂ですんだのに。
クロージャーとかジェネレーターの辺りで完結するべきだった。
最近の関数型はだらだら引き伸ばしているだけ。
>>956 根拠のない噂を広める罪がわからないゴミカスのようなキチガイは死ねよ。
>>952 つまり、プログラマが式をどう考えるかや、コンパイラが式をどう扱うかではなく、
式をどう書くかによって関数型かそうでないかを判断しているのか、お前は
じゃあ、お前の言う関数型を捨てた書き方である
do {x <- getLine; putStr $ "> " ++ x}
これを
getLine >>= putStr . ("> " ++)
こう書いたら、関数型に戻るのか?
あともう一つ、本当にdo表記で似たようなスパゲティ化が起きやすいのか?
お前はdo表記で頻繁にスパゲティ化してしまっているのか?
スパゲティ化という事は、実行順序、Haskellなら計算順序が複雑に絡まるんだよな
それはdo表記だから絡まるのか? むしろdo表記の方が絡みにくくないか?
>>959 前者に関しては、俺の感覚ではイエス。
後者に関しては俺の書き方が悪かった。
手続き的なコードが縦にダラダラ長くなるとぐちゃぐちゃに見えてキモいってだけなんだ。
好き嫌いだけで一歩も進んでないのな
962 :
デフォルトの名無しさん:2012/01/02(月) 14:33:23.75
>>945 どんなもの達をもってきても、それらが「大体同じである」と見る視点はいくら
でも作れるわけだが、ListとIOとMaybeは大体同じだというモナドの視点はそんな
ナンセンスな視点ではないのだね?
>>962 > そんなナンセンスな視点ではないのだね?
「そんな」がどんなのを指しているのか曖昧だな
もっとはっきりと言ってくれ
大体同じであるという視点はどのような集合に対しても適用できるけど、
「どう同じなのかが論理的に説明できる」ことと、
その視点が応用する上で「役に立つ」こと、
この2点が無いとせっかくの発見も後の時代まで残らない
モナドはとりあえず今のところ残ってる
>>960 お前の手続き的なコードが縦に「ダラダラ長くなる」原因は何だ?
それはdo表記のせいなのか?
お前はもしかして、自分のコードがdo表記で縦にダラダラ長くなったら、
その原因がdo表記にあると考えて、getLine >>= putStr . ("> " ++)
みたいな表記に直すのか?
それとも、キモいって言うだけで、後が続かず終わってるのか?
もし本当にそうなら、関数型や手続き型うんぬんの前に、
プログラムそのもの構造を学んだ方が良いぞ(SICP なんか読みやすくてお勧め)
965 :
デフォルトの名無しさん:2012/01/02(月) 15:26:49.59
>964
縦に長くならなくても、
do {x <- getLine; putStr $ "> " ++ x}
のxも、関数型からすれば嫌だろ。
>>965 では構文的な構造が似ている
let x = 3 in f x
これも「関数型からすれば嫌」なのか?
967 :
デフォルトの名無しさん:2012/01/02(月) 15:53:19.26
>>963 最初からモナドと言わずにリストと言えば通じやすかったと思うが。
>>967 すまん、言わんとしていることがよく分からん
俺の発言の何に対する意見なんだ?
通じやすかったというのは世間にか? それともここ一連の会話の誰かにか?
前者なら最初から委員会の連中はリストはリストと言っている(モナドは後付け)
後者なら誰だよそんな事言ったの
俺は
>>962 の
ListとIOとMaybeは大体同じだというモナドの視点はナンセンスかどうか、に対して、
モナドはどう同じなのかが論理的に説明できており、かつ役に立つ視点である、
だからナンセンスではない、という自分の考えを謂わば逆説的に述べただけだよ
>>953 それはスーフリの方。
>>959 do表記は手続きっぽくなるから、スパゲティーメイカーになりやすいかも。
スパゲティーにするならせめてカルボナーラかミートソースにしてくれよ。
手続きっぽくなるとスパゲティになる理由は?
ちゃんと自分の言葉で説明できるか?
971 :
デフォルトの名無しさん:2012/01/02(月) 16:39:56.99
>>968 俺の方が曖昧な言い方ですまんかった。
まず通じやすかったというのは世間に対してという意味だった。
「ListとIOとMaybeは大体同じだ」というときの共通性が、言ってしまえばリスト化
(多元化)にあるのだとすれば、モナドなどというよりリストと言った方が
伝わり易いと思ったわけだ。また曖昧なこと言ったかな。
(ナンセンスうんぬんの方はもういいよ)
>>971 あぁ、なるほどな
> 「ListとIOとMaybeは大体同じだ」というときの共通性が、
> 言ってしまえばリスト化(多元化)にあるのだとすれば、
そう解釈してしまったのなら、
> モナドなどというよりリストと言った方が伝わり易いと思ったわけだ。
と言うのも十分に分かる、というか当然の反応だ
ただ残念ながら、少なくとも「それらに見いだした共通性はリスト化だ」
という解釈に関しては間違っている(多元化の意味は分からんが)
Wadler氏が List、IO、Maybeなどにどのような共通性を感じたのかは
Monad型クラスの関数に間接的に表れてはいるが、俺の力ではとても一言で言えない
それこそちゃんと知るには彼の論文や基になったMoggi氏の論文を読まないといけない
ただ、一般的なプログラマには「Monad型クラスの関数がモナドに共通する構造だ」
と言いうだけで応用上は十分だと思う
その共通構造をモナドが応用される前のListやIOに見いだしたと言っていい
>>972 よくわかってないが、非決定計算、副作用、継続についてはMoggiの最初の論文の中で定式化されてる。
共通性といいたいところは多分普遍的性質のことだろうと思う。
普遍性の構造が共通している、というかそれぞれモナドで整理可能だからモナドなんだろう。
975 :
デフォルトの名無しさん:2012/01/02(月) 18:25:00.71
モノイダル圏におけるモノイド対象が存在すること
>>975 ある一つの性質から全体の性質が定まることで、
モナドの場合はそれが入れ子状になっている、ようだ。
正直そんな説明できるほどわかってない。
>>974 それは全く説明になっていないと思うぞ
>>970 が訊いているのは手続きっぽくなるとスパゲティになる理由だ
[1] 手続きっぽくなる --> [2] スパゲティになる
原因 [1] によって結果 [2] になることを筋道を立てて説明してほしいのだろう
しかし、デバッグが困難になるというのは、さらにその先の結果だ
[2] スパゲティになる --> [3] デバッグが困難になる
デバッグが困難になるからスパゲティになるのではない([3]-->[2])
スパゲティだからデバッグが困難になる([2]-->[3])