関数型プログラミング言語Haskell Part20
1 :
デフォルトの名無しさん :
2012/10/17(水) 08:08:28.97
おつ
前スレの流れで一言。
関数型の考え方はExcelのおかげで充分社会に浸透していると思う。
Excelシートを使って統計や簡単な計算が出来る人は大勢いるが、同じことを
同じような時間で手続き型言語で出来る人が同程度いるとは思えない。
よって、前スレの
>>988 に同意
>>5 >>988 には同意だが、年寄り向きではないね。記号を使い過ぎで忘れてしまう。
Smalltalk や Prolog とはちょっと違う。
■ C for( const char *s="12345"; *s; ++s ) if( '2'<*s&&*s<'5' ) printf( "%d", (*s-'0')*2 ); ■ JavaScript console.log([1,2,3,4,5].filter(function (i){ return i > 2 && i < 5 ; }).map(function(i){ return 2 * i; })); ■ Python print(map(lambda x: x*2, filter(lambda x: x>2 and x<5, [1,2,3,4,5]))) ■ Ruby puts [1,2,3,4,5].select{|i| i > 2 and i < 5}.map{|i| i*2} ■ C# new{}{ 1,2,3,4,5 }.Where(x => 2 < x && x < 5).Select(x => x*2); ■ Common Lisp (print (loop for x in '(1 2 3 4 5) if (< 2 x 5) collect (* x 2))) ■ Haskell print [x*2| x <-[1,2,3,4,5], x > 2, x < 5] ■ Perl print map {$_*$_} grep {2<$_ and $_<5} 1..5; ■ Mathematica {1,2,3,4,5}~Select~(2<#<5&) 2 ■ MATLAB x=[1 2 3 4 5]; x(2<x&x<5).*2 ■ Scheme (print (list-ec (: x 1 6) (if (< 2 x)) (if (< x 5)) (* x 2))) ■ Clojure (for [x (range 1 6) :when (and (> x 2) (< x 5))] (* 2 x))
てか、プログラミング学ぶときって、そんなに学校の勉強や日常生活のアナロジーで考えるかなあ たしかにそういう入門書は多いけどさ
それより学校の国語はふつうに宣言的だし日常で使う言葉も宣言的
宣言的な考え方は認識や言葉の基本。身近すぎて
>>990 が気づいてないだけでは
宣言的、の意味を理解してないのかも
c#だと Enumrator.Range(1,5).Where(x => 2 < x && x < 5).Select(x => x*2); だよ。 1から5までぐらいだったら文字数増えちゃうけどね。
>>8 アナロジーで考えるという事ではなく、染みついた思考法・問題解決法
>>9 宣言的の意味が違う。
出くわした問題や課題を解決しようとする時に、
素直に頭に思い浮かぶ解決方法としての宣言的な考え方の話。
問題や周辺環境を宣言的に表現して解を導く子どもはあまりいない。
たいていの子は問題解決への(直接の)手続き・手順を考える。
新スレおめでとうございます:(;゙゚'ω゚'):
>>13 えーそんなことないでしょ。推論は宣言的な方法で問題解決してるじゃない
解決方法としての宣言的な考え方が日常的でないなんていうのはおかしい
後出しの独自定義の相手すんなよ 「関数型言語は自然な人間の思考に反する」とか言うために 子供がどう考えるかとか話を拡げて泥沼化したいだけだろ 変な脳科学みたいに
茂木は今関係ないだろ!
宣言的ってMakefileのトップレベルの部分書くときみたいなのですか?
>>16 「関数型言語は自然な人間の思考に反する」と言ったことは一度もない。
人間の思考は柔軟なので、訓練すれば誰でも色々な考え方が自然にできるようになる。
先のは問題や課題を解決しようとする時、かつ、子どもの話だ。
子どもは思考をする訓練をまだそれほど受けない。
大人に向けて成長していくうちに、授業や生活の中で自然に
宣言的な考え方をする訓練を徐々に受ける。
(教師側も宣言的な考え方を学ばせようと意図しているわけではない)
社会人になる頃には、たいていは宣言的な考え方も、
手続き的な考え方もやろうと思えば普通にできるようになってる。
しかし、意識してやっているわけではないので、
そのままでは Haskell でプログラムするのにたいして役には立たない。
問題や環境を意識して宣言的にとらえたり翻訳する練習を重ねないと、
プログラムは難しい。
ただ、考え方自体はすでに慣れているので、
宣言的な記述を見たときにそれを解釈するのはそれほど苦ではない。
また、そのために、問題を宣言的にとらえるのも、
ある問題で合点がいけば他の問題もスルスルと合点がいく事も起こり得る。
Haskell を初めた頃は難しかったが、
ある日突然視界が開けたという経験をする人が多いのは、
そのことも少なからず関係しているのではないかと私は思う。
Haskell である日突然視界が開けるようになるためには型システムを理解しないとね。 宣言的とか関係ないんじゃね?
>>21 型システムを理解しないとね、は自分も経験してるから簡単に同意できる。
宣言的とか関係ないんじゃね? は、根拠を示してくれ。
関係ないと感じた経験がないから、じゃね?と言われても
このままでは同意も反対もできん。
>>20 指摘はもっともだ。
>>990 > 静的な、宣言的な考え方なんて、手続き的な考え方に比べれば、
> 学校教育の現場でほとんど出くわすことはないだろう。
> たとえ出くわしても、意識しなければ素通りしていくだけで、身にならない。
これは言い過ぎた。
出くわすし、成長と供に授業の中でそれとなく訓練を受けてはいる。
しかし、いかんせん、そうだとは意識していないのだから、
そのままでは Haskell のプログラムをする事に関してはたいして役に立たない。
宣言的な考え方に触れた時にそれを理解できる体勢にはなるが、
そういう考え方を自分から進んでするまでには至らないだろう。
そして、自分から進んで宣言的に考える事に慣れなければ、
Haskell でのプログラムが C や Java より簡単とは思えないのではないだろうか。
自分で宣言的に考える事ができなければ
Haskell のプログラムはいつまで経ってもしっくりこないと思う。
三行以内にまとめろ
諸君、議論したまえ
>>24 今回の件では3行以内でレスするのは今の私には無理だ。
どうしても3行以内にしてほしいのなら、
もうレスをやめざるを得ない。
本日の議題: 「宣言的」とはどういう意味か
>>26 3行とか関係なしに、もうレスやめていいよ
やると言ったらやるのが宣言的 できるならやる、できないならやらない、は宣言的ではない 何ができるかよりも何をするべきかを重視する
たとえば連立方程式の解を求めよ、という問題に対して どう解くのが宣言的なのよ?
とにかく解いたと仮定する 矛盾するまで仮定するのをやめない
こういうのは宣言的っぽいと思うんだが、どう? 囲碁を例に極簡単に示すと iterateF :: a -> [a -> a] -> [a] iterateF = scanl (flip ($)) -- ゲームの進行状態とは、初期状態から交互に着手したものである progressStatuses = iterateF initialStatus (cycle [blackMove, whiteMove]) -- 終局状態とは、ゲームの進行中に投了するか、着手できなくなるか、千日手になった時である eventualStatus = find (isResigned || isFinished || isRepeated) progressStatuses ほぼ自己説明的だから本当はコメントなんて要らんと思うが一応書いておいた。 ***Status 系は今の盤の状態の他に、一つ前の盤の状態とか、 終局理由の情報も含まれてる代数データ型。 あと、ユーザー入力はどうすんの? とかいう話はとりあえず無し。
囲碁では千日手は簡単に作れる これは宣言じゃなくて発見
…?
もしかしたら最新の GHC では取り除かれているかも知れませんが、 下記のようにパターンの中で簡単な計算をするのは どういう名前の言語拡張でしたっけ? f :: Int -> Int -> Int f (n + 1) x = ・・・
宣言:その分野のプロでも知らない用語を定義する 発見:定義しなくてもそのうちわかる
>>34 つまり、アルゴリズムというものは、宣言的ではあり得ない?
例えば、宣言してもしなくてもアルゴリズムが存在する場合 それは宣言とは全く関係ないから宣言的ではない 黙っていても存在感があるものは宣言的ではない 言い続けなければ消えてしまいそうなものは宣言的
ワロタww
Haskellで実用的なもの作ってみろよ ほかの言語でもできるから
>>40 「アルゴリズムとはチューリングマシンの計算表のことだと考えよう!」
宣言的っていうのやめて静的っていえばいいんじゃね 現に宣言的型とはいわないだろ 静的型だろ
終動負荷的な静的筋力トレーニング
今ここで議論の真似事をしている間だけの限定でいいから、 宣言的という言葉の意味をはっきり定義してくれ じゃないとまじめな議論にならんだろ
A とは B のことだ。 というような文言の羅列になるのが宣言的なのでは。
オブジェクトなどの羅列ではなく文言の羅列なのか
>>49 この文脈で言うオブジェクトってなにを指す?
メモリ領域などを抽象化ものの羅列って、意味が分からん ちなみに、Haskell の変数は特定のメモリ領域に付けられたラベル(名前)じゃないよね
>第1の定義によれば、ある出力を得るにあたってそれを作成する方法ではなく、出力の性質を記述することを「宣言型」と称する。 >別の定義では、純粋関数型言語/論理プログラミング言語/制約プログラミング言語で書かれたプログラムを「宣言型」と称する。
>>52 そうだよね
特定したくないから抽象化したんだよね
>>54 特定したくないから抽象化したって、何か勘違いしてないか?
Haskell の変数は、値が格納されたメモリ領域に付けられたラベルではなく、
「値に付けられたラベル」だぞ。
let a = 17
というのは、17 という値の別名が a ということだ
>>55 特定の値ではなく抽象的な値にラベルをつけるよ
まだ値がわからない段階でもラベルをつける
おー、ごめん。 夏期オリンピック(1996,アテネ). 1988ではなくて、1996だった。さっきjavaの宿題スレにも 同じテーマのことを書き込んでその時点から勘違いをしていた。
59 :
58 :2012/10/19(金) 21:23:52.62
さらに間違い。1996年ではなくて、1896年です。すみません。
>>52 は「変数は特定のメモリ領域に付けられたラベルではない」と言ってる
>>54 は「そうだよね}と同意し「特定したくないから抽象化したんだよね」と言ってる
>>54 の言う「特定したくない」というのは、メモリ領域を特定したくないから、
と読み取れないか?
もっとオリンピックに詳しい人に聞けばいいのに プログラマーがオリンピックを宣言するのはなぜなのか
RWH 読んでて型構成子って何かと思ったら、型コンストラクタかよ。
>>38 n+kパターンはHaskell98の仕様にあったが、Haskell2010で取り除かれた。
GHCのフラグには (No)NPlusKPatterns がそれかね。
GHC 7.6.1 を使っています。 Graphics.UI.GLUT モジュールをインポートしたファイルを ghci 上でロードするまではできました。 しかし、そのモジュール内の関数を評価しようとすると、 下記のエラーメッセージが出力されます(改行は適当に入れました)。 Loading package OpenGLRaw-1.2.0.0 ... linking ... <interactive>: C:\Users\***\AppData\Roaming\cabal\OpenGLRaw-1.2.0.0\ghc-7.6.1\HSOpenGLRaw-1.2.0.0.o: unknown symbol `__imp_wglGetProcAddress' ghc.exe: unable to load package `OpenGLRaw-1.2.0.0' ネット上で調べてみました。 同じような環境で同じエラーが出た方の書き込みがいくつかありましたが、 私が見た限りでは、解決策、あるいは解決に繋がるような情報はありませんでした。 このようなエラーに関して何か心当たりはないでしょうか。 ちなみに、ghc でのコンパイルは問題なく行われ、実行ファイルも起動できます。 ghci 上でのみ問題が起きます。 [環境] Windows7 64bit GHC 7.6.1 GLUT-2.3.0.0 パッケージ(他の依存パッケージも cabal で自動インストール) glut-3.7.6-bin_x64(GLUT 本体) [コマンド] ghci -lglut32
単相性制限はその後どうなりましたか? 望まれない子の将来が気になります
RWH、Maybe の箇所、唐突に Just 使って、しかも結局 Just の説明皆無かよ。
RWHって文章の構成悪いよね 説明なしにいきなり初出の単語が出てくるし話はあっちこっちに逸れまくり Haskellとかコンピュータとかの枠に限らず一般的な書籍としてかなり悪いほうだと思う
でも他の書籍やネットで基礎をしっかり学んでおけば、 それほど苦にならないと思うが
これから学ぶ範囲の知識について他で学習しておかないと理解に苦しむような本だったら 学習のための本としての役割を果たしていないと思うけどね
「理解に苦しむ」って、今回の件ってそれほど大げさなことかな。 あれ? 何だろ? って思ったら、まずは調べてみればいいいじゃん。 Just なんてその本にしか載っていない特別に物でもないんだし。 他の本でもそういうの色々あるよ。 とくに説明もなく新しい単語や概念が出てくるのなんてしょっちゅうだ。 そんなところでいちいち躓いて憤ってたらきりがないよ。 それに改善点を指摘するなら、ここにじゃなくて、出版社や著者にでしょ。
Haskellを本格的に使いこなそうと思ったらRWHのレベルまでは知っておく必要があるからね 他の入門書はとりあえずHaskellを知る程度のものでしかない RWHに代わるものが現れるまではとりあえず必要なものだ
GHC 7.6.1 って、もしかして32bitアプリは作れない?
>>75 遂に白河の清きに魚の住み兼ねて
元の濁りの田沼に戻るのですね!
MonomorphismRestrictionのどのへんに白河の清き要素があるのか気になる
どなたか! この中にMonomorphismRestrictionを擁護してくださる方はいらっしゃいませんか!?
型システムわからん 良かれと思って型宣言したらコンパイル通らなくなる rigid type variable bound by 云々言い出して 俺の善意を踏みにじりやがる
>>79 どんなコードでそのエラーが出た?
そのエラーには「Could not deduce ~」というのもあった?
ちなみに型は、元々コンパイルが通っていたコードに
良かれと思って後から書き加えるものではないよ。
テスト駆動がまずテストを書くのと同じように、まず型を書くんだよ。
それから本体を「型に合わせて」書くんだ。
>>79 もしかしてローカル変数に多相型の宣言付けてエラーもらってる?
それなら、ローカル変数の型宣言の中では、外の型変数を(ScopedTypeVariable拡張なしでは)
使えないということを覚えておけばいいよ
>>80 >テスト駆動がまずテストを書くのと同じように、まず型を書くんだよ。
そんなの場合によるだろ。糞どうでもいい
>>82 どのような場合に先の型を書き、
どのような場合に後に型を書くと良いのでしょうか?
何か簡単な事例を挙げていただけると助かります。
どんな場合によるのか興味ある
じゃあ俺も興味ある
me too
母さんビール
89 :
デフォルトの名無しさん :2012/10/24(水) 19:59:05.00
haskellには(式以外の)文がない・・・って嘘じゃね?
92 :
デフォルトの名無しさん :2012/10/24(水) 20:45:05.32
ifも式、letも式。ではwhereは式?
そもそも式以外の文がないってどこ情報よー
>>83 ただちに書かなくていいことは後で書く
テスト駆動も、制約に合わせて書くというより
関係ないコードを書かないことで間違いを減らしている気がする
>>83 好きにすればいいと思うけど、俺の基準を挙げるなら、
トップレベルの定義は先に思い付いた方から書く
・普通は型の方が簡単なので型から書くことが多い
-- | 標準正規分布に従う乱数を生成する
randomNormal :: StdGen -> (Double, StdGen)
・定義が頭にあるのに型がすぐに思い付かないor面倒なら定義から
forceTell x = rnf x `seq` tell x
forceTell :: (MonadWriter w m, NFData w) => w -> m ()
ローカル変数は定義から書く。型は必要なときだけ後から書く
>>92 そもそも、「式」とは何?
それをはっきり定義しないと、where が式なのかどうか判断できないだろ
Haskell Reportの言葉遣いに従うなら簡単 ・whereは式じゃない。宣言やcase選択肢の一部 ・Haskellに「文」は存在する。do式の中に並んでいるのがそれ
俺はグローバルでもローカルでも型から先に考えるな。
書くかどうかは気分(ローカルで型推論がうまく働かなきゃ書く)。
>>80 の型から先に書くというのは、そういう意味で俺は無意識に拡大解釈したけど、
例に出したテスト駆動の方は実際に書かなきゃ意味ないなぁ、どうなんだろ。
(テスト駆動の方も、コードの内容よりテストから先に「考える」と言えばそうだろうが)
where は節 SQLなら
tail は確かに List にも Vector にもあるから Ambiguous かも知らんけどさ 渡してるのが Vector なんだから Vector の方の tail だって推測してくれても良いんじゃないの? 分からず屋!
実行時間計測用コマンド作ってみた 良かったら使ってください (ネットで都合良く使えそうな関数見つけて、Cで良いのに意地になって作っちゃった) import Data.Time import System.Process import System.Environment import System.IO main = getCurrentTime >>= (\start -> getArgs >>= (\commands -> runInteractiveProcess (head commands) (tail commands) Nothing Nothing >>= (\(_,stdout,_,_) -> hGetContents stdout >>= putStrLn >> getCurrentTime >>= (\end -> print $ diffUTCTime end start))))
日記
>>100 その機能をうまく(型推論の便利さをあまり犠牲にしないで)実装できたらすごい
俺は尊敬するし、論文も書ける
104 :
デフォルトの名無しさん :2012/10/26(金) 18:48:34.11
MSがはやく Visual Haskel/CLI 出してくれればいいのに
関数型はF#とpythonが既にあるからねぇ。
MSRにGHCメイン開発者いるけど学者としての活躍が使命でMS製品に反映させなくていい人たちだったとおもうので、 IronPythonみたいに外部か開発部署に物好きがいないとむずかしいかもね。 どちらかというとF#の人たちがどういうポジションなのか気になる。
>>103 どうしてだよ!
手続き型言語によくあるオーバーロードだろ
できないのかよ!
>>107 特徴
・コンピュータサイエンスっぽいノリ。関数型プログラミングを
数学の一分野として位置づけて証明をつけたりするような議論がある。
副題に「原理と技法」とあるのは適切だと思う。Haskellってリスト内包表記で
無限リストがあっさり扱えたりする反面、自分が書いたコードが本当に効率が良いのか
わかりにくいところがある。この本では、コードの効率を手で分析してみせてる箇所があり、
そのような議論を丁寧に追って自らの血肉にできれば有益だと思われる。
・モナドの説明は想像していたよりあっさりしていた。
コンピュータサイエンス寄りの本とは言え、突如領域理論や圏論で読者を打ちのめす心配は一切ない。
・Haskellという言語自体の入門書にもなっているが、この本をHaskell入門書として紹介するのは
SICPをScheme入門書として紹介するのと同じぐらいには間違っていると思う。
・すでに訳出されている fun of programming (関数プログラミングの楽しみ) はこのBirdの本の
「続編」という位置づけであり、その本の中でIFPHでは~のような言及がしばしばあるので
「関数プログラミングの楽しみ」を楽しむためにはこの本も持っていたほうが良い。
まとめ
「関数プログラミング入門 Haskellで学ぶ原理と技法」はHaskellをとりあえず使ってみたいという
人には向かない。そのような向きには「すごいHaskell~」を勧める。この本は、ある程度Haskellで
自分が書きたい関数を書けるようになり、効率の問題に直面しはじめた人にこそ向いていると思う。
どのようにデータ構造を工夫し、アルゴリズムを解析し、改良するかについての実例が載っており、
これらの技法を身につければ --- 簡単ではないだろうが --- より整然とした、そして効率の良い
Haskellコーディングができるようになるだろう。
自分もその本、気になってた。くわしい解説ありがとう! 「関数プログラミングの楽しみ」の前に読むといいのか、なるほど
以前原著買おうとしたけどいいお値段しててやめちゃったな オーム社さんいい仕事してくれるぜまったく
大武者
pdfで出してくれー
みんなhaskellでなにかいてるの?
続編を買って読んでいて、前編を欲してる人に是非おすすめ、という感じか
なんせ「関数プログラミングの楽しみ」ではモナドの話はIFPHの11章を見てもらうことにしてここではArrowの説明するぜ! というノリだからね。 続編というか、IFPHを前提というかそういう感じかな。
こういう本ってすぐ絶版になったりするから すぐ読まないにしても確保しといたほうが良さそうだな
>>118 そsそうなの!?
関数プログラミングの楽しみとセットですぐ買おうかな
ghc 7.6.1 で foreign import stdcall 使うと警告が出る。 the 'stdcall' calling convention is unsupported on this platform, treating as ccall これはどういう事? ccall が実際にどういう規約なのかよく分からんけど、 もし ccall == cdecl なら、ccall /= stdcall だよね。
>>107 って目次を見ると、どっかで読んだような話ばっかだよな
もうこの手の本はお腹いっぱいだわ
>>122 なるほど。
x64 & Windows では呼び出し規約は1種類に統一されたのか。
外部ライブラリを呼ぶ時も、呼び出し規約は何だろうと
ヘッダファイルを調べたりする必要がなくなるわけだ。
こりゃ便利。
ありがと。
IFPHは完全にコンピュータサイエンスの本だから、プログラミングの本だと思って買うとがっかりするぞ
SICPをScheme入門書として紹介するのと同じぐらい~って表現がぴったりだな
Vectorの変更不可の方は sliceなんかするとC++でいうところの参照のベクタになるってことでいいすか? 中身のコピーはしないんですよね?
>>127 vector パッケージのドキュメントには、
Data.Vector.slice の項に次のように書かれています。
O(1) Yield a slice of the vector without copying it.
The vector must contain at least i+n elements.
もしコピーされているようなら、それはバグですね。
129 :
Perl忍者 ◆M5ZWRnXOj6 :2012/10/29(月) 09:47:53.39
http://pbh.jp/wiz/ ↑
これ解けないやつは真骨頂にクズ
ハッカーをを名乗る価値無し
海外からNinjaレベルと言われるほどの者なら簡単に解くことができる
解いてみてみ?
合ってるか確認してやるから
SHA-1とか総当りとかほざいてるようじゃ脳味噌足りてないよ
ホワイトハット気取りのお前らクズじゃJarlsbergすら解けないんだろうな
131 :
デフォルトの名無しさん :2012/10/30(火) 11:10:57.70
政治学習
噂の『関数プログラミング入門』を買った カバーデザインがポップでありながら品があって良い 組版もプログラミングHaskellと同じものなのですっきりしていて気が散らない Haskellのコードに使われる等幅フォントが縦長窮屈でなく読みやすい 製本は流行りのlay-flatタイプの綴じ込みでこのへんもぬかりない なかみはむつかしくてよくわからなかった
>>132 > なかみはむつかしくてよくわからなかった
一番感じなところだが・・・
肝心なところ
カバーデザインが非常に洗練されている「関数プログラミングの楽しみ」の前編に相当するとのことなので、 やはりデザインはいいんだな
この本開きやすいよな フルフラット製本って言うらしいけど
フルスロットル製本に空目した
RWHより簡単かどうかだけ知りたい
諸君、議論がお留守だ
>>7 ほんとにjsやpythonってそんなひどいん?
>>7 ■Objective-C
for (id num in @[@1,@2,@3,@4,@5]) printf("%d\n", [num intValue]);
または
for (id num in @[@1,@2,@3,@4,@5]) NSLog(@"%@", num);
Pythonでリスト内包表記使ってないのは不公平だな ■Python [x*2 for x in range(1,6) if 2<x<5]
>>7 て一番酷いのはHaskellだろ
こんな阿呆なコード書くやつ居ないよ
畜生、Vectorにnub無いのかよ
nub って何?
>>7 って [1, 2, 3, 4, 5] みたいなリストを用意するのがルールじゃないの?
range とか 1..5 はだめだろ
Conal Elliott のブログの写真って、最近変わった? つい最近まで正面を見てなかったっけ まぁ、どうでもいいが この素敵なおっさん、いつになったらブログ更新するんだろ
>>138 RWHは泥臭く実例を追う実用主義。BirdのIFPHは、理論的な側面を強調している。
無限リストの挙動がなんでそーなるの的な数学的原理なんかはIFPHが優れてるし
画像を扱ってバーコードリーダー作るぜ⇒大量のボイラープレート⇒それモナドでまとめられるよ
なんて話はRWHの優れたところだ。
コンピュータサイエンス(数学寄り)の素養があるならIFPHが簡単だろうし
CとかPerlは実戦でつかえるけど理論には興味ないしそれでも関数型使ってみたいならRWHが向いてる。
モナド変換子を解説してる日本語書籍がRWHしか無くないかね? 現実的にHaskellを使いこなすにはモナド変換子の理解が必須だと思うのだけど
>>149 IFPHの10.4でモナド変換子の説明が載ってますぞ~
例外の複合、状態の複合を例として説明し、最後にそれらを応用してますぞ~
それならちょっとIFPH立ち読みしてくるかなあ よさそうなら関数プログラミングの楽しみと一緒に買ってしまうか 関数プログラミングの楽しみの方は、いつかじっくり読みたいなとは思ってたんだ
丁度昨日IFPHと関数プログラミングの楽しみ併せて買ってきたわ 読みたい時に手に入らないとかありがちだからなー
153 :
デフォルトの名無しさん :2012/11/03(土) 04:55:02.03
155 :
デフォルトの名無しさん :2012/11/03(土) 18:50:29.18
モナドって、IO、継続、Stateなどの副作用系から、LISTや冪集合などの 数学系に至るまで、適用範囲がすごく幅広いのだが、これはどうしてだろうか? これだけ幅広くても、モナドとは何かを言えるものだろうか?
またモンゴロイドが疑問を抱いてるようです
>>155 関数ほどは幅広くはないよ
でも関数とは何かを言えるものだろうかなんて誰も疑問に思わないな
158 :
デフォルトの名無しさん :2012/11/03(土) 19:22:34.41
>>157 関数。たしかにそうだけどね。
モナドは中途半端に幅広い、と言うとどうかな。
関数の場合は、モナドのような分類(IO、State、...)はしないよね。
しかもこの分類はアドホックな分類にも見えるし。
>146 >7のClojureはrange使ってるよ
>>155 Prologは副作用系と数学系を区別してなかったのだが
Haskellはいったん副作用系と数学系を対立させ、再び統一するためにモナドを発明した
161 :
デフォルトの名無しさん :2012/11/03(土) 20:43:47.80
>>160 うん。そのとき、たとえば、IO a とList a における IOとListには、
どちらも型構成子であるという共通性はあるが、それ以外の共通性は
感じ取れないんだ。さらにいうと、List aの方はaの自然な拡張だと
すんなり納得できるが、IO aの方は、aとIOの強引な組合せとしか
見えないんだ。
>>159 前スレのテンプレを見てもらえばわかるがrangeとか1..5とか使ってないのよ
だから元々そういう縛りがあったんだろう
あれはテンプレじゃなく前スレで勝手にぶっこまれただぞ
>>163 それは失敬
でもテンプレ化するならそれなりにルールを決めないとだめだよね
>>161 お前には感じ取れなくてもListとIOには共通性があって
その共通性に基づいてるのがモナドなんだな
166 :
デフォルトの名無しさん :2012/11/03(土) 21:11:34.99
え聞こえないとかありがちだからなー
「感じる」とはまた曖昧で主観的な・・・
168 :
デフォルトの名無しさん :2012/11/03(土) 21:28:01.97
>>165 >ListとIOには共通性があって
どういう共通性?
モナドとは、モナド則を満たすような(>>=)とreturnを定義できる型構築子のこと 逆に、ある型構築子に対してモナド則を満たすような(>>=)とreturnを定義できるならそれはモナド
IOとかListとかが実際に果たす役割はどうでもよくて、共通する構造によって表現可能ってことだから 関数よりむしろモナドのほうが広いとも言える
171 :
デフォルトの名無しさん :2012/11/03(土) 21:43:13.59
>>169 むしろ、IOとListとが同類にみえるようなモナド則は実はナンセンスなのじゃ
ないかという疑問なのだが?
>>170 さすがにそんなことはないだろう。
>>169 そのような性質を持つものにモナドという名前を与えた背景の方が興味あるな
>>171 モナド則なんてなくても、Prologでは副作用と非決定性は同類に見えていた
174 :
デフォルトの名無しさん :2012/11/03(土) 22:15:51.32
>>172 お察しの通り、モノイドとの類似性から
>>173 非決定性が副作用の一部というなら分かるが、同類というのは分からん。
Prologの何のことを言ってる?
非決定性と副作用を同類に扱う手法のひとつがモナドだよね?Prologには何かそれに代わる物がある?
>>171 ナンセンスとか言っても現実にリストとIOは同じモナドの概念でまとめられるので、
まとめられる以上それを別のものにする理由が無い
IOはRealWorldを状態に持つStateモナドのようなものだってことは理解してる?
Prolog:
非決定性は副作用の一部 (
>>174 )
Haskell:
非決定性はモナドの一部 + 副作用はモナドの一部
まとめられるから、というだけでモナドにまとめている訳でもなさそうだけどな まとめられるのに、諸事情でまとまっていないものもあるし
でも、非決定性、状態、継続、例外、入出力等、 かなり多くのものがまとめられるからモナドを選んだんじゃないのかね?
色々やってるうちに便利なことに気付いたって印象だな IOとか昔はモナドじゃなかったんでしょ
182 :
デフォルトの名無しさん :2012/11/03(土) 22:54:29.24
流体は非粘性(粘度効果は無視できる)、ポリトロープな状態方程式で記述される熱的な理想気体とし、断熱過程の下で作用する。
応用範囲が広くて便利なものを「ナンセンス」と言う意味が分からんな 独自の言葉の使い方をしてるならちゃんと最初に定義してくれ
>>155 Moggiの論文に説明があるよ。でもまあ確かに判ってる人が
判ってる人向けに書いてる感がある。
>>171 さすがにそんなことはないだろう、なんてことはないのだ。
恒等関手もモナドなのでモナドによって定まるKleisli圏の中に元の圏も
含まれている。形式的な話ではあるが。勿論モナドごとに一つのKleisli圏があり、異なる
モナドをつなぐためにはめんどうな事をしないといけないが
(この辺は自分もまだ未把握。モナドトランスファーが関係してるのかなぁ)
186 :
デフォルトの名無しさん :2012/11/04(日) 00:41:32.78
コアンダ効果を通常の翼の速度分布の説明に使うのは不適切であると
駄目だ! このスレ頭良い人達でいっぱいだ!
188 :
デフォルトの名無しさん :2012/11/04(日) 07:59:40.61
>>185 そういう言いかたなら、関数は射なのだから,やっぱりそんなことはないのだ。
>>188 射は関数とは限らないから、それは反論になってないよ(ただ185の議論が強引なのは確か)
プログラムとは関数では無くKleisli圏の射のことなので、 関数よりモナドの方が広いと言うのはある意味正しい
191 :
デフォルトの名無しさん :2012/11/04(日) 10:13:46.42
>>185 いまここではそもそもそのKleisli圏がどれだけ意味があるのかを聞かれているんじゃないかな
192 :
デフォルトの名無しさん :2012/11/04(日) 10:22:17.47
>>190 米田の補題より、関数=射。
190より、モナド⊂プログラム=Kleisli圏の射⊂射。
したがって、モナド⊂関数。
これでOK?
諸君、議論しているね
>>192 >米田の補題より、関数=射。
ちょっと意味が解らないんだけど、
米田の補題からどうやって関数=射(ここで言うイコールって何?)が導かれるのか説明してくれない?
むしろ、カルテジアン閉のような気がする
Q. 何でIOと[]の共通部分をわざわざ括り出して名前を付けるの? A. 便利だから で済む話だろ
Moggiの論文読めば済む話なのに、何をごちゃごちゃ言ってるのんだよ
英語を読んだら死ぬという噂だし…
>>197 IOをモナドで扱うのが便利なのは分かるが、
リストまで同じようにモナドで扱うのが便利な理由がいまいち分からん
201 :
デフォルトの名無しさん :2012/11/04(日) 17:43:30.65
>>198 だからあMoggi論文が納得できないって言ってるんだろ
それはそれでありだな
>>200 内包表記便利じゃん
あれってモナドだからだよ
>>195 :(;゙゚'ω゚'):カルテジアンなの? カルテシアンだと思ってた
コードも書かずにモナドがどうやら大して理解もしてない圏論がどうやら、 実にHaskellerらしいスレですね
圏論を深く理解したHaskellerでもなさそうなあなた様が このような場末に何の御用で
>>200 リストモナドは総当たり(深さ優先探索)するときに使う
問題によってはStateT s []がすごく便利
>>202 リスト以外で内包表記が役に立つ(適している)シーンが思い浮かばない
リストもモナドで括る利点が内包表記ができるってだけなら、
内包表記はリスト専用構文でもいいような気がするのだが
>>206 すまん、総当たり(深さ優先探索)する簡単な具体例は何か無いだろうか
(俺、ここでいう総当たりの意味がよく分かっていない)
リストがモナドになっていない他の言語と比較してみたい
つうかモナド内包表記っていつのまにか復活してたのか
Listモナドが何なのかもわかってなくて煽ってたのかこいつは Listの各要素に関数を適用するmap程度のものだとか思ってたのか?
いろんな書き方が出来て楽しいのう do { x <- xs; y <- ys; return $ x + y } [x + y | x <- xs, y <- ys] (+) <$> xs <*> ys
>>210 それ以外に効果的だと感じる内包表記の使い方を見たことがない
わかってるじゃないか お前が見たことないだけだよ
>>211 みたいなの見てるとリストの要素から別のひとつの要素作ってるだけだから、
あんま効果的に見えないんだな
リストモナドの場合、
要素からリストをつくる操作(リストが入れ子になるわけじゃないよ)とか
要素を排除する操作とか(途中ですべての要素が排除されたら処理は止まる)を混ぜることができて、
最終的に結果をひとつのリストとして得ることができる
総当りというかバックトラックの例だが。 nQueen :: Int -> [[(Int,Int)]] nQueen n = nQueen_ 1 [[]] where nQueen_ m ans | m > n = ans | otherwise = nQueen_ (m + 1) [(m, x) : xs | xs <- ans, x <- [1..n], all (\ (i, j) -> x /= j && abs (m - i) /= abs (x - j)) xs]
4つの4で0..100を作るパズル import Data.List import Control.Monad main = putStr $ unlines $ map (intercalate ", " . take 2 . fourFours) [0..100] fourFours :: Int -> [String] fourFours target = do (val, str) <- msum $ map makeWith [[4,4,4,4], [44,4,4], [4,44,4], [4,4,44], [444,4], [4,444], [4444]] guard $ val == fromIntegral target return str makeWith :: [Int] -> [(Rational, String)] makeWith [x] = return (fromIntegral x, show x) makeWith xs = do (left@(_:_), right@(_:_)) <- zip (inits xs) (tails xs) -- xsを二つに分ける leftVal <- makeWith left -- 左部分式を作る rightVal <- makeWith right -- 右部分式を作る combine leftVal rightVal -- 演算して組み合わせる combine :: (Rational, String) -> (Rational, String) -> [(Rational, String)] combine left right = do op <- [add, sub, mul, div] -- 演算を選ぶ op left right where add a b = return $ op2 (+) "+" a b sub a b = return $ op2 (-) "-" a b mul a b = return $ op2 (*) "*" a b div a b = do guard $ fst b /= 0 return $ op2 (/) "/" a b op2 valOp strOp (v0, s0) (v1, s1) = (valOp v0 v1, "(" ++ s0 ++ ")" ++ strOp ++ "(" ++ s1 ++ ")")
君らがやってるのはトイプログラムとか頭の体操の類いだけじゃん たとえばゲーム製作の**の部分での利用とか、 会計ソフト製作での**の部分での利用とか、 Webサービス製作での**の部分での利用とか そういう実用的な部分での使い方はねーの?
いつからそんな話になったんだよww
jQueryなんかはListモナド的なものをうまく活用してるいい例かね Listモナドのアルゴリズムはわりと広範囲に応用可能だと思う 状態モナド的なものと比べて
>>218 なんで総当たりの実演をするのにそんな分野依存の知識を要求する例が欲しいんだ?
リストモナドは総当たりが必要な時にはいつでも使える、ということさえ知ってれば
プログラマなら応用できるだろ
まあでもはっきり言えばリストモナドは実用上そこまで重要じゃないと思う Maybeの方が10000倍大事
カードをプレイするためのコストが比較的複雑なTCGで、 手札のカードが場に出せるかどうかを判定するのにStateT a [] bを使ったような記憶はある
>>219 いや、だってさ
実用的なシーンではたいして使えない仕組みなんて、
あっても意味は無くないか?
何のためにプログラムしてるかと言えば、
アプリを作るためにしてる、というのが
まぁ一般の大半のプログラマの意見だと思うし
あと、俺の言う仕組みって、リスト以外のモナド内包表記のことね
>>224 いや、
>>208 に答えてリストモナドがどんな感じで動くかという話をしてるんであって、
リストモナドの存在意義を示すための例じゃないよ
>>225 お前は誰だよw文脈依存な書き込みするならコテつけろw
モナドの出番だな
>>226 だったらアンカーを適切に付けろ
こっちはモナドを勉強中なんだから何に対しての何の意見なのか全く分かんねーよ
で本題だが、すいませんでした、
>>216 は参考になります
これから他の言語と比較して理解を深めようと思います
リストがモナドである意味が分からないのか、 内包表記がリスト以外のモナドで使える意味が分からないのか、 それとも他に難癖付けてるのか レスが錯綜してて分からん
非リストのモナド内包表記の活用例というのは俺も見てみたい 実際使ったことがない
>>230 > リストがモナドである意味が分からないのか、
これはとても難しい問題だと直感したから、ひとまず置いておく。
> 内包表記がリスト以外のモナドで使える意味が分からないのか、
まずはこれを知りたい。
しかも、意味は難しいそうだから、まずは例を。
遊びにしか使えない例なら、そんなもので意味を探るのは無理だから、要らない。
233 :
デフォルトの名無しさん :2012/11/04(日) 23:02:36.40
>>222 >Maybeの方が10000倍大事
Maybeが?ほんまかいな
> ほんまかいな メイビー(キリッ
センスNothing
好きな書き方で書けば良いよ if y /= 0 then Just (x / y) else Nothing do { guard (y /= 0); return (x / y) } guard (y /= 0) >> return (x / y) [x / y | y /= 0]
いろんなライブラリ内で Maybe が使われているのを見るが、 [x / y | y /= 0] のような書き方を見ないのは何故だ?
モナド内包表記が復活したのって最近でしょ?
可読性もありそう
そんなキモい書き方するのなんてゴルファー()ぐらいたろ
モナドのインターフェースを持ってるから、
>>211 みたいに
do形式や内包表記さらにはアプリカティブファンクターの式なんかの好きな書き方ができるんだよね
>238 復活といっても GHC の言語拡張ですよ。 if y /= 0 then Just (x / y) else Nothing [x / y | y /= 0] どちらがプログラムの意味を理解しやすいかは読み手の経験によるでしょうが、 私は前者の方を使いたいですね。
内包表記をリスト以外に使うのがキモいのなら > 内包表記がリスト以外のモナドで使える意味が分からないのか なんて訊くまでもないよね。 だって使えるかどうかに関わらずキモいから使わないんでしょ?
>>243 >>323 > 遊びにしか使えない例なら、そんなもので意味を探るのは無理だから、要らない。
[x / y | y /= 0] これが遊びでないと言うのなら、
>>237 はどう説明する?
なぜ書籍ではこのような書き方が紹介されない?
俺は内包表記がリスト以外のモナドで使えるのは、意味なんて何も無いと思う。
最初は、モナドだとどんなものでも内包表記ができちゃう事を発見したから、
プログラマがなんか役立つ使い方をしてくれるだろうという安直な考えで、
リスト以外にも使えるモナド内包表記が作られたんじゃないかな。
設計者自身に明確な目的なんてきっと無いでしょ。
その後、たいして上手い使い方も無いまま復活した理由が不明だが。
結論ありきなら議論する意味なんて無いってだけだよ。 ていうか、書籍に書いてあるかどうかで判断したいなら こんなとこで他人に聞く必要もないだろ?
>>244 なんでリストで内包表記が使えるのは意味があるの?
do構文があれば要らないよね?
247 :
デフォルトの名無しさん :2012/11/05(月) 00:49:49.28
>なぜ書籍ではこのような書き方が紹介されない? そりゃ自分で書いてる通り、最近復活したからでしょ そのうちリスト以外でもイディオムが生まれてくるよ
>>236 :(;゙゚'ω゚'):内包表記って[と]で括られてるからリスト専用だと思ってた……
今までは偽りの人生だった……
本に書いてあって現場で使われているものにしか興味ないなら スレ間違えてるよな
エロゲの攻略法わかんなくてゲームの意義を問う というかZIPでくれと言い出す奴
サワーグレープセオリー
ghciだと:set -XMonadComprehensionsでモナド内包表記が有効になるのか これはなかなかおもしろいな
>>252 詳しい解説サンクス
それならPerl忍者が荒らすのも分かる気がする(´・ω・`)
>>249 じゃあ、本は無しにしようか。
現場に限ってもいいし、
何なら HackageDB に登録されているライブラリ内に限定してもいいが、
それでもスレ違いか?
プログラム言語において機能を実装するというのは、
使うことによってメリットがあると想定されるからだろう。
Haskell は実用もしっかりできる関数型言語を目指して生まれたのだから、
なおさらだ。
Haskell98 で言語仕様から消えたモナド内包表記が、
最近になってGHCの言語拡張として復活したのは、どういう意図があって?
モナド内包表記が欲しいと思っていた人たちは、
どういうシーンでそれが活用できると考えていたの?
その辺りが知りたい。
正直言って、
>>236 の例では恩恵が実感できない。
「好きな書き方で書けば良い」という理由だけで復活したとも思えん。
それでは Perl みたいじゃないか。
内包表記なんて長いコードに使うもんじゃない
(長くなるならmapなりfilterなりdoなり使うべき)
だから短いコードだから内包表記で書く意義が
分からないってワケじゃないだろう
ってことは、こっちは
>>254 様が納得する理由をエスパーしてやらなきゃ
ダメってことなワケだが、なんでそんなことしてやる必要あるの?
サーセン Data.Vectorで組んで動いたコードをData.Vector.Unboxedに切り替えようと思ったんすよ そしたら急にVectorはファンクタじゃないからfmap使えないよ Probable fix 云々ってクレーム来たんすけど どゆことっすか?ファンクタでしょ?
>>257 ありがと。
前者は単にモナド内包表記と同等の do 表記をいくつか例示してるだけじゃん。
誤解を恐れずに言えば、モナド内包表記の操作的意味論っぽいものを示してるだけ。
ただ、そのページに論文「Bringing Back Monad Comprehensions」へのリンクがあった。
こっちはざっと見たところ「現実的な問題提起 --> モナド内包表記による解決」
という感じで語っているような気がするから、実用的なことが書かれていそうだ。
これからじっくり読んでみるよ。
後者の方はこの論文と同名なんだが、同じもの?
至る所に訂正の跡があるのだが、最新版ってことかな?
どちらにしても、「Bringing Back Monad Comprehensions」
こういう情報が欲しかったんだ。
>>258 unboxed vectorは関手じゃないよ(腹が立つのは分かる)
関手なら fmap :: (a -> b) -> Vector a -> Vector b
が定義できなきゃならんけど、unboxed vectorだとb=Integerとかにできない
(Unbox制約を満たさないといけないから)
最近流行ってる関手って、そもそも何?
>>261 マジすか
複雑な事情っすね
実践よりもHaskell型システムの理解に的を絞ったサイトないっすか?
265 :
デフォルトの名無しさん :2012/11/05(月) 19:30:38.26
>>262 map を関手の一つと考えると、関手から自然変換まで簡単に理解できる
簡単に理解できる = 毎日30分定義とにらめっこして1週間ぐらい悩むと分かる
>>263 Functor クラスが関手のことなら、なにも漢字で書かなくてもよくない?
unboxed vector は Functor クラスのインスタンスじゃないから、
と言う方がはるかに分かりやすいというか、ストレートだと思うんだが
と感じるのは私だけ?
知らんがな
>>266 定着してる訳語があるのに横文字や片仮名を使うのは宗教上の理由でできんのです、ごめんなさい
女だ! このスレに女が紛れ込んでるぞぉーっ! 魔女を焼き払えーっ!
一人称を私にすると賢そうに見えるの法則
ん?
Functor クラスそのものは関手なの?
Functor クラスがたまたま持つ性質(種数やfmap関数など)を持つものが関手なの?
たとえば Applicative なども関手?
Functor クラス自身とそのインスタンスのみが関手?
Functor クラスそのもののみが関手で、そのインスタンスは集合の要素みたいなもの?
わけが分からなくなった・・・
>>271 一人称「私」なんて誰でも使うから、賢そうに見える要素にならないでしょ
>>273 そうだとすると、
>>268 の言う「定着してる訳語」っておかしくないか?
>>268 の言い方だと Functor の日本語訳が関手である、
と言っているように聞こえる
>>274 圏論でFunctorの訳語が関手だから、それ以外に訳しようがない
圏論でFunctorと、haskellのFunctorクラスは同じもの?
わかった 今後Haskellのファンクタの意味で関手といいたい場合 いわゆる関手 と書くことにしよう
>>276 HaskellのFunctorクラスのインスタンスはある種の(圏論的な意味の)関手(の対象部分)になってる
具体的にはHask圏からHask圏への関手
逆に、ある型構築子が(圏論的な意味の)関手になっていてもFunctorのインスタンスとは限らない
たとえば
>>258 のunboxed vectorがそう
>>278 じゃあ、HaskellのFunctorクラスを安易に関手と言うのは、
文脈によっては危険じゃないか?
どの文脈だと危険か正しく理解してる奴しか使えない訳語な感じがするが
>>279 もちろん混乱の原因になることはあるけど、
*Functorのインスタンスを関手と呼ぶ
のをその論法で禁止したら、
*Monadのインスタンスをモナドと呼ぶ
*Monoidのインスタンスをモノイドと呼ぶ
*Numのインスタンスを数値型と呼ぶ
あたりも言えなくなって不便じゃないか
単位元と結合律を保存する高階関数は関手 という理解は正しいでしょうか?
>>281 「恒等関数と関数結合を保存する高階関数」と言った方が良さそう
関手はFunctorではなくfmapじゃないのん?
>>280 なるほど、そう言われると、たしかに不便だな。
Haskell の話をしていると判りきっている時には
Monad のインスタンスはモナドと言いたい。
(個人的にはFunctorのインスタンスはファンクタと言いたいが)
でも、Haskell の話をしてるときに、いきなり圏論が姿を現し、
そのまま議論が進んでいくと、ややこしくならない?
そういうシーンをこのスレでよく見かける
271 名前:デフォルトの名無しさん[sage] 投稿日:2012/11/05(月) 20:04:44.17 一人称を私にすると賢そうに見えるの法則 賢くみられたいからHaskellやるという法則
賢く見られたいからHaskellって・・・ 賢く見られたいんならMITで博士号取るだろ普通
>>287 一度目はいいけど、二度やると冷める
もう止めた方がいいと思うよ
GHC 7.6.1 の ghci 上で Conduit が動かない
ghci 上で Data.Conduit系モジュールがロード処理されると、
エラーが出る。
Loading package conduit-0.5.2.7 ... linking ... <interactive>: internal error: R
_X86_64_PC32: High bits are set in 7fefb411866 for _close
(GHC version 7.6.1 for x86_64_unknown_mingw32)
Please report this as a GHC bug:
http://www.haskell.org/ghc/reportabug これはバグ?
俺英語書けなくてバグ報告できないんだが、詰んだかな
290 :
289 :2012/11/05(月) 23:10:49.65
あ、ちなみに ghc でコンパイルすれば問題なく実行できるから、詰んではないか でも色々実験して勉強しようと思ってたんだが、ghci 使えないとなると、 かなり面倒になるなぁ・・・
>>281-283 関手とはある圏の対象と射をもう一つの圏(自己関手の場合は同じ圏)に移すものだから、
Functorのインスタンスとfmapセットで関手と言うのが一番近い
>>286 =こいつ図星
こいつ
>>285 のレスに図星しすぎれレスしてやがる
だいたいのやつは必死に悔しくても反応したら負けっていう考え持ってるから食いつかない
こいつは食いついた正直者
>>290 たぶんWindows固有の問題
LinuxかMacを使うとか、Windowsなら仮想マシン上でLinux使えば、問題が出ない可能性が高い
この手の開発はUnix系メインでやっててWindowsはオマケのことが多いから、
細かいとこで目の行き届かない不具合があったりする
俺、Haskellぐらいしかまともに書ける言語ないんだが、 正直それはそれで非常に恥ずかしい思いをしている
○○をしたら負けとか偉いやつが言ったらすぐ真似をして
○○をしなくなるのが情弱
Matzみたいなのが「これから来る言語」 Haskellとか言ったら
すぐ真似して
Haskellしだすやつが情弱
>>286 =こいつ最高に図星
Haskellの話しようぜ
297 :
289 :2012/11/05(月) 23:45:16.42
>>293 ありがと
とりあえず勉強だけなら処理速度は要らないから、
vm player に linux 入れて、そっちでやってみるよ
実用度外視なんだから、偉いやつが言ったことをすぐ真似してHaskellやるのが正解 どうせネットで偉い人のマネする以上の教育課程が揃ってないんだから
教育してもらわなきゃプログラミングすら出来ないアホは まったく向いてないからリアル土方に転向したほうが良いよ?
侮辱がただの賛意表明になっているような
元からそのつもりだったのか?
いや、そういう文体には見えないなあ
要するに
>>299 はアホなんだろう
え?まじで教育が必要なの? 大学でも別にプログラミングなんて独学だっただろ? え?大学行ってないの?
>>298 は「教育環境揃ってない = 実用度外視」
と書いてるようにしか読めんのだが
教育されなきゃ実用的なプログラミングも出来ないアホは向いてないよ
話通じてないなあ・・・
自分の発言にあとから留保つけちゃってるし
まあ俺は
>>298 じゃないからいいんだけどさ
アホが偉い人のマネすべきってのはその通りだな 自分で考える脳みそ無いし
GHCはRuby以下の安定性
307 :
デフォルトの名無しさん :2012/11/06(火) 09:29:03.76
∧_∧ ( ´Д`) <みなさーん、お茶が入りましたよ~ / \ | l l | ..,. ., ., | | | _|。.:_::゜。-.;.:゜。:.:;。 ヽ \_ .。'゚/ `。:、`;゜:;.::.。:.:。 /\_ン∩ソ\ ::..゜:: ゚。:.:.::.。.。:. . / /`ー'ー'\ \ ゜: ::..゜:: ゚。:.:.:,。:.:. 〈 く / / ::..゜:: ゚。:.:.:,.:.:.:。:.:, . \ L ./ / _::..゜:: ゚。:.:.:,.:.:,.:.:.:, 〉 ) ( .::旦旦旦旦旦旦旦旦旦旦旦旦旦旦旦旦旦旦. (_,ノ .`ー'旦旦旦旦旦旦旦旦旦旦旦旦旦旦旦旦旦旦.
298 名前:デフォルトの名無しさん[sage] 投稿日:2012/11/06(火) 00:53:45.21 実用度外視なんだから、偉いやつが言ったことをすぐ真似してHaskellやるのが正解 どうせネットで偉い人のマネする以上の教育課程が揃ってないんだから 305 名前:デフォルトの名無しさん[sage] 投稿日:2012/11/06(火) 07:44:55.65 アホが偉い人のマネすべきってのはその通りだな 自分で考える脳みそ無いし
Matzってそれほど「偉いやつ」だっけ
Perl忍者最近見ないな
>>261 じゃあfmap的なことはどう実現したらいいんですか!?
>>311 Data.Vector.Unboxed.map
(////) ::
(////) :: Answer -> Shame
質問です。Writerモナドというものを知ったので、前から知りたかった 遅延評価される場合のたらいまわし関数の呼び出され回数というものが知りたくて以下のように書きました。 import Control.Monad.Writer tak :: Int -> Int -> Int -> Writer (Sum Int) Int tak x y z | x <= y = do tell(Sum 1) return z | otherwise = do tell(Sum 1) tak (fst(runWriter(tak (x - 1) y z))) (fst(runWriter(tak (y - 1) z x))) (fst(runWriter(tak (z - 1) x y))) これで動くは動くんですが、引数を色々変えてもカウントが高々3でした。 少し考えてみて、再帰で呼んだ結果のカウントを捨ててるせいだろうというのは分かったのですが 改善策が思いつきません。上手い書き方があったら教えてもらえないでしょうか。 また、もしWriterでカウントするのが無理だとしたらどうするのが定石でしょうか?
入門書のリスト内包表記にガードが使えるという下りを読んで、凄い衝撃を受けた。 もしかしてHaskellって、Prologよりも抽象度が高いのかも。 実際にプログラムを作るまでになれば、泥臭いこともいろいろあるんだろうけど。
>>316 関数の評価回数を知りたいだけでしたら、プロファイリングすれば簡単にわかりますよ。
コンパイル時に3つのオプション "-rtsopts -prof -auto-all" を付けて、
実行ファイルの起動時にRTSオプション "+RTS -p" を付ければ、
*.prof ファイルができるんで、それを読めばいいです。
prof ファイルの一番下の表を見てください。
1列目に関数名(変数も関数)、2列目にモジュール名とあって、
4列目の "entries" の項目が評価回数です。
例えば z を返すバージョンの tak 関数を使って、
main :: IO
main = do
let z = tak 3 2 1
print z
を上記のようにコンパイルして実行してできた prof ファイルを見ると、
tak の評価回数は 5 と表記されています。
(実際に手計算で let z = tak 3 2 1 を簡約すると、
確かに5回 tak 関数が評価されていることが確認できます)
プロファイリングの詳細は「本物のプログラマはHaskellを使う」
の第45回の記事を参考にしてください。
こういうことではなく、プログラムの中でカウントする仕組みを作るには、
という趣旨の質問でしょうか?
>>316 こうすればok
tak x y z
| x <= y = do
tell(Sum 1)
return z
| otherwise = do
tell(Sum 1)
x' <- tak (x - 1) y z ;変えた
y' <- tak (y - 1) z x ;変えた
z' <- tak (z - 1) x y ;変えた
tak x' y' z' ;変えた
>>316 がやりたいのは"遅延評価された場合"だからWriterだとマズイかも
>>318 すみません、書き忘れました。
仰る通りプログラムの中でカウントする仕組みを作るには、という趣旨です。
>>319 それをやると遅延評価の場合と結果変わっちゃいませんかね?
322 :
319 :2012/11/08(木) 21:57:07.69
すいませんでした。orz snd(runWriter(tak 100 50 0))とかやると糞時間かかりますね。 あとここちょっと違ってます。 | x <= y = do tell(Sum 1) return y; 変えた
323 :
319 :2012/11/08(木) 21:59:19.20
>>316 Haskellは純粋だから、評価順序によって違う値を返す関数は書けない。遅延評価を前提とした呼び出し回数を数えるには、明示的に遅延評価をエミュレートする必要がある
import Control.Applicative
import Control.Monad.ST
import Data.STRef
thunk :: ST s a -> ST s (ST s a)
thunk action = do
ref <- newSTRef Nothing
return $ do
cache <- readSTRef ref
case cache of
Just val -> return val
Nothing -> do val <- action; writeSTRef ref (Just val); return val
tak :: STRef s Int -> ST s Int -> ST s Int -> ST s Int -> ST s Int
tak counter ex ey ez = do
modifySTRef counter (+1)
x <- ex; y <- ey
if x <= y
then ey
else do
a <- thunk $ tak counter (pred <$> ex) ey ez
b <- thunk $ tak counter (pred <$> ey) ez ex
c <- thunk $ tak counter (pred <$> ez) ex ey
tak counter a b c
takCount :: Int -> Int -> Int -> Int
takCount x y z = runST (do
counter <- newSTRef 0
_ <- tak counter (return x) (return y) (return z)
readSTRef counter)
325 :
324 :2012/11/08(木) 22:35:38.37
あれ2chの仕様変わったの… 実体参照は適当に戻してね!
>< (//)
>>324 ありがとうございます、言い切ってもらえると参考になります。
今すごいH本をやっと読み終わろうかという段階なので正直難しいですが、
そのうち理解できるように精進します。
>>325 インデントは全角空白派が大勝利で悔しい
仕様変更の経緯のわかるスレとかあればどなたかプリーズ
ランタイムのGCっていつ行われるの? アイドル時にやってくれる?
-threaded付けてるならアイドル時にもやる
>>330 今入力待ちで暇だなー……
あ、もう要らない領域あんじゃん
スカベンジスカベンジ……
こうはならないの?
今日 -XTransformListComp なるものの存在を知ったんだけど これって需要あるの? {-# LANGUAGE TransformListComp #-} import GHC.Exts (groupWith) xs = [1,3,4,5,7,9,10,11,13] ys = [x | (x,y) <- zip xs [1..], then group by x-y using groupWith]
conduit-0.5.2.7 を使っています。 ライブラリドキュメントの Data.Conduit にチュートリアルがありますが、 sourceList [1..10] $$ fold (+) 0 これの結果がどうなるか調べる方法を探しています。 チュートリアルでは、恐らく ghci 上で上記の式を評価して、 55 という数字が標準出力に出力されている様子が描かれていると思いますが、 私は Windows で GHC 7.6.1 を使っているため、ghci で conduit が使えません。 試しに次のようにしてみても、コンパイルエラーが出ます。 a :: GSink Int IO Int a = sourceList [1..10] $$ fold (+) 0 main :: IO () main = print a -------------------------------- No instance for (Show (Pipe l0 Int o0 u0 IO Int)) arising from a use of `print' -------------------------------- どうすればチュートリアルのように sourceList [1..10] $$ fold (+) 0 の評価結果を数値または数字で得る、 あるいは標準出力へ出力することができるでしょうか。
336 :
355 :2012/11/11(日) 16:02:03.19
>>355 これでできました。
a :: GSink () IO Int
a = sourceList [1..10] $$ fold (+) 0
main :: IO ()
main = do
a <- runPipe a
print a
なんか不親切なチュートリアルですね。
最初の sourceFile の例ではちゃんと runResourceT があるのに。
337 :
335 :2012/11/11(日) 16:02:48.97
すいません、レス番間違っていました。
>>335 です。
皆さんの思うハスケルの他の言語に対する優位性はなんですか?
conduit-0.5.4ならsourceList [1..10] $$ fold (+) 0で大丈夫だった それよりWindowsのghc7.6.1ではghci上でconduitが使えないというのが気になる
>>339 7日に 0.5.4 が公開されていたんですね(その前日にDLしてました)
今 0.5.4.1 にアップデートして、
sourceList [1..10] $$ fold (+) 0 の値を print してみましたが、
コンパイルエラーでした。
大丈夫だったというのは、どのようにやったのでしょうか。
>>338 普段感じる利点はこのあたり
大域的な型推論
直和型が簡単に表現できる(CのunionやOOPLのsubtypeと比べて)
パターンマッチ(網羅性チェック、分岐と値の取り出しを同時に行える、など)
副作用のある箇所が型により分離される
(LLとかよりは)実行速度が速い
ほむほむ。
344 :
341 :2012/11/11(日) 19:11:52.88
>>339 あぁ、分かりました。
(sourceList [1..10] $$ fold (+) 0) >> print
こういう事ですね。
これならできました。
もしかして、これならアップデートしなくてもできていたかも知れません。
ところで、conduit を 0.5.2.7 から 0.5.4.1 へ
"cabal install conduit" でアップデートしたのですが、
ライブラリドキュメントの方はこれでは更新されないのでしょうか。
(デフォルトなら ・・・/AppData/Roaming/cabal/doc/index.html
にインストールされるものです)
ドキュメントの表記の方は 0.5.2.7 のままなんです。
345 :
341 :2012/11/11(日) 19:18:31.91
>>344 誤 (sourceList [1..10] $$ fold (+) 0) >> print
正 (sourceList [1..10] $$ fold (+) 0) >>= print
ライブラリドキュメントの方はトップの目次のところだけでなく、
内容も、例えば Data.Conduit のページの上部にも
"conduit-0.5.2.7: Streaming data processing library."
と書かれていて、更新されていません。
こういうものなのでしょうか。
Cabal のパッケージのバージョンは、
(規則に従うなら)4つ目の番号の変更は、
互換性は保っているがAPIが変更されている事になるので、
ドキュメントも変更しないとまずいような気がするのですが・・・
ghciで λ> sourceList [1..10] $$ fold (+) 0 って入力しただけだけど 省略 >>= printと同じ事か ドキュメンテーションが更新されないのは多分haddockのバージョンとghcのバージョンが違うから生成に失敗してるとかが考えられる
347 :
341 :2012/11/11(日) 20:46:24.73
>>346 > 省略 >>= printと同じ事か
なるほど、たしかに。
> 多分haddockのバージョンとghcのバージョンが違うから
haddock.exe は ghc 7.6.1 に元々入っているのですが、
これが違うという事でしょうか。
ちなみに、ghc の bin ディレクトリには haddock.exe とは別に、
haddock-7.6.1 という名前の謎のファイルもあります。
(バイナリエディタで見てみると、形は実行ファイルの様ですが)
どうも、ghc 7.6.1 は謎の挙動かちらほらとありますね・・・
インストールした直後にcabalでconduit入れた時になんかhaddockのバージョンがおかしいって警告出たから cabal install haddockで入れなおしたらconduitのドキュメント作ってくれるようになった これはcabal/binにhaddockがあるからそっちが優先されるのが原因だけど
>>342 Javaのような言語で書かれた業務アプリ、ドカタの世界にもこれから進出してきたりしますかね
Javaで書かれた商用ソフト見たことがない ハードについてるドライバは何度かある
>>351 俺はひとつだけ知ってる
astah*
Haskell で書かれた商用ソフトってあるんかな
うちは社内ツールではあるけど
そういえばperlやjavascriptで書かれた商用ソフトも見たこと無いな。
コンパイルできない言語ってソースをそのまま売ることになると思うけど、それって商売になるのだろうか
ソースを売れっていうのは普通にあるでしょ
Android 用有料アプリは Java で書かれた商用ソフトである という認識でいいのか?
357 :
341 :2012/11/12(月) 22:44:21.87
>>348 Haddock を cabal install で入れてから、
cabal install --reinstall Conduit してもダメでした。
(ghc\bin ディレクトリより cabal\bin ディレクトリの方が
優先的に検索されるように設定しましたが・・・)
cabal\bin の Haddock.exe を ghc\bin へコピーしてみましたがダメでした。
よく見たら、cabal\doc 内には conduit-0.5.2.7 と conduit-0.5.4.1 があったので、
conduit-0.5.2.7 の方を適当にリネームして、index.html もリネームし、
この状態で cabal install --reinstall Conduit してみたら、
ドキュメントの目次やコンテンツの Conduit のバージョンが
ちゃんと 0.5.2.7 に更新されました。
Haddock の更新は必要条件だったのかよく分かりませんが、
とりかくドキュメントが正しく更新できて良かったです。
お騒がせしました。
何だよ type family Mutable v :: * -> * -> * Mutable v s a is the mutable version of the pure vector type v a with the state token s って リワハじゃ習わなかったぞ
トップレベルの関数の型宣言で Unbox a => ……としたとして letやwhereと続けた内部関数にも型宣言をつけるとします このとき、その宣言でもトップレベルの a と同じ型を指定する為にはどうしますか?
関数を生成する関数 :: Unbox a => 内部関数の型 -> トップレベル関数の型 トップレベル関数 = 関数を生成する関数 内部関数 where 内部関数 = …
>>360 Lexically scoped type variables の事かな
関数内使わないほうが読みやすく感じる whereって必要ですか?
s/関数内/関数内の関数定義/
さすがに一時束縛なしはハードモードでないの? letのほうが読みやすいということもあまりないでしょう
関数内関数は自由変数が多くて理解するのが難しいです トップレベルの関数に持ち上げてしまって、モジュールの機能で外部からは隠して、 自由変数になっていたところは明示的に引数として渡すほうが良いのではないかと
ケースバイケースなんで whereが要る要らないの話にはならないと思う
それはね、長い関数が読み難いだけなんだよ
自由変数の追いにくさと引数渡しの煩雑さを天秤に掛けた結果、 多くの人はwhereを大量に使うことを選択している 何を読み難いと感じるかは個人差が大きいから、 多数派と違う感性を持ってると生きづらいね という結論が嫌なら、「読みやすく感じる」よりも客観的な論拠を挙げてください
プログラムは書くことより読むことのほうが難しいし読むことの方が多い whereはプログラムを書きやすくできるが読みにくくする whereを使うのは甘え
>>366 関数内のスコープに限定するより
モジュール内スコープに広げた方が読みやすい?
頭大丈夫?
>>370 頭の中で、読みにくいコードを読みやすいコードに書きかえればいいだろ
それができる人は読むことより書くことが多い
>>363 末尾再帰覚えてない人かな?
where使わず書いたら、引数の数が違うだけで同じ機能の関数が沢山出来上がってしまう
sum ns = sum' ns 0
where
sum' [] v = v
sum' (n:ns) v = sum' ns (n + v)
whereが無ければsum関数とsum'関数の両方が関数を使う側に公開されるか、末尾再帰関数作る度にモジュール書き換えが必要になる
sum ns = let sum' [] v = v sum' (n:ns) v = sum' ns (n + v) in sum' ns 0
>>372 君、仕事でプログラム書いたことないでしょ?
どっちも同じだと思えば両方読めるようになるのに、ノイズが気になって読めない ノイズが少ない方が優れているといってノイズばかり見ている 雑音を無視したら優劣の概念がなくなってしまう 優劣を気にするとデジタルが読めなくなる
仕事でHaskell使った事ないわーw
そもそも、お前がいう「仕事」って、受注開発(の賃金労働)のことだろ? 自分で作ったサービスで始める仕事(ビジネス)だったら、言語はなんだっていいんだよ。 ドヤ顔で「仕事でhaskell使ったことないわ」とか恥ずかしすぎるわw
会社に小遣いもらってる分際が偉そうに、と思うね。
仕事で戦車使ったことないわ
ああ、Haskellerってこういうのばっかなのね
まだ平和な方のスレですよ
>>366 トップレベルにリフトすれば自由変数が減るかのような錯覚はどこからきた?
関西型プログラミング言語
なんでやねん
Haskell使う案件ってどこに行けばあるんだろうな。
Haskell を使う事案が発生しました
>>387 実際にどのような仕事があるか知らんが、
君には "haskell commercial OR industry" でググる知恵はないのか
ちえをくれ
おいおい、haskell使った仕事が貰えないなら、 自分で始めればいいだけだろ。 仕事を作るのも仕事のうち。
ま、自分が知らないからって無いで押し切るのは 一つの生き方ではあるわな
>>392 いや、維持保守を引き継ぐ人たちがHaskell使えないのに
Haskellのソースを残すわけには行かないだろ。
Cに変換して納品
>>393 本当に知らなくていい事なのかを考えもしない手合いは厄介だけどな。
>>394 仕事にHaskellを使う事の利点を、アピール出来なけれぱそうなるな。
データマイニングでHaskell使ってる人なら知ってるけど零細だからなー…
仕事があるかとかどうでもいいわ そんなに仕事がしたけりゃJavaでも書いてればいいじゃん
黒板言語未満がここに立証されました
すどーさいえんてぃふぃっくめそっど
今 Haskell でデータベースを操作するプログラムを書くのに 最も洗練されているライブラリは何でしょう? やはり今も昔も haskelldb が一歩先を行く感じでしょうか。
Data.List.partition :: (a -> Bool) -> [a] -> ([a], [a]) これを次のいずれかのような型にしたい f : (Monad m) => (a -> m Bool) -> [a] -> m ([a], [a]) f : (Monad m) => (a -> m Bool) -> m [a] -> m ([a], [a]) どちらでもいいのですが、スクラッチビルドすることなく、 どうにか元の partition を使って f を作れないでしょうか。 [FilePath] を System.Directory.doesDirectoryExist と partition を使って ディレクトリとそれ以外のものに分けたい、というのが動機です。 ちなみに、Control.Monad.liftM2 partition だと、 Monad m => m (a -> Bool) -> m [a] -> m ([a], [a]) という型になって、 これでは目的を果たせませんでした。
無理やりっぽいやり方だけど f pred xs = do{ rs <- mapM pred xs; let (ys, zs) = partition snd (zip xs rs); return (map fst ys, map fst zs); } なら目的は果たせそう
paritionM で検索すると同じようなことを考えてる人がいる filterM なら存在するけど partitionM はないんだよな
409 :
デフォルトの名無しさん :2012/11/23(金) 01:03:35.06
Haskellで求人募集してphp組んでもらいます
Haskellでphpのコード自動生成してたのを思い出した
>>394 保守?
お前の仕事はそれしかないのか?
>>395 納品?
twitterやfacebookあるいはwindowsみたいに
自分でアイデアを実現して商売始めてやろうという気概や野望はないのか?
人に言われたことしかやらないような雑魚はhaskellやらなくていいよ。 haskellは受注開発向きじゃないんだから。
受注開発のソフトハウスなんて指示待ち君の会社バージョンじゃんw
うわぁ…。
何に感化されたのやら。
Twitter,Facebook,Windows。どれも、既に類似品があったのに成功した例だな。アイデアと言うよりは、マーケティングの上手さ。
何も終わっちゃいない 始まってすらない
いつになったら妄想野郎以外にも使ってもらえるようになるんですか?
バカが張り付いてるな
受注開発してる奴は底辺ドカタ。 底辺ドカタが言語を語るなんて滑稽。君達に選択権は無い。
どうせ学生ならHaskellみたいなものよりもAgdaとかCoqみたいなものに傾倒して欲しい
モノで優越感を得る事にはまり込んだヒトの末路
安全性に傾倒するヒトは、利益の多さではなく損害の少なさを評価する 社畜よ、これが安全だ
赤字やん
>>424 残念。趣味では好きな言語を選択して楽しんじゃってまーすw
ベロベロバーw
ベロベロバーっておっさんっぽい
安全性が本当に信じられるならバグ出したら自分の死体が東京湾に沈むような仕事でも請けられる筈
28歳のおっさんでスマソ
巷の関数型言語を安全とか言う人達ってJavaや動的言語のやりすぎで危険という感覚が麻痺してるんだろうな ハードウェア関係の人から見たらHaskellすら危なくて触る気しないぐらいなんだろう
安全じゃないのはプログラムを作る人間の方 実行もテストもしないやつとか
どうでもいい
haskellは全力で普及を拒否する。
理由は
>>394 みたいな雑魚がよってくるから。
437 :
デフォルトの名無しさん :2012/11/23(金) 11:20:18.06
本物のプログラマはhaskellを使う
Haskellの意志?
遺志?
>>436 関数型言語が普及するためにお前みたいなのが絶滅するべきなんだな。
日本のSI業界において受注開発を否定するわけには行かない。
受託
複数のプログラミング言語を日常的に使いこなしてる者は、地球人口の1%も居ないだろうに、その中での普及率を気にする人って、皆と同じでないと不安なだけ?
Haskell作ってる連中は、安全なんて言ってないんだが、誰かが作った煽り文句に踊らされるのは常に居るからな。
>>427 大企業は、ヘマを減らす事で成長するんだぜ?
445 :
406 :2012/11/23(金) 15:52:31.69
>>407 >>408 アドバイス、あれがとうございます。
どうも、zipWithM みたいに標準ライブラリ内の高階関数を
partition に適用するだけでは作れないみたいですね。
諦めて、partition のソースをそのまま拡張して自作することにしました。
import Control.Conditional (ifM)
partitionM :: (Monad m) => (a -> m Bool) -> [a] -> m ([a], [a])
partitionM p xs = foldM f ([], []) xs
where f ~(ts, fs) x = ifM (p x) (return (x:ts, fs)) (return (ts, x:fs))
というか、諦めてないから自作するんだよね 本当に諦めたらfilterを使う
プログラマーは世界に二千万人
シェルスクリプトとC言語の両刀使いは普通にいると思う。 あと、C言語にインラインアセンブラとか。
新入社員の中にJavaは習ったけどC言語をやったことがないという人がいてビビッた 本屋で情報処理の試験の本をよくよく読んでみたらもC言語が必須じゃなくてビビッた
それは当たり前だよ もう今の時代javaの方が手軽だし
Cは速すぎるからCの上に更に別の言語を作る余裕があるんよ Javaには余裕が足りない
お前Scala知らないだろ
インタプリタしか作れないバカを許容する手軽さがほしい
>>452 まともなJavaエンジンなら、充分早い。
問題は、未熟なJavaプログラマーが書いたコードは大抵遅い、ということ。
この問題を避け、尚且つJava資産を活かすために、Java以外の言語で書いたソースを
Javaソースに変換・コンパイルする手法も使われている。
処理系の速度を気にする職場って何作ってるんだろ 保守が1.5倍楽になるなら、速度半分になってもいい職場がほとんどだと思う 速度っつっても、ディスクアクセスとネットのボトルネックから見ればもう処理系の差なんて無視できる 速度を基準に言語を選ぶのは、画像処理屋と組み込み屋だけではなかろうか
>>457 シミュレーション(数値計算)屋も入れろよ
>>458 数値計算屋さんは速度ではなく、ボスがFortranかCのどっちで教育を受けたかで言語が決まる
企業SNSはFacebook使いましょう 業務システムはパッケージを買いましょう ネット通販サイトは楽天を使いましょう こんな時代ですよ
SIは先細り。 ITの行く先は、今度はサービスを作り出す側だ。
企業も不景気でカネが無いから、 「現在の業務プロセスがこうなので、それに合わせてシステムを作ってください」 から 「システムが新しくなったので、業務プロセスを変更します」 という風に変わっていくだろうね。
どうだろうなあ 社内のシステム作ったり、政府のシステム作ったりしてたが、 到底WebアプリやExcelマクロなどが無くなるとは思えないが
こういうスレで妄想述べてる奴はなぜか知らないが 海外のWebサービス企業と日本のSIerを比較するからな。 グーグルと富士通ではビジネスモデルが違いすぎるだろう。 比べるならオラクルやHPを出さないと。 そして、googleやamazonに対抗するWebサービス企業は楽天()などなんだが、 日本もこっちを主流にするって?
本物のサムライは、忍者や戦艦と比較されても文句を言わない 妄想だけど
>>465 Oracleはパッケージ系で、富士通は受託開発系。
>>464 お前の仕事は似たような大企業ばっかり相手にしてないか?
最近では各社毎のシステム開発がいかに無駄か知れ渡ってきている。
それに加え、不景気のせいでリストラや構造改革が強いられるようになった。
そこで、フットワークの軽い中小企業では、
実用レベルになってきた既製のWEBサービスやパッケージを利用することで、
汎用的な人材確保やシステム開発コストの削減等ができるようになった。
システムを組織に合わせるのをやめて、
組織がシステムに合わせるようになったんだよ。
>>465 >そして、googleやamazonに対抗するWebサービス企業は楽天()などなんだが、
>日本もこっちを主流にするって?
google、amazon、楽天が並んでたら、普通はamazonを選ぶだろ。
官公庁では、差し押さえ物件の販売なんかはヤフオクを利用してる。 流れはガラパゴス的な独自仕様のシステム開発から既存のサービスを利用する方に流れが変わってきてるんだよ。
>>469 俺はそのどれかに就職していいと言われたらgoogle選ぶけど
>>470 官公庁の利用してるサービスはヤフオクだけなのかよw
そもそも官公庁自体のHPが数限りなくあるわけだがw
確かにWEBページを作る仕事はなくならないと思うよ。 でも、それはバックグラウンドで動く複雑なシステム抜きなら簡単な仕事だし、 どう考えても今より需要が伸びる余地は無いと思うよ。
「今よりは伸びない」かもね 法律は毎年増えてるわけで、減りもしないけどw
勘違いしないように言っとくけど、 「バックグラウンドで動く複雑なシステム」 を作る仕事は確実になくなっていくと思うけどね。
え?
ごめん、修正。 × を作る仕事 ◯ を作らされる仕事
世の中の流れはガラパゴスから共通仕様に変わる。 受注開発からパッケージに変わる。
>>475 むしろそういう仕事こそ、汎用パッケージではどうにもならないので
無くなるとは思えない
特殊な法律やら仕組みにあわせてシステムをカスタマイズする仕事は最後まで無くならないよ
まあそういう話は表計算ソフトやらワープロソフトが現れた頃から言われてるよな これからはbasicでプログラムを組む時代じゃないとかw しかし、結果はご覧の通り、basicでマクロを組んでいます。
>>479 法律って日本全国統一だよね。
パッケージなら修正してアップデートすれば対応できるわけで、
個々のガラパゴスシステムを修正して回るより遥かに低コストでできるよね。
>>481 その日本全国統一のパッケージを作る仕事がまずなくならないなw
さて、法律ってどのくらいの量あるでしょうか?
そもそもシステムが気持ち悪いぐらい複雑怪奇に成長してコストもうなぎのぼりになって、 それが命取りになって逆に利益や業務を圧迫するのは、 システムを業務プロセスに合わせようとするからなんだよ。
でもそれも限界あるよね 国会で法律が決まったらシステムがあわせるよりしょうがないしね 「システム簡単だからこういう法律にします」でなんでもかんでも決められれば良いけどw
>>484 わからない?まず、全国統一の法律にあわせて
カスタマイズする必要があるわけで
>>486 話が噛み合ってないな
パッケージでどうやって法律に対応するの?
ちなみに法律は地方によって異なります。
>>488 俺も噛み合ってないと思う。
パッケージを修正してアップデートすればいいだけだろ?
>>490 「パッケージを修正する」仕事が無くならない
そもそもパッケージでは対応できない
アップデートしたらしたで、互換性の問題とかいろいろ出るから
それを修正する必要も出てくるし
>>491 無理無理w
if文使わなきゃ複雑な条件設定できないよw
そもそも、システムで地域ごとに違う部分ってそんなに多くは無いぞ。 細かい部分をカスタマイズできる余地を残したパッケージにすれば良い。 カスタマイズはSIerがやればいい。
>>492 パッケージを作ったり修正する仕事をなくす必要がない。
俺はそれを批判したことは一度も無いし、むしろ受託開発より伸びしろが大きいと思ってる。
>>494-495 そういうパッケージを受託開発で作る仕事があるだろw
で、細かいことに対応するとなると汎用性は犠牲になり、
新たなシステムがまた必要になる
既存のパッケージではもちろん無理
あるというのなら「あらゆる法律に基づいたシステムに対応するパッケージ」とやらの具体名を教えてくれよ
国会、裁判所、大蔵省から財務省、県庁やら市役所やらなんやら、あらゆる省庁の
システムに対応したパッケージがあるとでも?
なんのことだよマジでw
>>493 if文?
もちろんどんなソフトでもif文は使うと思うが、
それがどうした?
>>497 そうかそうか、どんなソフトでもプログラミングの仕事はあると
そういうことでよろしいか?w
>>496 >そういうパッケージを受託開発で作る仕事があるだろw
さらに層が分厚くなってないか?w
>>499 まあ、今でもSIerの仕事はそういう仕事なんだけど
ある程度特化してるから「パッケージ」と呼ぶかどうかは微妙だが
結局、パッケージと呼ぼうが呼ぶまいが、汎用性を工夫しようがしまいが
限界があるので似たような仕事は絶対無くならない
>>498 そうだが、無くなると言った覚えはないがw
Hask…いや、何でもないです
>>500 一部のコアシステムでは各社毎のチューニングが必要だからその通りだが、
簡単なところから汎用品を積極的に利用しようという動きがあるのは確か。
受託開発はさらに低い層の仕事になって、利益も成果物の質も下がるだろう。
知っての通り、受託開発では自由がない。
Haskell使いたくても使えないんだよ。
だったら、先細りでこれからどんどん薄利多忙になる受託開発なんか辞めて
思い切って自分で事業始めちまえばいいんだよ。
どんなに粋がってもここでSIer見下してるHaskell基地外がニートであることに変わりないわけで。 Hasukell自体はいい言語なので良識あるエンジニアの下で もっと普及してほしいね。
>>504 ニートほどよく他人をニート認定するよね。
自分がニートだっていうことにコンプレックスがあるから?
Haskellは実験場だから普及しないほうが良い。 普及させるならocamlとかで良い。
>>505 なんかぼろ糞に叩かれてるSIerの元受だからだよ。
>>506 HaskellっぽいシンタックスのOCamlがあれば
絶対それ使うわ
>>505 そのレス、自分がニートだって主張になってませんか。
>>509 ニートの話なんかしてないのに、唐突にニート認定とか、
自分がニートであることがコンプレックスで、
「ニート」という言葉が普段から頭にこびり付いている人間としか考えられないわ。
つまりF#最強ってことですかね?
それはOCamlっぽいC#だろうが > F#
MS言語はお断り
完全にクリーンなアカデミックオープンソース土壌で育った言語でないと信用しない
客観的に見て、SIerは下り坂まっしぐらだろ。
スルガ銀行の一件をみてもね
どうでもいいからここでやんな
元はといえば受託開発でHaskellが使えないっていう話だったよな? Haskellの使い道について語るのにHaskellスレを使って何が悪い。
思ったんだけど、 なんで勘定系
>>517 なんで勘定系システムって、各行毎に独自に作ってるの?
どの銀行も窓口があって、ATMがあって、ネットで取引できて、
っていうインターフェース部分はほとんど同じなのに。
全銀協
>>521 サーバセンターがアメリカの同じ場所にあるというオチまでついてる
Haskell使いって、このスレにいるような奴ばっかなの? きんもーっ☆
>>525 2chで世界が判ったような気になり始めたら、色んな意味でヤバい。
>>521 勘定系のうち、預金勘定元帳については銀行間で大差はない(はず。以前関わったがブラックボックスが多かった。)
金融商品関連まで含んだ部分については、当然、外部に教えたくない所がある。
問題は、銀行合併の時。
”どこに合わせるか”が政治的に決まるので、現場泣かせ。
>>526 世界のことを知っている人なんてこの世に一人もいないw
世界を知った気になっている人はネラーに関係なくすべてやばいw
530 :
511 :2012/11/25(日) 04:59:01.06
じゃあ俺まじやばい「世界が崩壊して再建に尽力する神託を得る」夢ばかりみている零場弐の世界観だよく利く薬はないものか
(´・ω・`) / `ヽ. お薬増やしておきますねー __/ ┃)) __i | / ヽ,,⌒)___(,,ノ\
2chに限らず、ネット上のhaskellerは大抵キモいよ
ネット上で活動していないHaskellerなんているんだろうか
本気でそう思ってるのか
きもい言われて動揺する情弱はすぐ消えるし べつにきもくていいんじゃね?と思ってるやつしか残らない
豆腐メンタルも情弱扱いなのかおっとろしい世の中だ
>>527 銀行系はまだCobolを使ってるのだろうか…
自分がわからない言語のスレにいつまでも粘着するキチガイはヤバいよ
そういう妄想するようになったら終わりだな
>>537 窓口業務にデータを提供するシステムの一部は、ObjectCOBOL系に移行。
年次処理などの、めったに使わない&過去遡及処理しないものは、前年のをコピー後、修正したりするから、昔のCOBOLが健在。
聞いた話では、欧米の金融系の一部で、商品開発・メンテナンスにHaskellを使ってるそうだ。
何に使うというと、既存商品のルール整合性チェック(商品内、商品間、規制・法律との照合)、新商品開発(既存と同様)。
ただ開発途中で、既存商品中にルール矛盾がみつかって、回避策(万一、訴訟で矛盾を突かれると困る)が出せなくて例外処理を入れたりするとHaskellでやるメリットが薄れるので、Haskell適用前にビジネスルールとして整理する方が合理的かも。
まあこれは他言語でシステム組むときも似たようなもの。
顧客にヒアリングしていったら、客自身も意識していなかった未整理・矛盾点が出て来て、作業担当に聞いたら、”自前のExcel計算結果と都度差し替えてました”なんて事もあるから。
くそ! 騙された! <$> って $ みたいに 『以降右側全部を括弧で括る』みたいに扱えないのか! f <$> (…) こうしないと駄目なのかよ! 驚き最小の原則に反してるじゃないか!
f <$> mx <*> my <*> mz が f <$> (mx <*> my <*> mz) と解釈されるよりはマシ
<●> <●>
<^o^>
>>540 会計計算と飛行機のソフトウェアだけはHaskell使わないでほしいです
C++やJavaよりマシ
飛行機は知らんけど会計計算なんて得意分野だろう
ここはひどいインターネッツですね
飛行機は緊急事態の一瞬にGC稼働とかは困るよね
CVR/FDRの保存領域が減ったときにGC発動か 胸熱
リアルタイムシステム向けのgcレスな実装とかもあるんだろう多分
クロージャが包んでる環境から参照されてるメモリ領域は 寿命が確定できないからGCで管理するしかないんじゃね? というか、関数型言語の処理系がほぼどれもGCを持ってるのは、 高階関数とレキシカルスコープを認めると 自然とそういうクロージャが出現してしまうからだと思ってるんだが、そうでもない?
そこは線形型とかリージョンとか色々使って何とか頑張って欲しい
クロージャを含むナニカを取得したスコープの寿命と同じでいいんじゃないか
最初に大きめの領域確保しといて、その領域に読み書きすればGC発生しないだろ。
無限にリソースがあればGC不要
そりゃあ確かに、1+1=3ならばのりピーはアメリカの大統領だけどさ。
だか待って欲しい。
x+y=xy と定義するなら 1+1=11 で 3 になる
>>556 そういう意味じゃない。
Javaじゃ普通の技術なんだがな。
RTSJとかあるもんな 5年前はPRECが来る!とか言われてたけどその後どうなったかしらん
Javaでプログラミングしてる飛行機にも乗りたくない
このスレレベル低っ
命に関わるような社会インフラで高品質を要求されるプログラムは、未だにアセンブラでコーディングされているという圧倒的現実
しったかすんじゃねえよ 大多数はラダー言語だよ
>>565 想像で書いてるんだろ?
レベル低いわぁ
>>567 継続性と互換性重視だから、ずっと同じ言語(つまりアセンブラ)でソフトを更新し続けてる
少しマシな場合だと、高級言語のコードの中にいきなりアセンブラのコードの羅列が登場したりする
団塊の世代が退職すると同時にアセンブラ技術者が職場からいなくなって、マジで危機的状況になってる
日本に限らずインフラのソフトは先進国ほど危険な状態
>>568 そんな話は聞かねえな。
あったとしても、よっぽどローカルすぎる話。
現役でソースファイルの中身がアセンブラなのは鉄道と交通と航空とATMくらいだから気にしなくていい
2000年問題のときにアセンブラコードの海から2桁の数字を検索しまくったのはいい思い出 Haskellだったら一瞬で終わったか、発狂してたか、どっちかだな
573 :
デフォルトの名無しさん :2012/11/29(木) 11:04:53.67
>566 死んどらーですね判ります
一周回ってHaskellでアセンブリエミュレータ作ってる
複雑なことをしにくく、余計な機能を追加しにくく、文字通りコードと状態をワンステップごとに追ってデバッグできるので、アセンブリ言語は信頼性が高い むしろ、信頼性が高すぎる そのため、一度完成してしまったら、容易に置き換えることができない
>>570 鉄道のシステム開発やってた知り合いがいたが、
Prolog使ってるって言ってたぞ。
時刻表やスジ屋の開発ならともかく、少なくともPrologで電子制御されてる電車には乗りたくない
駅すぱーとの開発か
アセンブリ言語だけで全部作ってデバッグ完壁にできるだけの労力が投入できるなら 他の言語使っても同等以上の信頼性得られるよね アセンブリ言語で速度じゃなくて信頼性を売りにするとかありえないよね
>>579 ヒント: 高級言語は処理系と言語仕様にも重大なバグがある
工作機械とかのマイコンやOSを独自開発してHaskellでシステムをプログラミングしたいときは、Haskellのコンパイラを作るのだろうか だとしたら、せめてTRONのHaskellくらい誰か作ってほしい
>>580 そうかも知れないし、
一方で、長ったらしいアセンブリコードにも重大なバグがある(かも知れない)。
どこにバグがあるのかテストしてみないとわからない。
Haskellみたいなオープンソースの処理系なら、
処理系にバグがあるなら処理系のコードを書きなおせばいいだけのこと。
そして、そのフィードバックがコミュニティにとっても有益だし、 Haskellを使う人や組織が、お互いがフィードバックし合えば、 すべて自社開発するよりはるかに効率的に利益が享受できる。
300万円もらって我々が選んだ高級言語でプログラミングしたけど、我々が変更不可能なハード(アセンブラ)ではなく高級言語の仕様にバグがあったため、プロジェクトが頓挫しております しかし言語のコミュニティにとっては有益なので我慢してください
脳内お花畑っすなあ
組み込み屋から見れば、コアダンプしたときに、ダンプファイルの一辺がコードのどの部分に対応しているか分かれば言語は何でもいい
本物のプログラマはコアダンプを読める
むしろ、組み込み屋さんは高級言語でプログラミングしようとし続けてきた しかし、ハードが不統一なため(特異なハードだから売り物になる)、その不統一な部分を言語の独自拡張でカバーしてきた その一番簡単な拡張方法が、アセンブリ言語の埋め込み 別の見方をすれば、世界規模のコミュニティで共有する高級言語で統一的にシステム開発できるということは、ハードがすべて統一さてれいるということ つまり、そういうハードそのものとそれにくっついてるシステムソフトは差別化がないという意味で根本的には売り物になるようなモノではなく、無償労働が当然の連中と競合していくことになる ゆえに、システムの収入源はアセンブリコードである
>>584 言語仕様のバグっていうのがあったとしても、
普通は別のやり方で回避できると思うけどなぁ。
GCCなんかはバックエンドの部分を書くだけで特殊なハードに対応できるように設計されてる。 ちょこっと書くだけならともかく、 特殊なハードだからって長ったらしいアセンブラを書く必要は無いんだよ。
process `map` container processの定義で 一度計算したら以降、mapを通して持ち回す変数があるとします(例えば平均値や標準偏差) この変数は、processの定義のwhere以下では定義しない方が良いですか? processと同レベル以上のスコープに置くべきですか? 危惧しているのは、processのwhere以下に書くと 適用毎に再利用しないで計算し直してしまうのではないかという事です
Haskellだから同じ計算が何度もされることはないと思うけど、状況がよくわからない 「平均値」がcontainerの要素の平均値なら、processにはそれを知る術はないだろうし processが定義される場所からcontainerが見えているなら問題ないけど
Haskellでも同じ計算はされてしまう。GHCは共通部分式除去も自動メモ化もしない
call-by-needで同じ計算が防げるのは関数内部で関数の引数を複数回使ったときだけ
>>591 はprocessと同レベル以上のスコープに置いたほうがいい
深いコピーを防ぐために浅いコピーをするのと同じ なぜかEqを定義しなくても深い(==)と浅い(==)が当たり前のように存在している
import qualified Data.Vector.Unboxed as Ubx import Statistics.Sample import qualified Statistics.function as Sta ラベルと点数のペアのベクタをとって、ラベルと偏差値のペアのベクタを返す sortBySS :: Unbox a => Ubx.Vector (a,Double) -> Ubx.Vector (a,Double) sortBySS vec = let standardScore score = 50 + 10*(score-mean)/stddev where stddev = sqrt variance (mean, variance) = meanVarianceUnb scores scores = snd . Ubx.unzip $ vec in Sta.sortBy (comparing snd) $ (standardScore <$>)) `Ubx.map` vec このコードで、mean、variance、stddevが一度の計算で済むかが気懸かりです
正気かよお前。
ほとんどのパッケージがベータリリース状態(0.xx.yy.zzなのはそういうことだよね?)だけど互いに依存しまくってて、 開発の活発なプログラムとそうでもないプログラムは一緒に使うことができない、っていう状態はどうすればいいんだろうね。 みんなどうしてるんだろう。他人のライブラリ/アプリケーションなんて一切使わねえぜ!とかやってるのかな。 ghc7.6.1だとxmonad0.10とpandoc1.9.4.5は最新のものが一緒に使える。leksahはインストールできない。yesodはトライ中。
>ほとんどのパッケージがベータリリース状態(0.xx.yy.zzなのはそういうことだよね?) ちょっとよくわからないです
>>599 バージョンが 1.0.0.0 になって初めて正式リリースとなる、
と言いたいんだろうことは分かると思うが。
>>598 同じ名前のパッケージの2つのバージョンあるとき、
互いのバージョン番号の最初の2つ同士で比較して少なくとも一方が異なると、
その2つのパッケージの間に互換性は保証されない。
最初の番号が0だろうが、これは変わらない。
よって君が、開発の活発なプログラムとそうでもないプログラムは
一緒に使うことができない、と思っているのなら、
最初の番号が0であっても、1以上であっても状況は変わらないはず。
1以上であっても、活発なら2番目の番号はよく変わるはずだから。
つまり君が抱えている問題はベータリリース状態であることとは関係ないと言える。
>>598 具体的にはleksahがghc7.6.1に対応してないのが問題ってこと?
それはパッチを送る以外にどうしようもないんじゃね
それからhackageだと正式リリースで1.0を付けるって習慣はそこまで浸透してないと思う
bytestringやcontainersがベータだというのは実感に合わないし
完成したら開発終了、とかじゃ無い限りベータ版はバージョンの進み具合と関係ないのでは?
おいおまえら 型理論の取り合えずこれ買って何章と何章よめばおk みたいなイカす入門書を教えてください 出来れば日本語で
606 :
603 :2012/12/02(日) 20:28:32.77
>>604 ,605
おおありがとうございます
早速読んでみます
HDBC fetchAllRows' すれば disconnect していい? というのは、データ貰った後で超重い処理させる時って 計算始める前に接続切っておいた方がエコでしょ? でも全部読み終わる前に接続切ったら危険だっていうじゃない fetchAllRows' でリストとして全部よっこできるんでしょ?
型推論ってそんな意味深のモンなのか? 俺は、言葉そのままと思ってるんだが。
>>609 このスレ的には、Haskellの専門家(言語設計者とか)と意見が合えばいいんじゃないか?
Haskeline の getPassword なんですが これ Nothing の考慮要るんですか? 何も入力しなかったら Just "" になります Nothing になるケースあるんですか?
Ctrl-D
615 :
608 :2012/12/04(火) 16:00:21.16
やっぱりエラー起こりました 遅延評価はよく判らない ストリクトにしても読み終えてるとは限らないようで、勝手に接続切っちゃいけないようです でも解決法に気づきました 接続するルーチンと演算のルーチンを分けて 前者から値を束縛して後者に引き渡すようにすれば良かったんです そうすりゃスコープ抜ける時に自動でやってくれるので dissconnectは結局不要でエコも両立というわけです ですがそこで新しい問題が起きました 接続ルーチンをIO () から IO a に替えなければならないのですが それに伴い、エラーハンドラなどもIO aにしなきゃならない しかし、変な入力にはprintで文句を出力しなきゃならないと思っていましたものですから printはIO ()なので、()とaで型が合わなくなる ダミーの値でも返すようにするか?……いや明らかにスマートじゃない 数時間悩んで遂にfailという結論に達しました fail::String -> IO a なんとfailはIO aなんですね! ()じゃなくてa! これは救世主です これで遂に型が合い、コンパイルに成功したというわけです 有難う、failのお陰で成功しました
失敗は成功の素
そういうのって、Conduit は活用できんの?
Conal Elliott のブログが更新された ご存命でなにより
8月だよ!全員集合 ごめん、9月じゃないや。
数値計算の特集があったら買うんだけどな…
Control.Arrowって何に使うものなんですか?
Arrowのインスタンスって関数とKleisliぐらいしか使ったことないや 関数合成と2タプル操作関数の為のユーティリティぐらいとしてしか使ってないし
(´・ω・`)はい
プラットホームインストール後は追加インストールゼロでやってるチュートリアルが欲しいです
機械学習ライブラリ無いですよねhaskellに
>>627 大学の研究室には腐るほどあると思う
独自のHaskellウンコライブラリが
ねぇねぇ、HaskellってUTF-8だけ扱えばよい世界なら 日本語もAll OK ?
結局Shift_JISとUTFの変換に起因する問題に苦しむことになる
集中治療室に頼れ
ドライバやRDBMS自身が日本語使えないとかいうオチも潜んでるから困る MSのコマンドプロンプトもUTF表示が怪しい
僕のコンソールはSJIS専用なので結局変換しなきゃなりません
新たなコマンドプロンプトを自作できない理由 GUIの中の人が主にシングルスレッドやプロポーショナルフォントを想定しているから
型推論って「型書かなくていいから便利だよね」くらいの説明しか見たことない
minttyいいよね
便利なのはいいことだ
書き捨ての場合には超便利 コードの断片だけ見せられて、孫引きしながらデバッグしていく場合には不便
トップレベルの型は書く文化だろHaskell 型推論でデバッグが難しくなるなら一つの関数が長過ぎだ
そうそう 文化で解決しようとする姿勢が まだまだ未熟な技術という感じなんだよね 型に関する他の技術に比べて型推論はイマイチ
OCamlみたいにトップレベル関数のシグネチャ出力する機能はよ
弘法、プログラミング言語を選ばず
>>642 -fwarn-missing-signatures
>>641 イマイチってなんだよ
中途半端な警告は無視する人もいるんだぞ
完璧じゃないなら全否定でいいだろ?
>>646 警告を無視ってなんだよ
型が推論できなかったらコンパイルエラーになるだけだろ
だろだろだろ
いくら型を書いても ヘッダファイル的なものがなければコード全体を一気にコンパイルする文化になる 分割したいならヘッダを書く言語か動的言語を使えばいい
putStrでログは役に立たないのか 最終的順序を保証するだけでいつやるかはイレギュラーなんだな 計算前の始まり報告と 計算終了報告を 正しくタイムリーに表示させるには seq使えばいいのか?
putTraceMsgってなんで改行すんだよ 勝手にすんなよ Calculation ... done. とかやりたいのに
メモリ1Gでスワップ領域無しのeeepcでWindows XP環境下でwxHaskell使えるようにする方法教えろ
>>655 それをするために何をしたのか、その結果どうできなかったのか、
という事を詳細に書いてくれないと、アドバイスするのは難しいと思う。
wxHaskellの前にwxは動くの?
コンパイルはできる?
実行するとエラーが出るの?
WHNFやNFのお勉強させてください!
自己解決しました
GUIよりもコンソールへの整形出力(日本語含む)を簡単にする方法を用意してほしいです
>>659 ここでそんな事を言って待っていても誰も作りません。
さあ立ち上がろう
なんだかんだ言って、C言語のprintf文最強
import Text.Printf
モナドを理解するにはハスケルを理解した後モナドを理解する。 あるいはモナドを先に理解する。 どちらが得策ですか?
言語は、単語や文法を創ってから話し始めるとでも?
>>664 釣りっぽいが、併行してやるのがお薦め。
>>665 はもうちょっと練ろうな。
進化上のトライ&エラーは、全員が何時までも繰り返しやるべき事じゃない。
俺は先人の成果を感謝しながら使わせて貰うけど、それが嫌らしいから、全部独力でやってくれ。
トライアル&エラー
そんなに向かっ腹を立てるほどの釣りかなあ。
HDBC.PostgreSQL の withPostgreSQL' にはドキュメントがありません これは正格版ということでしょうか?
たぶんsrc見るとすぐに分かる
トランザクションの連鎖モードと非連鎖モードの違いやね '付きはBEGIN無しの非連鎖モード
関数型言語はHaskellが初めてなんだけど、関数型言語で真っ先に理解すべき概念て何? 言語の経験はCだけでどこからかじったらいいかわからないっす スレ違いならゴメン
代入できないよ
複雑なデータ構造があって それがリストに並んでるとします deepseqすると全部のリストを洗って全部の要素をNF化するんですよね? リストは全部タッチ(e:?で止めないでe1:e2:e3:…en:[]まで)して欲しいけどけど 個々の要素をNF化する必要は無いときはどうしますか?
>>675 あんがと
Cつっても組み込み実装の用途だったから関数言語のアカデミックな思考とは今まであんまり縁がなかったなあ・・
関数言語使えるようになったらシステム制御とかすごい効率的に書けそう
fprintf文が使えなくてイライラする C言語の入出力は実は悪くないとあらためて実感できる
いやあれは悪いだろ
>>681 Sugeeeeeee!と思ってライブラリアーカイブ漁ったらコマンドライン簡易計算機が出てきたでござるの巻
>>676 import Control.Seq
r = seqList r0
でどうだろうか
returnが不適切だというなら、じゃあ何が良かったんだよ? monadize
unitやetaあたりだけどdo記法内で手続き型っぽく書く事を主眼に入れたとしたらreturnが適切なんじゃね? っていう議論が大昔にあった筈だからその辺の歴史も知った上で考えたいのだけどそんな資料ありませんかね
return の代わりに eta join の代わりに hinin ってのがいいと思う
687 :
デフォルトの名無しさん :2012/12/19(水) 20:44:44.19
bindが記号?(>>=)があるのに対して returnにはないのは何故ですか?
メリットがないんじゃないか そもそも単項演算子なんて(-)ぐらいのもの 命令型言語とのアナロジーも考えればreturnでいいでしょう
690 :
デフォルトの名無しさん :2012/12/19(水) 20:59:56.08
記号が読みにくいのは同感なんですが じゃあ何故bindは>>=なのかが疑問なんです 統一感がないっていうか・・
>>690 bindな>>=なのはプログラムが読みやすいから
>>690 統一感がないという理由なら、fail にも記号が必要になる
あるいは、(>>=) と (>>) も演算子ではなく関数名を定義するか
m >>= k >>= l m `bind` k `bind` l では前者のほうが読みやすいでしょう 中置記法は優先度も決められないしね
なんかこう包みこんだり持ち上げたりするようなイメージの ぐっとくる記号があったら採用されてたかもしれんな
>>693 > 中置記法は優先度も決められないしね
関数 f も infixr 5 `f` で中置記法としての優先度や結合の向きを定義できる
697 :
デフォルトの名無しさん :2012/12/19(水) 21:18:25.23
なるほど。bindはイメージがしやすい記号が合ったけど returnにはそれがなかった。と言う事ですか
記号は二項演算子のように挟まれるか、括弧のように挟むために使う
return じゃなくて inject にすべきだったのではなかろうか
>>699 モナド=コンテナ 的な発想だとそうなるんだけどね。
Maybe はコンテナか?とか
流石に今更returnをinjectに変えるのはなあ
書きやすさで言えば inject = return とすればいいだけだから平和だ 争いは読むレベルで発生する
そろそろコモナド入門誰か書いてよ
コモナドって何に使うの?
arrowがコモナドとか思ってるんじゃね? ちなみにarrowはコモナドじゃねーぞ
コモナドはarrowになれる
「こどもでもわかるコモナド入門」
co-monadとarrowは全く違う
そんなの知ってるからコモナドの応用例出せ
例: Coreader (a.k.a Env) localの使えないReaderMonad つまりゴミ
Identityコモナド
お前ら難しい概念は一杯知ってるのに実用できてないよね
だから実用例出せって言ってる
715 :
デフォルトの名無しさん :2012/12/20(木) 22:54:32.75
分散並列処理フレームワークありませんか?
>>715 どういう事ができる分散並列処理フレームワークが欲しいの?
世界征服
哲学は結構です Haskellの話をお願いします
これからのHaskellはどうあるべきか
兎に角実用例を増やす 必要なのは信頼と実績のみ 理論方面は証明支援系に任せましょう
722 :
デフォルトの名無しさん :2012/12/21(金) 13:11:28.86
まとなIDEだな emacsとかはもう嫌
haskellはビジュアルプログラミングに向いてると思うね。 Yahoo! pipes的なの誰か作ってよ。
ログ取ろうとする初心者が必ず陥るであろう罠 モナドで順序保証といえど遅延であるという事実 これが意図に反する挙動を招く事について解説するべきだ
「やりたいこと」ではなく「できること」をプログラムしましょう やりたいけどできない挙動はあっても、できるけどできない挙動というのはありえません
>>723 Haskellのどの辺りがビジュアルプログラミングに向いてるのでしょうか。
イベリコブタの調理のしやすさ
諸君、議論がお留守だよ
結合リスト data Tree a = Single a | App (Tree a) (Tree a) を普通のリストに変換する関数 toList :: Tree a -> [a] toList (Single a) = [a] toList (App (Single a) xs) = a:toList xs toList (App (App xs ys) zs) = toList $ App xs $ App ys zs この関数の2つ目の式では呼び出しの度に要素数が減ってるけど でも3つ目の式では要素数が減ってない でも有限リスト与えた時にちゃんと止まる じゃあ3つ目の式と2つ目の式でに共通の呼び出し毎に減っているものは何ですか? 整礎帰納法の例で探してもマージソートとか割り算ばっかりで木の平坦化とか全然出てきません
>>731 単に止まることを証明したいという意味?
俺なら
1. どの操作でもAppが増えることはない
2. 左側の木の高さが1以上の場合は左側の木の高さが減る、0の場合はAppが減る
というあたりから攻める
との操作でも減るような上手い値を定義したいということなら分からん
>>731 App xs ys が xs に減ってるじゃん
えっ……
参照的な構造(動的に変更される有向グラフ)を表すにはどうしたらいい? グラフの形状は、環状構造とか、分断されてるとか、そういうのもあって仮定できないとして addNode :: a -> Graph a -> (Graph a, Node a) deleteNode :: Node a -> Graph a -> Graph a getValue :: Node a -> Graph a -> a putValue :: Node a -> a -> Graph a -> Graph a connect :: Node a -> Node a -> Graph a -> Graph a disconnect :: Node a -> Node a -> Graph a -> Graph a connections :: Node a -> Graph a -> [Node a] こういう関数を純粋に定義するにはどうしたらいい? 特に、ノードやエッジ、グラフを表す型はどういうものにすべき? 「純粋に」というのは、関数の引数や返り値にIOやSTの類が現れないということ unsafePerformIO みたいな「抜け穴」の使用はナシで
>>375 君は、任意のグラフではなく、ツリー構造なら問題なく
>>375 (の様なもの)を実現できる?
もっと言うと、一列のリスト構造なら問題なく実現できる?
それなら実現できると言うのなら、グラフ構造だと何故できない?
グラフ構造とそれ以外の構造との
>>375 を実現する上での本質的な違いは何?
>>735 頂点、辺をそれぞれ整数で表わす
data Graph a = Graph
{ nodes :: IntMap (a, [Int]) -- [Int]はここから出る辺のリスト
, edges :: IntMap (Int, Int) -- 出発頂点と行き先頂点
, nextInt :: Int -- 次に頂点や辺を作ったときに割り当てる整数
}
問題の一つは、循環があると構造が再帰的にならないこと data List a = List a (List a) | Nil とか data Tree a = Tree a [Tree a] と定義するのと同じような感じで data Node a = Node a [Node a] と定義してしまうと、Eqのインスタンスにすることさえできない (有限なグラフに対しても(==)が停止しない可能性がある) 循環構造を考えないとしても、グラフには、リストの頭や木の根みたいな「どこからも参照されていない唯一の基準点」がない 仮に木構造の参照の向きを全部逆にしたような構造があったとき、その根が変更されたら、それをどうやって全てのノードに伝えたらいいのだろうか 唯一のエントリーポイントが存在するなら、そこから変更点までの、影響を受ける全てのノードを(陰にせよ陽にせよ)記憶しておけばいいけど、グラフだとそうはいかなくなってしまう
>>738 >有限なグラフに対しても(==)が停止しない可能性がある
ん? 必ず停止する同値判定プログラムは書けるが、
複雑で面倒と言うことだよね?
(循環を検知できないわけがない)
>>737 の方法でも、同値判定をする必要があるのなら、
循環を検知する同じような仕組みが必要だぞ。
data Node a = Node a [Node a] というだけの構造でも循環は検知できるんでしょうか? x = Node 0 [Node 1 [x]] y = Node 0 [Node 1 [y]] に対して x == y が停止してTrueを返す(==)って定義できるんでしょうか
出そうと思えば(unsafeCoerce)
>>735 単に隣接行列を持てばいいだけだと思うけど
>>739 循環は検知できないだろ
たとえば[Int]を与えられたときに、それが
・普通の無限リストなのか
・単にやたらと長いリストなのか
・let a = 0:a in aのように作られた循環リストなのか
判別することはできない
>>738 の構造ではグラフの頂点数を数えることすらできないし、
辺の追加や削除もできない
どうしても
>>737 みたいなグローバルなテーブルを持つを持つ必要がある
>>740 はノードが二個のグラフのつもりなんだろうけど、
x = Node 0 [Node 1 [x]]
z = Node 0 [Node 1 [Node 0 [Node 1 [z]]]]
この二つが全く同じデータになっちゃうんだからおかしいよね
最低でもノードの同一性判定は必要(ノードの持つ値が同一というのではなく)
>>742 隣接行列を2次元配列で表現するとノードの追加や削除が非効率
また、辺が無いところが無駄になる
検索の効率は良いけどね
>>744 今まで比較した全てのものを記録しておいて、
[x] と [Node 0 [Node 1 [z]] を比較すれば判定できると思うけど。
判定処理の中で随時別のグラフ表現にフォーマットし直しながら判定すれば、
非常に馬鹿で無駄で非効率で面倒で阿保だけど、不可能ではないような気がする。
ダメかな・・・
>>746 いやできないって
xとzを定義した時の式が後から取り出せるわけじゃないんだぞ
ポインタをモナッドでエミュレート出来ないんですか
>>747 data Node a = Node a ID [Node a]
というように、各ノードを区別できる全体で一意のノードIDを持たせても無理?
>>749 それだと同一性判定は可能といえば可能だけど
n > 1のn部グラフは表現できない
という問題がありそう。
一例を挙げれば、点が二つで辺が一つもないグラフと、点が二つで辺が一つだけのグラフをどうやって区別するの、ってこと。
なお、オレは
>>747 とは別人ね。
>>750 Data Graph a = Graph [Node a]
data Node a = Node a ID [Node a]
752 :
751 :2012/12/29(土) 09:53:16.93
>>750 すまん、
>>751 は変だな
まぁ、こんな感じでリストを組んでおけばn部グラフも表現できるでしょ
検索処理とか面倒そうなんで、俺はやらんが
なんかGC実装したときみたいに物凄く難しくなる気がするのだが
いや、だから「同値判定は不可能」というのは違うよね
と言いたかっただけだ
実際にプログラムするなら
>>737 の方法がシンプルでいいと思うぞ
むしろ、同値判定は簡単だけど、独立した循環参照の検出と抽象構造の同一視が難しい気がする
programming in haskellとかいうpdfを読んでみたけど 稚拙な英語で書いてあったから日本人でもよく分かると思ったよ。 とりあえず7章までは問題なく読めたからオススメしておく。
稚拙ってけなしてるようにしか聞こえんなw
平易と言え
稚拙 -> Unskilful 平易 -> Plain
760 :
731 :2012/12/29(土) 13:09:04.38
渡された木の頂点から各要素への左向きの辺の数の総和を見ればいけました 総和なのである左向きの要素の階層が減った場合でも要素数が減ってもいけるわけですね 直近のグラフに関する話題が良いヒントになりました numLEdge' :: Int -> Tree a -> Int numLEdge' n (Single _) = n numLEdge' n (App x y) = numLEdge (succ n) x + numLEdge n y numLEdge = numLEdge' 0
Integer型で何桁でも整数取り扱えるじゃん? 小数点何位でも取り扱える小数型ってないん?
あれがそうなのか
上に出てきたグラフ構造もそうだけど データ構造内の異なる複数の個所から あるデータを参照するにはどうすればいい? やっぱり整数値をポインタに見立ててIntMapでごにょごにょするしかない?
emacsでhaskellのソースコードを書いているときに、C-c C-l と入力すると ghciが起動してそのソースコードを読み込んでくれるのですが、 その方法で起動したghciの中で補完機能(termの中でTabを押すことで使えるやつ) が使えるようにするにはどんな設定/elispを使ったらいいんでしょうか。
>>764 データを複数回参照するには変数を定義する
実行時に複雑なデータを入力する場合は、文字列を変数に見立てる
もちろん整数をポインタに見立ててもよい
ガーベッジコレクションの実装の解説見たら参考になると思う
HaskellDB で新しいテーブルを作成するには、どうすればいいの? ネット上のサンプルとかチュートリアル見ても、 すでにあるテーブルの参照はあっても、新規作成の例が見当たらない。 もしかして、テーブル作るには Database.HDBC.run 関数に SQL 文を適用するの?
SQLで作るんじゃない? 確かRWHでは普通にSQL使ってた
マジですか HaskellDB is a Haskell library for expressing database queries and operations in a type safe and declarative way. と言うのは、レコードに対するクエリや操作に関してのことで、 テーブル作成や削除は勝手にやってくれってことか・・・ 何という片手落ち
RWHにあるのはHaskellDBじゃなくてHDBCだった てへぺろ(・ω<)
HDBCってショボいの?
HDBCって、SQL文を文字列にしてRDBMSに飛ばすだけだよね? 遅延評価を使うと、RDBMSが対応してないと、メモリがどえらいことになると思うけど、どうなんだろ
データは遅延で受け取りたくて 尚且つ最後まで受け取ったら その瞬間に自動的にデータベースとの接続を切って欲しいんですが そういう巧い話ありません?
conduit と組み合わせるとか
conduitってそんなに凄い奴なのか
777 :
775 :2013/01/06(日) 13:30:19.07
>>776 conduit はストリームの下流にあるものから上流にあるものへシグナルを発信できる。
それによって、上流にあるものは下流に提供しているリソースをもう解放して良いのか、
それともまだダメなのかを判断できる、という代物だ。
下流で、データを最後まで受け取ったと判断したら上流へシグナルを送る仕組みを作れば良い。
と予想したんだが、どうだろうな。
couchdb-conduit パッケージを使ってみれば、もう少し分かるかも知れん。
俺は使ったことないから分からんが。
勉強してみるよ
モナドの実行順序と実際の評価の順序は必ずしも一致しないじゃないですか putStr "begin..." value <- heavyProcess putStr "done." print value これはbegin...done.と表示した後にようやくheavyProcessが動き出すじゃないですか もう何を信じていいのかわからないじゃないですか
遅延IO死すべし
seq?
そこで評価する必要ないから評価しないのに馬鹿なの?
怒られた>_<
>>779 それだと"done."が表示される時点ではheavyProcessは実行終了してるよ
done.の後で時間が掛かってるなら、それはheavyProcessが重いサンクを返してるのが原因
valueの文字列化が重いと見た
サンクが膨大に残ってるのに実行は済んだっていうんですか NFにして初めて実行したというんだと思ってました 「実行は済んだ。結果はまだだ」 「手術は成功だ。患者は死んだ」
>>787 そういう言語だから仕方ない
[Int]は、Intの値かサンクを持つリスト
IO Intは、Intの値かサンクを返すアクション
>>786 heavyProcess内で行われるI/OはheavyProcessが返る前に完了するよ
返り値をNFまで評価するのは実行のうちに入らないってだけ
I/Oは直感通り即処理されるんですか? 他に即処理されることを判断する為の指針は?
何のために処理の順番なんか知りたいの? そんなの気にしなくていいってのが関数型言語のいい所だと思うんだけど。
(´・ω・`)判らないことを知ろうとするのが科学ではないですか
先生!、技術は科学に含まれますか?
(´・ω・`)修辞疑問氏ね
>>790 おおざっぱに、どういうI/Oをするのか(あるいはしないのか)を決めるのに必要な式だけ評価される
たとえば、
putStrLn (f x)
を実行するには、f xを評価しないと何を表示していいか分からないので評価する
when (f x) $ putStrLn "Hello"
も、Helloを出力するかどうかを決めるのにf xの評価が必要だから評価する
return (f x)
は、f xの値が必要ないのでサンクをそのまま返す
let v = f x
in return v
も同じで、サンクを返す
return $! f x
は、このIOの正体がreturnであることを確定するために$!を評価する必要があって、
$!がf xの評価を発生させるので、サンクでなく値を返す
>>795 なるほど、キーポイントはI/Oなんですね(´・ェ・`)
>>795 > when (f x) $ putStrLn "Hello"
> も、Helloを出力するかどうかを決めるのにf xの評価が必要だから評価する
このケースで、本当に f x が評価されてるのかどうか、確認する方法はある?
(まぁこのケースだけの話じゃないけど)
ghc のソースを覗く以外なら手段は問わない
>>797 fを書き換えていいのなら、
・評価されたらerrorで死ぬようにする
・評価されたらDebug.Trace.traceで画面になんか出力
>>790 期待通りの順序で動かない時も有るけど、そういう時の為の関数が大抵有る
自分はhFlush,DeepSeqぐらいしかまだ使ってないけど
800 :
デフォルトの名無しさん :2013/01/10(木) 00:54:16.28
サンクってどういう意味ですか?
>>800 drinkdrankdrunk
みたいに
think thank thunk
と変化するんだよ。そう思ったときの thunk 。
>>801 thunkってthinkの完了形だったのか…。でも、遅延評価だから完了してなくね?
値を求めるのに必要なものは既に全て揃っている、みたいな意味らしい
和田本に遅延評価とサンクの実装が載ってるよ~
実装じゃなくて意味を知りたいのだと思うが
和田本てどれ?
スーフリ和田
>>806 計算機プログラムの構造と解釈
実装はschemeだけど
>>805 自分の手で実装してはじめて意味が理解できる
レッツトライ!
>>808 いや、言葉の意味、なんでthunkなの? という趣旨の質問かと思ってた
>>809 なんでthunkという単語にしたかという経緯は、algolの教科書に書いてある
algolスレへGo!
いつ評価されるのか、私気になります!
forceが評価されるときに実行されちゃいます
>>808 >
>>806 > 計算機プログラムの構造と解釈
> 実装はschemeだけど
それ和田本じゃなくてSICPと呼ぶのが普通。
訳が独特だから、あえて和田本なのかも知れないけど。
おれ子供ができたら えばる あぷらい らむだ って名前付ける。
SICP… たぶん俺なんかが読んでも速攻で挫折するんだろうな
SICPは古いし読む価値ないと思うよ。
今はSICPよりJavascriptの本読んだほうがいいね。
まだ生きてたの?
Haskellスレ的にはSICPよかAlgebra of Programming
>>818 RWH通読した根性があれば、その1/4の時間で読み終わると思う
>>814 そこは『氷菓だけにぃいいいいい?』だろ
わたし、(評価されると)木になります!
SICPに古いかどうかなんて関係あるか?
ここ20年における計算機科学の進歩を無視するというなら関係無いな SICPが書かれた時分なんて計算機科学の専門家ですらモナドなにそれおいしいの?ってレベルだぞ
ぶっちゃけSICPのどこがどう古いと言われてるのか知らない…
一般に教科書は古い 学部でやる線型代数の教科書も古い
線形代数は枯れてるけど計算機科学は滅茶苦茶若い学問っていう差はあるから同じようにはできないと思うよ
計算機科学に新しい要素は加わったが、SICPは古くなってないと思うぞ。 ニュートン力学が古くならないのと同じ意味で。
PascalよりSchemeが良いっていうコメントを入れてしまったのが古い でもここでSchemeよりHaskellが良いと言うのは進歩がないよね
計算機科学って、どのあたりが「科学」っぽい?
等式推論と静的型検査の要素が入ったSICPがあれば嬉しい
ではまず科学の定義から始めよう
>>833 何が正しいか議論するよりも実験する方が早いところが科学
計算機科学って、今でも「科学として」発展し続けてる?
学科としてみたら就職率のいい数学科
就職率なんて当てにならんだろ。 だって企業は学生がどの学科かなんて全く見てないんだから。
Haskellアプリってどれくらいメモリ食うの? 64MBで普段スワップ起こしてる環境だから判んないけど 32GBとか積んだ環境だと一杯になるまで無尽蔵に使い続けるわけ?
64Mじゃhaskell-src-extsのビルドもできない
>>840 RTSオプション付けてプロファイリングしてみれば良い
それくらいは自分でできるだろ
計算機の構造が根本的に変わらない限り、 SICPが古くなる(読んでもあまり意味がなくなる)ことは無いよ
SICP信者多すぎて困るw あんなもんただのScheme解説書じゃん。 計算機科学分もネットで出回っている情報レベルの本w
そのネット情報のソースがSICPだったりしてなw ま、そんなことはどうでもいいけど、 お前ら本の名前ばっかり論ってないで議論しろw
じゃあお前が議論のネタ出せよ!!!
qt-haskellのhaddockが最強 6Gあっても足りない
> あんなもんただのScheme解説書じゃん。 どこがだよ。Schemeの教科書として読むのは勧められない、というのが定評なのに。 おまえが何もわかってないことだけが明らかw
>>844 有志によるPython版すらあるというのに何を言っているのか
TAOCPはどうなのよ
大学1年の時にSICPを読んで、初めて言語処理系なる物を自作したなぁ。 あの頃はコンピュータ技術者の地位はそこそこ高かったw
>>837 生物学のようなものが発展したら数学者はガッカリするだろうか
>>845 みんなHaskellで語ることないんだよ
すばらしい! 語る事が無いほど明快な言語というわけか!
ビルドツールとか CI ツールとか、UML ツールとか、 そういうのって C や Python、Java などでよく作られるけど、 Haskell で作るって話が出ないのはなんで? Haskell はその手のツールを作るの苦手なの? こういうツールも初めは個人の趣味で、 一人で必要最小限の小さなアプリから作って育ったんだから、 Haskell で作って公開してる人が居てもおかしくないと思うんだが。
時代じゃないかな。 そういうのが量産された時代ってせいぜい10~20年ほど前だろ?
今はWEBかスマホアプリの時代。 注目されている分野が違うんだよ。
じゃあ、今ふだん Haskell でプログラムしてる人たちは、何作ってるの?
サーバ関係じゃね
Haskell…かな
>>860 論文を書くのに必要な資料や文献を管理するツールとか?
論文の構想を錬るのに使うビジュアルツールみたいなのとか?
一部の特別な人間が使うサーバー関係よりも、こっちの方が興味あるな。
こういうのなら、改良して一般の人たちが普段使うツールにできそうな可能性ある。
なんでフリーウェアで公開しないの?
公開すればいろんな人たちが改造するかも知れんのに。
shake
>>863 定理を論文に書く → haskellで確認する
アルゴリズムを論文に書く → 実証用の簡易実装をhaskellで作って公開する
数値実験 → haskell環境で実験
haskellのコードに限りなく近い形で論文に掛けるからhaskellを使ってる
俺は実験の生データをHaskellで読んで整形してchartとか適当なライブラリでグラフまで落すってのに使ってる
javaのスケルトンをHaskellで作ってる
>>865 論文に書く定理をhaskellでどうやって確認するの?
Haskellで確認できるというのは、例えばどういう定理?
グラフ系とベイズ系と数値計算系と型理論系とデータベース系くらいか
何とか伝えようとしても、かえって隠している印象が強くなるよね
型理論系をHaskellで書く?アホだろ。
日付
>>871 π計算、Chameleon system、単一型パラメータコンストラクタからの拡張法、…
日本で Haskell の事業って何かないの? もちろんオープンソースのプロジェクトでもOKだけど
>>879 すまん、Haskellを使って具体的に何をするのか、
その事業はなんで他言語じゃなくHaskellなのか、
とかその辺りが知りたかった。
Haskellでこんな狙い(ビジョン)でこんなことやってます、
というのが分かるといいんだけどなぁ。
>>857 その次はウェアラブルコンピューティングの時代
ますます富豪的プログラミングの日の目は遠ざかりますなあ
もう速度で言語を選ぶのはやめにしませんか?
用途によって言語を使い分けたりしないのね
その、用途と言語との関係がいまいち分からん。 コンソール用のゲームならC/C++が適してるし、 Webのクライアント側のシステムならJavaScriptが適してるが、 その他の用途って、言語は何使っても大して違いないような気がする。 好きな言語選べばいいんじゃね。 Haskellが適してる用途って何よ。 Haskellの特長を生かした、学習曲線が穏やかなGUIライブラリが無いという時点で、 適してる分野がかなり狭められているような気がするが。 Haskellの適した分野の集合 ⊂ その他の言語の適した分野の集合 今こんな感じだろ
俺様言語処理系を書くこと
>>883 学習速度、アプリ構築速度、メンテナンス速度、投資回収速度、いろいろ有るから無意味ではない。
環境負荷と経済効率で測るべき
アセスメント手法確立できないくせに~
>>885 言語は選ぶモノではない
押し付けられるモノだ
計算可能性が同じである以上、分野が適していないなんて言い訳は通用しない
我々にできることは、インターネット上の間違った知識を理由に言語を押し付けられないよう、間違いを見付けたら逐一指摘していくことのみ
>>887 それ、結局は人間がボトルネックになってる。
ハードが進化して実行速度を無視してよくなったように、5年以内に自動コーディングが進んで人間のボトルネックも無視する風潮になるような気がする。
コンピュータ言語はガチの専門家さえ理解できればいい代物になってしまうのではなかろうか。
じゃあガチの専門家になろう
自動コーディングはどの程度まで進んでいるのであろうか? また自動コーディング系になんらかの「仕様が記述されたもの」を入力しなければならないであろうが、それはどのように記述されるのであろうか? haskell 風に記述するのか?まさか?
抜け目ない仕様の記述という問題が残る以上 言語が一段高級になるだけにしか思えない
キモい書きこみばっかだな
>>891 >ハードが進化して実行速度を無視してよくなったように、
この認識が通用するのは、元々数桁の改善で済む程度の単純な問題についてだけ。
あと投資は技術のすじ以外の部分が大きい。
『本物のプログラマはHaskellを使う』って読みにくいな すごいHはあんなに分かりやすかったのに…
そりゃ、あれは初心者に分かった気にさせる本だから 本物の~の方が内容はしっかりしてる
まあちょっと説明不足気味なのは分かる気がする>本物の~
>>900 端的に言えば読む側が理解しやすいように順序立てて説明してる感じがしない
筆者が思いついた順に説明してる感じ
各段落で読者が何を知っていて何を知らないかに注意を配ってないし
段落でされている説明が章全体の中でどういう位置にあるのかを読んでいて見失いやすい
知りたかったこと(定義)をズバリと教えてくれず例示とあいまいな日本語で済ませてる
あと「前回では~」みたいな別の章の参照が不必要に多くて各章の独立性が低い
Haskellはどのような時にメモ化を行うのかを調べていて
「第8回 遅延評価の仕組み」に行き当たったけれど
「名前呼び出し」の説明に量を割きすぎていて
肝であろう「必要呼び出し」の説明が段落ひとつ分しか書かれてない
必要になるまで、必要な分しか説明しないのだろう
書籍にするつもりがない連載にそんな批判されましても
そうは言っても、個人のブログなどとも違うからなぁ
日本で批評の対象になる価値があるのはそのコラムだけだからな 難しすぎてスルーされてるけど。 君が10行も語ってるのがその証拠だな 俺的には彼にIOモナドを3年くらい解説してほしいマジで State#って何なんだよ
>>905 何だよっていうか、概念的には State Monad と同じだから State って書いてるだけで、
その辺は外部世界をどう記述するかっていう処理系依存の話だし別に気にせんでもいいのでは。
907 :
デフォルトの名無しさん :2013/01/15(火) 23:58:53.61
Haskellでワープロを作る場合 一文字書く度に全てのデータを作り直す必要があるんですか?
ないです
referential transparencyなのにlet x = [1] in (x, x)と([1], [1])では効率が異なるので 結局referenceを意識しないとプログラムが書けないという罠
効率が異なるという話とプログラムが書けないという話の間に飛躍がある なぜ効率が異なるとプログラムが書けないのかを説明するべき
空間効率が異なると片方は実行できて片方はオーバーフローする場合があって停止性が異なるので、同じアルゴリズムを実装したつもりでも、両者が同値であると言えない
変数一個だけの式を除くすべての部分式に対して一時変数を定義するような形式 に変換したとき、同じ式に二個以上の一時変数が定義されるならば効率が良くない。
女ってレジ待ちしてる間に財布用意できないの? 女は遅延評価
女はプロセスを組み立てるのが下手。 女がプログラミング向いてるなんてのは迷信。
ストレス貯める器ちっさ 鼠並み
昔はプログラミングと言えば女性の仕事だったんだけどな
:(;゙゚'ω゚'):マジで……?
Adaは女性だし、ENIAC時代は女性がプログラミング担当やってたはず
>>918 そんなことは知ってる。
当時はプログラミングは大した仕事ではなかった。
戦時中の米軍でコンピュータが導入された時、
プログラミングは数学者や工学者ではなく、
普通の高校生を何人か連れてきてやらせていた。
初期の頃はハードウェアが重要で ソフトウェアはオマケ程度にしか思われていなかったんだよ。 それこそ、プログラミングはティッシュ配り程度の仕事だと思われていた。
「Coders at Work」のフラン・アレンの章を読むと、 女性も普通に高度なプログラミングに従事していた様子が窺える。 少なくとも、ティッシュ配り程度の仕事という認識では、 とてもではないけどあんなシステムを構築する仕事はできないと思う。 それも、フラン・アレンが特別優秀だったわけではなく、他の女性達もね。
922 :
921 :2013/01/16(水) 20:49:45.62
>>920 すまん、ティッシュ配り程度と君が言う時代よりも、
>>921 はもっと後の話だな。
混同してしまった。
ティッシュ配りはあれはあれで難しいと聞く
勉強していて詰まった。 APLだとすべての演算子が右結合だったので、 foldrが簡約演算子'/'を一般化したものだと考えることができた。 でも左結合のfoldlがピンと来ない。 foldl f v [x0,x1,...,xn]=(...((v `f` x0) `f` x1) `f`...) `f` xn とのことだけど、リストの先頭に空リストがあるわけでもないのに、vがx0より前に現れる。 不思議。
>>924 俺は不思議さを共有できないからアドバイスできんのだが、
foldl のソースを見てみると、もしかしたら疑問が解消されるかも。
ライブラリドキュメントの Data.List のページの
foldl の項の右端にある Source というリンクを辿れば、ソースが見れる。
>>925 どうもありがとう。
ライブラリ関数のソースの調べ方も分かりました。
リストの先頭から要素を一つづつ取り出して二項演算子で評価していますね。
BASIC風に書くと
result=v
FOR i=0 TO n
LET result=result `f` x(i)
NEXT i
PRINT result
みたいな動きで、foldlの第2引数はループの最初に与える初期値のようですね。
(foldrの第2引数は再帰の終端の値。)
手続き型言語によるアナロジーで、関数型言語を理解したことになるのか不明ですが。
指定した関数のソースを標準出力する関数ってないでしょうか? ghci 環境で :load で読み込んだファイルにある関数ならできそうな気がするのですが
なんかこのスレ、ノネナール臭がする
>>927 そのような関数が GHC の標準ライブラリに存在するかという質問でしたら、
存在しません。
haskell-src パッケージ(およびその拡張機能パッケージ)を使って、
その関数が定義されているソースファイルを解析してください。
>>924 自分は、foldrは普通の再帰を一般化したもの
foldlは末尾再帰を一般化したものって理解
932 :
デフォルトの名無しさん :2013/01/17(木) 10:27:37.47
>>891 5年以内はちと難しいだろうが、まさにあなたの読み通りになるだろう。
>>893 最近の日本人の論文を検索してみるとよい。ひそかにすごいのがある。
>どのように記述されるのであろうか?
もちろんhaskell 風ではない。
自動コーディングなんて妄言吐いてる人まだ居るんだね
自動プログラミングw Fortran時代の人ですかねw
コンパイラは、自動プログラミングの成果なんだが、使った事ない人に説明するのは難しいね。
で?としか言いようがない
フォーム入力とか帳票とか土方仕事程度なら エクセルで仕様書書くだけでプログラム自動生成の時代なんだぜ
>>938 それとかプログラムソース->実行モジュールは、アセンブラのレベル。
コンパイラでないものを、高級?に見せるためにコンパイラと称してるのが多いけどね。
仕様書を突き詰めるとプログラムになる。 書かなくてもわかるようなところは汎用的だから すでにライブラリ化されているはずだし 結局は自分でプログラム書いたほうが早いわけ。 自然言語でしか仕様書を書けない人は無駄な余剰人員だと思う。
まーたまともにコード書きもしないやつがぐだぐだ言ってんのか
えっ、ここってそういうスレじゃないの?
法学部の学生にはプログラミング必修にした方が良い
人間相手なら駄々こねるだけで何か作ってくれるから 便利さでいえば人間が最強だ 機械化、自動化の魅力は便利さではなく正確で馬鹿正直なところ
多数のフィールドを持つデータの一カ所だけ変更したものを作る場合 新しい部分だけ新設されて既存箇所はポインタで繋げるだけで済む?
>>933 職人芸として自動プログラミングを利用するプログラマがすでに存在するから、同じ給料でもプログラマによって生産量が1000倍違う
はあ、そうですか
たしかに、出社して30分でその日のノルマを終わらせて、会社でずっと2ch見てる人が必ずひとりはいる
1000倍になるのに30分もかかるのかw
>>948 瞬間生産量が1000倍あっても
集中力持続時間が1000分の1しかないなら
総生産量は変わらん
1000倍だとか30分だとか、小学生の喧嘩レベルだな
Haskell の話しろ
最近は質問とみせかけて スレ違いの話題を延々と引っ張る 自演荒らしが流行ってるのか
>>950 総生産量が1000倍違う
10年前は100倍だった
>>952 Haskellの使い道が自動コーディング
というか、日本の会社の実務でのHaskellの使い道なんてそれしかない
昔はlispでDSLからスケルトンとテストケース作ってたけど、parsecがあるからhaskellに移行中
自動コーディングは、どう考えても無理だろ。
>>957 部分的にはできてる
(100歩譲って全部できてる分野があったとしても、自動でやるからもう表に出ない)
実際に使ってるのを見たことがあるのは、領域を限定してコーディングするのと、コードの断片だけ生成するのと、自動でリファクタリングしてAPIを出力するのだけ
あと作曲
ひな形を作るのは自動コーディングとは別物? 例えばクラス図を元にC++のファイルを生成するとか。
>>958 「自動コーディング」するために、なんらかの仕様書を食わせる必要があるっしょ。
結果、その仕様書を作る作業が必要になる。
その仕様書も独特の文法があるはずで、結果としてプログラミング言語の一種になってしまう。
>>960 自動プログラミングの最終目標は、仕様書=自然言語
双方向化や総称データプログラミングも広義の自動化
大抵のことは自動化と言えるな
大抵はコードの量を圧縮するだけだね それ以上を目指すのはオカルト
高度に発達した科学は魔術と変わらない
赤ん坊は言葉を話せなくても泣き叫ぶだけで大抵の事は伝わるだろ そこで、泣き声に魔術のような力があると思い込んだ奴は科学的な発達が止まる
魔術のような神の力に対抗できるのは「論理」しかないと悟って科学は発達した
はぁ。
論理は実験をさぼるノウハウであってあくまで実験が基本だぜ
計算科学はどこに分類されるのだろう?
hoge= trace "hoge eval" 1 foo= trace "foo eval" fibs= (trace "0 eval" 0):1:(zipWith (+) fibs (tail fibs)) main = print $ [hoge,hoge,foo 1, foo 1] ++ take 5 fibs2 実行結果 hoge eval foo eval foo eval 0 eval [1,1,1,1,0,1,1,2,3] メモ化の基準が分からない…
> main = print $ [hoge,hoge,foo 1, foo 1] ++ take 5 fibs 間違えた
>>973 こう考えると良い(説明を簡単にするために少し端折ってる)。
f :: Int の文脈で let x = f in x + x
この場合、最初は x は関数 f を指している。
1回目に x を評価しようとすると、f が評価され、
x は f ではなく f の評価結果の値を指すようになる。
だから2回目に x を評価する時、f を再評価することはせず、
先ほど f から指し換えた値を直接使う。
これが(GHC の)グラフ簡約によって実現するメモ化だ。
g :: Int -> Int の文脈で let y = g in y 3 + y 3
この場合、最初に y は関数 g を指している。
1 回目に y を評価しようとすると、g が評価され、
g は1引数関数なので、さらに第1引数を評価しようとする。
第1引数は値(3)なので g 3 が評価される。
ここで、g は y によって指されているが、
y 3 や g 3 という関数(結果として値だが)を指しているものは、
どこにも無いことに注意。
よって、2回目に y を評価する時、g を再評価することはしないが、
g 3 はもう一度評価されることになる。
1回目の g 3 はどこからも指されていないのだから、
どこにもメモ化されていない。
let y = g 3 in y + y とすれば g 3 の評価結果が y にメモ化される。
>>973 で hoge が1回しかトレースされず、
foo が2回トレースされているのはこういうこと。
なるほど ポインタのようにプログラム中に書かれた項が簡約途中の結果を指していると考えればいいのですね memorized_fib = (map fib [0 ..] !!) where fib 0 = trace "0 eval" 0 fib 1 = 1 fib n = memorized_fib (n-1) + memorized_fib (n-2) main = print $ memorized_fib 10 + memorized_fib 20 実行結果 0 eval 6820 この例では明示的に特定の変数が何かを指しているわけではありませんが "map fib [0 ..]"の部分が0:1:1:2: ...という(途中の)評価結果を指していると考えていいのかな…
(動的型なら) クロージャ (\ x y f -> f x y) でリスト構造が作れる これならリストの中も変数 x か y に指されるのでポインタなどいらん
単なるコード生成の事を自動コーディングって呼んでるだけかよ それこそ「で?」としか言いようがないな
なにをどう考えたら
>>932 みたいな妄言吐くようになるんだろうね
980 :
デフォルトの名無しさん :2013/01/18(金) 09:01:45.78
継ぎスレ居る?
要らないでしょ
居るか居ないかを聞いている訳だから 「居ない」と答えるべき
日本語が不自由なようで
居る? という質問に対して、要らないと返すのが自由な日本語だそうだ。 確かに自由だなw
replibでgeneric zipper書いてくれ
「居る?」に対して「要らない」と返って来たら、 それは、居ないし要らないって意味だと推論できない奴は無能だな Javaみたいな面倒な言語を平気で愛用してそう
ああ、想像力が無いのね
いいぞもっとやれ