関数型プログラミング言語Haskell Part12
1 :
デフォルトの名無しさん :
2010/04/29(木) 19:15:28
これは乙じゃなくて乙なんだからねうんたらかんたら
前スレ
>>999 おねがい
Haskell: The Craft of Functional Programming
The Haskell School of Expression: Learning Functional Programming through Multimedia
The Haskell Road To Logic, Maths And Programming
洋書で分かりやすいのってどれですか?
英語ができるならネットでチュートリアルをいくつか→RWHでいいよ
なんか珍しく盛り上がってるな こここんなに人いたんだな
少人数が騒いでるだけ。
しかもJSON分かり辛いって言われてもなあ。 あれはわかりやすいから普及したんだよ。
>>6 分かりやすいの意味が分かりにくいが・・・
Craft の方は王道というか、全く持って普通の Haskell 本。
比較的広いトピックを丁寧に解説している。
教科書的で基礎がしっかり学べるから入門に良いと思う。
School は(ほぼ)グラフィックス処理を題材に
関数プログラミングのテクニックを解説している感じ。
だいたい、奇数章でテクニックの本質みたいなのを解説して、
偶数章でそれをグラフィックス処理に応用するみたいな。
ストリーミングの解説辺りから FRP が題材に出てきて面白い。
最後の方にロボット制御や音楽などが題材に出てくる。
Road は知らん。
PDF で読めるヤツとは違うものなんかな
>>6 おっと、肝心の質問に答えてなかったな。
私にとっては Craft と School は理解し難くはなかった。
School の方が説明を端折ってる感は若干あった。
Haskellよりも本を読むことが目的になってるように思えるんだが、みんなそんなに読みまくってるのw?
>>15 > Haskellより
意味が分かりません。
明瞭な言葉で語ってください。
>>16 Haskell でのプログラミング中に起きた問題の解決よりも、とか、
Haskell でプログラミングすることよりも、
という様な感じの意味だろ。
それくらい文脈を考慮して察してやれよ。
>>13-14 THX
Craftかなとも思いますが、
>>7 のいうようにネット上のチュートリアルとか
リファレンスをまず漁ってみます
本を読むのも悪くないと思うけどな もちろん練習も必要だが、その前にインプットだろ
>>18 Craftは来年に新版が出る、かもしれない
そことそこ 推薦図書スレへ帰れ
日本語が不得手な人が混ざってるね
RWHは難しいというか、話題が章内で完結していないので入門書やハンドブックとして適切じゃない。 知りたい項目を目次で調べてそのページを開いても、その章の始めの方の分かりづらい例題を理解して、さらに章をまたいで読まないといけない。 例えば「Doc」を調べようとして目次を開いたら267ページが出るけど、Docの説明があるのは結局117〜127ページで、JSONの例題の説明とPrettifyの説明も読まなければならない。 個人的には、この本じゃなくHaskellについてのことだけど、CやJavaから入った人には、やっぱり変数と関数がごっちゃになってるのは分かりにくい。 229ページの最後の行の liftP q f k w x y z とかシグネチャとの対応がどうなってるのか本を何分かにらまないと理解できない。 本が悪いというより、ただ単に、本をさくさく読みたい人向けの本じゃないってだけの話。
26 :
デフォルトの名無しさん :2010/04/30(金) 04:00:36
伝説のPHP作者「Rasmus Lerdorf」名言集を聞くと嫌PHP厨がファビョる ・今のPHPを作ったのは、何十人もの開発者ですよ。私は1人目の開発者だったに過ぎません。 ・問題を解くのが好きなだけで、プログラミングは大嫌いです。 ・いかにプログラミングを避けるかを考えていたら、コードを再利用するためのツールとしてPHPができました。 ・PHPは、歯ブラシみたいなものですね。毎日使うものですけど、だから何でしょう?誰が歯ブラシの本なんて読みたがります? ・パーザを書くのは苦手です。本当にダメなんです。今でもね。 ・PHPには「protected属性」も「仮想メソッド」もありますよ。情報学科の教官が「重要だ」っていうやつは何でもね。僕自身は、こんなものどうでもいいと思ってますけど。 ・プログラミングを好む人がいるのは知ってますが、全く理解できないですね。 ・僕はホンモノのプログラマではありませんから、やっつけ仕事ですよ。ホンモノのプログラマは、「動いてるように見えるけど、メモリリークだらけじゃないか。直す必要があるかもね」なんて言うでしょう?僕なら、10リクエストごとにApacheを再起動しますね。 ・いえ、メモリリークはちゃんと気をつけてますよ。でも、プログラミングってほんとクソだなと思いますね。 ・プログラミング言語を作るつもりはありませんでした。どうやって作るのかも知りませんし。論理的に必要だと思われるものを足していっただけなんです。 ・僕の発言に怒ってる人がいるようですね。僕がプログラマとしてひどいのは認めますけど、でも、多分あなたたちよりマシだと思いますよ(笑)。
>>26 同意できるな
Haskellプログラマは最適化なんて興味ないだろ
仕様を記述できればいい
>・今のPHPを作ったのは、何十人もの開発者ですよ。私は1人目の開発者だったに過ぎません。 GHCを作ったのも多数の開発者だな。 >・問題を解くのが好きなだけで、プログラミングは大嫌いです。 まさしくHaskellだな。 >・いかにプログラミングを避けるかを考えていたら、コードを再利用するためのツールとしてPHPができました。 Haskellは再利用性が高いな >・PHPは、歯ブラシみたいなものですね。毎日使うものですけど、だから何でしょう?誰が歯ブラシの本なんて読みたがります? Haskellの本は少ないな >・パーザを書くのは苦手です。本当にダメなんです。今でもね。 Parsecか >・PHPには「protected属性」も「仮想メソッド」もありますよ。情報学科の教官が「重要だ」っていうやつは何でもね。僕自身は、こんなものどうでもいいと思ってますけど。 Haskellにはプログラミング言語の研究者が重要だという奴は何でもあるな。 >・プログラミングを好む人がいるのは知ってますが、全く理解できないですね。 理解できないな >・僕はホンモノのプログラマではありませんから、やっつけ仕事ですよ。ホンモノのプログラマは、「動いてるように見えるけど、メモリリークだらけじゃないか。直す必要があるかもね」なんて言うでしょう?僕なら、10リクエストごとにApacheを再起動しますね。 俺の書いたHaskellプログラムもやっつけ仕事だな。スペースリークだらけだがnが小さいので問題ない >・いえ、メモリリークはちゃんと気をつけてますよ。でも、プログラミングってほんとクソだなと思いますね。 同意だな >・プログラミング言語を作るつもりはありませんでした。どうやって作るのかも知りませんし。論理的に必要だと思われるものを足していっただけなんです。 俺もHaskellがあれば作る必要はないと思う >・僕の発言に怒ってる人がいるようですね。僕がプログラマとしてひどいのは認めますけど、でも、多分あなたたちよりマシだと思いますよ(笑)。 まあ、Javaしかできない人よりはましだな
あちこちにコピペ投下するようなバカを相手にしてはいけない
code.haskell.org is down?
yp
脈略ないけど、Haskellでは 余データ==プログラム という意味合い?
Haskellではcodataはclassに相当するもんだと思う
余データ(codata)って何? 興味ある
モナドはたしかデータ、余データ(codata)に関する理論じゃなかったっけ。 なんでそれがリストモナドとかと関係するのか全くわからなかったけど。
>>36 ごめん、まだ分かんない・・・
ググってもなかなかそれらしい記事に当たらないし(キーワードがまずいのか)。
codata が class に相当するのだとしたら、data は何に相当するの?
そしてそれらは、どのような事柄に関して双対関係があるの?
>>37 >そしてそれらは、どのような事柄に関して双対関係があるの?
それこそ自然な同型になるようにするためだろう。
じゃないと取り扱いづらいし双対関係作る意味がないと思う。
>>38 質問の仕方が悪かったかも。
Wikipedia によると、双対は
2つの対象がある意味で互いに「裏返し」の関係にあるというようなニュアンスがあるという。
これを踏まえて2つ質問があります。
・今回の件(Haskell)において、2つの対象の一方は class ではないかと意見が出た。
ではもう一方は何に相当するのか。
・ある意味で互いに裏返しの「ある意味」というのは、
今回の件(Haskell)では何に当たるのか。
class宣言がinstanceの型からADTへの射だとしたら その矢印が反対のものはADTからinstanceの型への射 ならdataはinstance宣言になるのか?なんかしっくりくるようでこない
質問なんですが、今RWHを読んでいるのですが、putStrLnの後に $ がある場合と 無い場合がありますよね? これってputStrLnの引数が文字列リテラルだけの時は要らなくて、文字列++変数 みたいな時には要るということなのでしょうか? よろしくお願いします。
>>42 初学者の方ですね。
($)演算子(関数)は、第一引数を第二引数に適用する関数です。
($)がなくても括弧を駆使すれば関数は書けますが、
($)を使うと綺麗に書ける場合が多いのです。
> これってputStrLnの引数が文字列リテラルだけの時は要らなくて、文字列++変数 みたいな時には要るということなのでしょうか? 結果としてはそうなのだが、演算子の結合の問題。
>>42 putStrLn "foo"
の場合、[Char]型の値に、[Char]->IO ()型の関数([Char]を引数に取る関数)が適用されているので型エラーは起きない。
putStrLn "foo" ++ "bar"
の場合、関数適用は演算子の適用よりも優先度が低いので
(putStrLn "foo") ++ "bar"
と解釈されてしまって、まぁ、直感的にもおかしい。正確にいうと、IO ()型の値と"bar"型の値にリスト連結演算子(++)::[a]->[a]->[a]が適用されているので型エラーになる。
この型エラーを回避するためには、
putStrLn ("foo" ++ "bar")
と書いて、"foo"と"bar"に先に(++)を適用するようにすれば良い。
演算子($)は、
f $ x = f x
と定義されている演算子で、他のどの演算子よりも優先度は低いが、関数適用よりは高い優先度を持っている。
だから、
putStrLn $ "foo" ++ "bar"
と書くと、
putStrLn $ ("foo" ++ "bar")
と解釈され($は++より優先度が低いから)
putStrLn ("foo" ++ "bar")
と解釈される($の定義より)。よって、これでも問題は解決される。
この程度だと括弧()を使って優先度を操作するのと$を使うのとで大した違いはないけど、
sortBy f5 (map f4 (groupBy f3 (filter f2 (map f1 list))))
みたいな式を書きたいときとか、括弧()の代わりに$を使うと読みやすくなる。
47 :
46 :2010/05/02(日) 23:51:50
うわwww オレ、はずかし。
一応、Haskellでは関数合成と適用を組み合わせるスタイルが推奨されているようだ。 g x y = f1 . f2 . f3 $ x * y
誰も突っ込まないので言ってみる
>>46 > 演算子($)は、
> f $ x = f x
> と定義されている演算子で、他のどの演算子よりも優先度は低いが、関数適用よりは高い優先度を持っている。
関数適用は何よりも優先順位が高い(最高位)ですよ。
関数適用以上の優先順位のものは Haskell プログラマは定義できないです。
>>51 否。遅延評価(左最外簡約)なhakellは関数適用が最後。
4 * (3 + 2)とかは
=>4 * 3 + 4 * 2
=>12 + 8
=>20
となる。infixで指定する数値は高ければ高いほど後に回される。
f x y = x * y
g y = 2 * y
としてf x $ g yを評価するとき、$が最初に評価されないといけない。
じゃないとエラーになるでしょ?
結合則と評価順をごっちゃにしてはいけない
>>53 そっか、
>>46 は「先に評価される=優先度が高い」という話をしてたのか。
それを俺の方が結合度の話をしていると勘違いして、
>>51 で間違った指摘をしてしまったのか。
すまんかった、申し訳ない。
ちなみに
>>49 も俺、本当に悪い
GHCIで正規表現を使ってみたくて Prelude> :module +Text.Regex.Posix ってやったんですが、 Could not find module `Text.Regex.Posix': Use -v to see a list of the files searched for. と出てモジュールをロードできません。 OSはDebian lennyです(WinXP上のVMPlayer上で動かしています) これはモジュールがインストールされていないということでしょうか? 対処方法を教えてください。お願いします。
>>55 とりあえず、モジュールがインストールされているかどうかを調べてみたらどうだ?
ghc-pkg list でインストール済みパッケージの一覧
59 :
55 :2010/05/03(月) 23:54:42
$ ghc-pkg list /usr/lib/ghc-6.8.2/package.conf: Cabal-1.2.3.0, array-0.1.0.0, base-3.0.1.0, bytestring-0.9.0.1, containers-0.1.0.1, directory-1.0.0.0, filepath-1.1.0.0, (ghc-6.8.2), haskell98-1.0.1.0, hpc-0.5.0.0, old-locale-1.0.0.0, old-time-1.0.0.0, packedstring-0.1.0.0, pretty-1.0.0.0, process-1.0.0.0, random-1.0.0.0, readline-1.0.1.0, rts-1.0, template-haskell-2.2.0.0, unix-2.3.0.0 一覧には無いっぽいですね。
>>59 正規表現ライブラリはいくつもあるので、Hackageで探してインストール。
>>59 訂正。ライブラリは見つけたようなので、cabalでインストール。cabal-installがインストールされていなければ、まずそれをインストール(ぐぐればダウンロード元が見つかる)。
Linuxならディストロのパッケージを入れる方がいい aptとかで探せば出てくるはず
>>62 ディストロのパッケージだと何故か上手くいかない、
という相性の問題が以前からたびたび出てるよ。
Debian 系の報告が比較的多い感じ。
Cabal 使っておけば安全だし、他の OS でも知識が生きると思う。
そりゃあDebianにレポートすべきでは。
ディストロ系のパッケージだとpure Haskellでないライブラリも確実に処理してくれる半面、 バージョンのチェックが怪しいかもしれんね。 Deb系のパッケージシステムのことはよく知らんが、Cabalみたいに上限バージョンのチェックまでしてくれるのだろうか? それにDebianのレポジトリに入っているパッケージは全体的に古い
66 :
55 :2010/05/04(火) 18:47:03
cabal-installを入れようとしたら、timeライブラリが無いと言われ timeを入れようとしたら、baseライブラリが古いと言われ、baseを アップデートしようと調べたらGHC自体をアップしないと無理と 書いてあったので、最新のGHCをソースからインストールしたら、 Text.Regex.Posixも一緒に入り、最初の問題が解決しました。
最初からCabalでなくPortageでも採用してれば今こんなに 面倒なことにはなってなかったはず
Cabal に削除コマンドが未だに無いのも不思議だ
Cabalは参照透明性を維持します。 破壊更新・削除はできません。
>>68 ていうか、Cabalはbuild architectureだから。
パッケージ管理システムではなく、makeの置き換えだと考えるべき。
パッケージ管理はghc-pkgがやっている。
書店でざっと見て来ました。前スレだったかにハンドブックを求めていた人がいたと思うけど、 プログラミングHaskell (ISBN-10: 4274067815)で良い気がした。 RWHは長いからタイトル通り実用例題集くらいに思って、これと両方持ってると良さそうですな。
makeはautomakeでuninstallルールの自動生成できるじゃん
>>72 ghc-pkg unregisterではだめか?
>>73 依存性を考慮するのがメンドイ
ライブラリAが、ライブラリBをインストールした時に同時にインストールされたものか、
それともライブラリBをインストールする前からインストールされてたのか、
すぐに忘れる。
あと、ライブラリやドキュメント、実行ファイルを消すのがメンドイ
まぁ、これはインストールされてる場所は決まってるから、作業は簡単なんだが。
"cabal update" をしたら次のメッセージが表示された ----- (略) Note: there is a new version of cabal-install available. To upgrade, run: cabal install cabal-install ----- なので指示通り "cabal install cabal-install" をした。 しかしこのコマンドはエラーメッセージも表示されず完了したのに、 "cabal info cabal-install" をすると、次のように表示される。 ----- (略) Latest version available: 0.8.2 Latest version installed: [ Unknown ] (略) ----- 何故? [環境] Windows7 Haskel Platform 2010.1.0.0
cabal --versionの結果は?
>>76 cabal-install version 0.8.1
using version 1.8.0.2 of the Cabal library
です。
とりあえずhackageからtarball落して解凍して手動で入れてみれば?
>>78 手動で入れても相変わらず同じ結果だった。
ではビルドされた cabal.exe はどこに行ったのかと思って検索してみたら、
"C:\Users\...\AppData\Roaming\cabal\bin" にあった。
"cabal --global install cabal-install" でインストールしてみたところ、
"C:\Program Files\Haskell\bin" にインストールされた。
以前のバージョンの Haskell Platform についてきた Cabal では、
--global を指定しなくても Program Files の方にインストールされてたんだけど、
仕様が変わったのでしょうか。
それとも、うちだけ?
あと、これでも "cabal info cabal-install" をすると、
相変わらず Latest version installed: [ Unknown ] と表示される。
何が何だか分かんなくなってきた。
もう少し調べても分からなかったら、Haskell Platform を再インストールしてみる。
>>75 その現象には私も直面した。
globalとuserの両方にcabalがあり、userのほうが新しいcabalのはずなのだが、
参照されているcabalは古いバージョンのようだ。
私はHaskellのライブラリを全部削除してからGHCを再インストールした。
もっとうまい方法はないだろうか。
cabalには正しくアップグレードできないというバグがあるのかもしれない
うちではtimeとconvertibleが百年戦争やってるよ
Haskell Platform 2010.1.0.0 を再インストールしたけど、だめだった。 他のライブラリは "cabal install" でインストールしたら ちゃんと "cabal info" に反映されるのに、 cabal-install だけは反映されない。 こういうモンだと思って、もう諦めた。
cabalは変な動作をするね モジュールの依存関係を正しく理解してないことがしばしばある しかも、出来上がったパッケージが稀に壊れてたりもする cleanしてからビルドするとちゃんとしたものが出来るけど、それってどうなのよ
Haskellにはよくあること
cabalでのビルドにおけるトラブルの主因は、依存ライブラリを パッケージごとに管理しているせいではないか。 このパッケージごとの名前空間分離は、ファイル名ベースの管理と違って、 重複を避けやすい反面失敗しやすい、許容範囲の狭い方法だろう。 実験的なソフトウェアが多いHaskellにおいては、予想外の動作をするよりは 動作しないほうが安全であり、Cabalは望ましい設計だということができるだろう。 一方で、Haskellをプロダクションに使うには、ビルドを確実に処理するための 特別なサポートが必要だろう。
型Bを型Aへ変換する関数と、型Cを型Aへ変換する関数を同じ名前にしたいです。 型Bと型Cを、型Aへ変換する関数を持つクラスのインスタンスにするしかないでしょうか。
>>88 モジュールを分けて修飾インポート。
しかしそもそも同じ名前にすべき理由は何?
Example let a = B.toA b a' = C.toA c
> and [] True > or [] False GHCでこんな結果がでるんですが、これは意図してこのように定義されて いるのでしょうか? どっちも False か、どっちもエラーかの方が妥当な 気がするのです。
それはどちらもそう定義してある。 and (x:xs) = x && and xs or (x:xs) = x || or xs その2つとこれ見て実際に手を動かしてみたら分かると思うな。
93 :
デフォルトの名無しさん :2010/05/09(日) 19:53:22
94 :
93 :2010/05/09(日) 20:12:20
> 他のブラウザは、拡張子がわからない(IE、Chrome)とか、 > ソースがそのまま表示されるとか(Firefox/Win)です。 Mac (Safari, Firefox)でも似たようなものです。
>>89 ,90
ありがとうございます。
いや、今のところ特にそれで困っているという状況ではないです。
単に C/C++ などのようなオーバーロードはできるかなと思っただけです。
>>92 プログラミングHaskel 6章の課題をやっていて、and'という名前で、
まさにそのように定義しました。でも、この定義は and' [] の場合
を決めていませんし、実際にやってみたら、エラーになりました。
ライブラリ関数 and もそうなんだろうと思って試してみたら、
>>91 の結果が返ってきました。
それで質問をさせてもらったのでした。
>>96 GHC ライブラリ リファレンスの Prelude.and 関数や or 関数の説明からは、
次のように定義されているっぽいと推測できる。
and 関数は有限リスト、無限リストを問わず、
どこかにひとつでも False があると分かれば False を返す。
それ以外は True を返す(が、そのためには有限リストで無ければならない)。
or 関数は有限リスト、無限リストを問わず、
どこかにひとつでも True があると分かれば True を返す。
それ以外は False を返す(が、そのためには有限リストで無ければならない)。
なので、and [] は「それ以外」の条件に当てはまり True となる。
or [] も「それ以外」の条件に当てはまり False となる。
ここらは(代表的な)Lispのand/orとまったく同じ定義 さすがにhaskellではhead [] /= []かつtail [] /= []だけど
0個の元の論理積の値を,論理積の単位元 True で定義しておくと,0個以上の元の論理積を再帰的に定義できる. 0!(0の階乗)を 1と定義するのと同じ.
100 :
91 :2010/05/09(日) 23:57:03
ぼんやりと心がわかったような気がしました。 いただいた回答を参考に、もうちょっと考えてみたいと思います。 回答してくださったみなさんありがとうございます!
case中全部から見えるwhere節が欲しい時がある
その case 以外からは見えない where 節ということ?
>>102 case n of
0 -> f ....
1 -> f ...
_ -> ...
where f = ...
なんてことができればいいなと
>>103 case 以外からも見えていいなら普通にできるが
f x = case x of
Just a -> g $ show a
Nothing -> g "nothing"
where g s = print s
>>104 caseの各パターンマッチのwhere節
↑
この間がほしい
↓
関数のwhere節
let f = .. in case exp of ..的なスコープってこと
expの部分では見えてなくてもいいけど
その case だけ別関数にしちゃえばいい。 f x = h where h = case x of Just a -> g $ show a Nothing -> g "nothing" where g s = print s h の外からは g は見えない。 と言うことを別関数を作らずともできるように文法に組み込んでくれよ、 って事だよね
やっとわかってもらえた まあパターンマッチング部でwhere節が使えるってことは case縛りのwhereはシンタックス的に追加は不可能なんだろうけど
>>108 目次に見覚えがあると思ったら、これの和訳か。
「the fun of programming」
いろんな事に関心を持って何とか応用できないかと常に考えてる人にとっては、
7年前のものとか関係なくしっかり使い物になる本だよ。
「Real World Haskell」よりももう少し抽象度の高い実践という感じ。
各章でひとつの応用トピックを取り上げ、その中で色々なテクニックや方法論を学べる。
トピックの幅がかなり広いから、章のタイトルだけ見て
興味あるトピックだけを拾い読みするような人は、読める所が少ないかも。
また、「Real World Haskell」以上に入門書から遠い本だとは思った。
中置データ構築子などを含む基本文法は当然として、
式の置き換えによる評価の追跡とか、構造的帰納法による解析(証明)とか、
その手の基本テクニックも慣れてること前提っぽい。
Real World Haskell買って読んでるけど、いちいち話が長い。 そう思っていた時にふと本屋で「プログラミングHaskell」を手にしてあっさりしている事が新鮮だったよ。 実用(利用)例は文字通りRWHがいろいろあるので、両者を手にして往復しながら理解を進めていくのが正解かもね
>>108 高い上に難しそう・・・
フフフ 買いかな?
data でつくる代数データ型だけど、どの辺が「代数」なのでしょうか?
代数データ型間の同型関係を=, sumを+, productを* と読み替えたときに環になっているから? まあデータ型なんてどれでも代数的にみることはできると思うけど。
代数系でググれ
代数データ型でないデータ型などない 整数,実数,文字,すべて代数的だ
>>115 いや、だとしたらdataで作るデータ型にわざわざ「代数」という単語をくっつけた理由を知りたいです
>>111 すまん、
>>109 は脅すつもりはなかったんだ。
買っとけ。
読んでいるそばから応用したくなる衝動を抑えるのに苦労する。
「Real World Haskell」が楽しめた人ならこれも楽しめるし、
関数型プログラマとして絶対にパワーアップできる。
扱うテクニックは「Real World Haskell」よりもより関数型らしさが出てる。
そのため高度だが、解説はこちらの方が筋道が立ってて、むしろ分かりやすい。
ただ、日本語がどうなってるか知らんがな。
罠なんだろうか Network.Socket.SockAddrInet :: PortNumber -> HostAddress -> SockAddr PortNumberの方はWord16のnewtypeでfromIntegralにエンディアン変換が仕込んである HostAddressの方は単なるWord32のtype-synonymなので自分で変換する必要がある どっちかに統一してくれ
ファイル処理の関数を書いたら、シグネチャが String> IO String みたいにIOがつく関数がたくさんできるんだけど、これがRWHが言うところの「汚染される」ってこと? 上手に作るとIOがついてない関数で置き換えられるってこと?
>>120 処理対象がファイルなら必然的に IO ばかりになる。
ファイルは Haskell の知らないところで変わったり消えたりするんだから。
処理対象がファイル名やメタデータ(作成日時など)、コンテンツなどなら、
外部との出入り口だけ IO で処理して、あとは IO 無しでいける。
前者と後者を上手く「切り分ける」ことが大事。
>>120 だけの情報だと、こういう至極当たり前な事しか言えない。
The fun of programming持っている人に聞きたいんだけど、Fig. 1.2で 1 /\ 3 2 | | 4 5 に「6だけ」の木を追加する次の段階って、何故2-5の枝の方にくっ付けたんでしょうか?3-4の方に付けちゃ駄目? joinの定義式のaa bb ccに該当するものを考えてそうなるのかと思ったのだけど、そうすると上段では 左側に2・右側に3の枝になっているのが、下段に行くと左右逆転して左が3の枝になってるのも分からない。
>>122 1 から 7 まで順に insert すると図のようになる理由は、
4ページ目と5ページ目にある定義に従って簡約を追いかけていれば必ず分かる。
insert 1 Null
=> merge (Fork 1 1 Null Null) Null
=> (Fork 1 1 Null Null)
insert 2 (Fork 1 1 Null Null)
=> merge (Fork 1 2 Null Null) (Fork 1 1 Null Null)
=> join (Fork 1 1 Null Null) (Fork 1 2 Null Null)
=> Fork 2 1 (Fork 1 2 Null Null) (merge Null Null)
=> Fork 2 1 (Fork 1 2 Null Null) Null
insert 3 (Fork 2 1 (Fork 1 2 Null Null) Null)
=> ...
Haskellってひょっとして、言語の学習コストが、ソフトの保守コストよりも大きいんじゃね?
>>124 初心者卒業レベルまではそれほどでもないのだが、そこから製品開発に使えるレベルまでいくのが大変
- 要求性能が出ないとき
- 結果が変なとき
に、短時間で原因を突き止め修正できるようになるには、相当の練習が必要
言語に関する総コスト一定の法則
コメント文に見たことのない演算子が書いてあったから、どういう意味なのか考え込んだ それがこれ :-)
:-p
><
^^
:-) これがぱっと見で演算子に見えたのか まだ Haskell に慣れていないんだな
: D
</>
顔文字プログラミングとかできないだろうか
(:[]) は比較的良く使うよね
getChar ってキーボードから文字を何回入力しようとも、 最後に改行を入力しない限り関数から処理が抜けないと思うんだけど、 そうすると最初の一文字だけ取得して残りはバッファに残ってしまう。 なので次に getChar するとユーザーのキー入力を待たずに、 バッファに残っている先頭の文字を直ちに取得してしまう。 最後の改行も含めた複数のキー入力のうちで 最初の文字を取得するだけなら getLine と head でいいんだけど、 ユーザーに改行を入力させずに、一文字のキーを入力したら 直ちに関数から抜けてその文字を取得できるような関数は 標準ライブラリには無いですか?
>>137 hSetBuffering stdin NoBuffering
139 :
137 :2010/05/17(月) 07:20:53
>>138 次のようにやっても効果ありません。
main = do
hSetBuffering stdin NoBuffering
a <- getChar
b <- getChar
print a
print b
main を実行すると入力待ちになり、[a] キーを押すとコンソールに a と表示され、
さらに入力待ち状態になります。
次に [Enter] キーを押すと、下記のように表示されてプログラム終了です。
'a'
'\n'
>>139 正しい動作じゃない?
getCharを2回繰り替えしてからprintしてるんだから
改行くるまでバッファリングしてるのは端末だお
>>139 a <- getChar -- 'a'
b <- getChar -- '\n'
print a
print b
いや、俺の環境(Linux, GHC 6.10.1)だとhSetBufferingだけで端末のバッファリングまで無効になるよ
144 :
137 :2010/05/17(月) 12:49:39
>>140 hSetBuffering stdin NoBuffering
a <- getChar
print a
b <- getChar
print b
としても結果は同じでした。
つまり、最初の入力待ちで [a] + [Enter] を押さないと処理が進まず、
次の getChar は入力待ちされずにすぐに処理が戻り、b には '\n' が入ります。
>>142 言いたいことが分からない。
きつくてもいいので、はっきり言葉で言って欲しい。
>>141 ,143
ということは、Windows7 のコンソールが悪いのか。
であれば諦めるしかないですね。
>>144 私の環境では、
>>144 のプログラムは期待通りに動作しました。
a'a'
b'b'
Linux, runghc 6.12.2, xtermです。
コンパイル時間よりリンク時間(と空間)をどうにかしてほしい ldにmlにあったパッチ当てたけどまだ遅い
149 :
137 :2010/05/17(月) 18:16:32
>>145 なんと GHC 側の問題でしたか。
それならば気長に待つことにします。
Haskell Platform に反映されるのはいつになることやら分からんが。
ldからgoldになればあるいは…
151 :
デフォルトの名無しさん :2010/05/18(火) 14:04:02
foldr (+) 0 [1..5000000] の計算で以下のような実行時統計を得た この見方を教えてください。 $ T07t_r 5000000 +RTS -sstderr -K800M c:\G\check\Haskell\ex\test\T07t_r.exe 5000000 +RTS -sstderr -K800M 12500002500001 892,941,300 bytes allocated in the heap --- @ 330,061,040 bytes copied during GC 167,842,072 bytes maximum residency (10 sample(s)) --- A 117,910,940 bytes maximum slop 327 MB total memory in use (2 MB lost due to fragmentation) --- B @ , A , Bの表す意味の違い スタックの使用量はここには現れていない?
>>151 >892,941,300 bytes allocated in the heap
確保された領域の延べサイズ
たとえば「1MBの領域を確保→直後にGCで回収」を100回繰り返したなら、延べ確保量は100MBになる
>167,842,072 bytes maximum residency (10 sample(s))
ある瞬間におけるresidencyというのは、その時点で生存しているヒープオブジェクトの大きさの合計
maximum residencyはこれが最大になる瞬間の値
実際にはこの例だと10回だけresidencyを調査して、その最大値を報告してる
>327 MB total memory in use (2 MB lost due to fragmentation)
OSから確保して使っているメモリ量の瞬間最大値
maximum residencyの約二倍の値になってるのは、コピーGCだから
スタックはヒープの一部として確保されるんじゃなかったっけ
153 :
デフォルトの名無しさん :2010/05/18(火) 19:46:16
>>152 ありがとうございます。
>スタックはヒープの一部として確保されるんじゃなかったっけ
C言語の感覚で別々にアロケートされると思い込んでいましたが、
ヒープ、スタックともGHCのランタイムが割り付けたメモリの
合計の量をいっているのでしょうか?
foldl と foldr の比較で、RWHには「foldr、あるいはfoldl'を使うのなら
スペースリークに悩まされることはないでしょう」とありますが、foldr でも
foldl の70%〜程度の統計が得られるます。これはスペースリークとは呼ばない
のでしょうか?
>>153 未評価の値が無駄に蓄積されてヒープを圧迫することをスペースリークと呼ぶなら、
foldr自体がスペースリークを引き起すことはないね
ただし、foldrは末尾再帰じゃないので、そもそもの空間効率が悪いことが多い
プログラミングHaskell ↓ Real World Haskell ↓ ふつうのHaskell と読んだが、順序がまったく逆だったような気がするw
プログラミングHaskell ↓ Real World Haskell ときて、次の「ふつうのHaskell」に何を期待してたんだ?
プログラミングHaskellを読み終えて 次は何を読んだが良いだろうか 以下候補 Real World Haskell 関数プログラミング 関数プログラミングの楽しみ(2010/06発刊) 目標としては「関数型言語らしいプログラミング」が行いたい
>目標としては「関数型言語らしいプログラミング」が行いたい 本読むより実際にコーディングしたり人のソース読んだ方がいいよ
>>157 その目標とその候補であれば「関数プログラミングの楽しみ」を薦める。
>>158 本には人のソースが載ってるし、
なぜそのソースになったのかの解説もついてるんだがな。
練習問題も載ってるし。
何か問題があるのか?
さすがに完成されたソースが丸ごと一式載っていることはまずないが、
「関数型言語らしいプログラミング」を学ぶのにソース丸ごと一式は要らないだろ。
そもそも、何が関数型言語らしさを作っているのかを知らないまま、
実際にコーディングしたり人のソース読んでも、分からないままだと思う。
>>156 そういうレスがあるとは思っていた。尼のギフトカードの残高で丁度中古の
「ふつうの〜」が1冊買えたんだよね。だから一層のこと揃えてみただけ。
ただ最初の2冊で分かりにくかったことが、サラっと「ふつうの〜」に説明して
あったりして、最初に読んどけば良かったなと。
>>159 人のソースはともかく、自分でコーディングしてみないと結局伸びない
>>160 > ただ最初の2冊で分かりにくかったことが、サラっと「ふつうの〜」に説明して
> あったりして、最初に読んどけば良かったなと。
そういう読み方のタイプも普通にあるし、推奨している読書テクニック本もある。
難解な本を読んで、ある部分が難しかったら、別の一段レベルが低い本を読んで、
それから先の本に再チャレンジする。
>>161 コードをただ書くだけで伸びるってものでもないけどな
インプット(読む)とアウトプット(書く)は両方あった方がいい
学びて思わざれば則ち罔し。思いて学ばざれば則ち殆うし。
他の言語だけどCoq'Artみたいな本だと書きながら読まないと意味不明になって挫折する
伸ばす方向と方法が分かってないと、効率悪いよ。 それが本の役割だと思う。
効率悪いよ。
169 :
デフォルトの名無しさん :2010/05/19(水) 16:00:58
Software Designの記事読んでたら、なぜかnobsunがHaskellプログラミングの第一人者って書かれてるw おいおいって感じw
>>169 nobsunって誰?と思ってググってみたらツイッターやってて
しかもHaskell公式のマークを上下ミラーリングして(λ→y)
自分のマークにしちゃっててワロタ
171 :
デフォルトの名無しさん :2010/05/19(水) 16:33:31
nobsun、論文も書いた事ないような奴が第一人者気取りかよw 笑っちゃうぜ
2ちゃんねるで吠えるだけの奴が「笑っちゃうぜ」ってのが一番笑えるなw
>>171 まぁ、プログラミングの分野は論文がすべてじゃないからね。
ソフトウェア論文がいかに評価されないか、研究者ならみんな知ってるはず。
nobsun は「RWH」と「関数プログラミングの楽しみ」の翻訳やってる。 日本でのエバンジェリストとしての第一人者だね。
nobsunはHaskellで新規性ある何かをやったの? 開発手法を編み出したとか 斬新なソフトを書いたとか ツールを開発したとか Haskellコンパイラのすごい最適化エンジンを実装したとか、 なにか無いの?
nobusunこと山下伸夫さんはsampou.orgの管理者で ふつうのHaskellプログラミングの監修もしていますね。 どう見ても日本のHaskellプログラミングの第一人者です。 笑っちゃった人は自分の無知を自覚すべきだと思います。
>>176 俺の答えは、日本にはマトモなHaskellerはいない、って事だよ。
RT @_tad_: 懇親会終盤「この中でGCに興味のある方、ちょっと挙手お願いします」→「ありがとうございます。では片付けをよろしくお願いします」 #rubykaigi ※この物語はフィクションです
nobsunはHaskellでうまいこと金儲けてる人 白石さんはHaskellに人生食われちゃってる人
>>179 評価が早計だな
もっと評価を遅延すべき
>>180 つまり、宇宙の終りの時に初めて評価されるんですね
>>177 その中の第一人者ってことでいいだろ
所詮相対評価だ
プログラマーというのは実践家で、スポーツ選手みたいなものだから、 新しいことをしなくても、技のレベルが高ければ評価は高くなると思う。 Haskellの技とは? とかnobsunはレベルが高いのか? はおいといて。
Software Design に、関数型言語ではHaskellが一番ユーザーが多いと書いてあったんですが、本当でしょうか?
>>184 Lispの方言を別の言語として数えればそうかもね
>>184 んなわけあるかいw
と言ってしまえばその記事と同じなので
ちゃんと調査が必要ですね。
そういう話をするとocamlの人が雪崩れ込んでくるから
選択肢はほぼ2択に絞られる・・・
純粋で非正格な関数型言語では一番多いんじゃね?
>>189 もう1つって何?
Concurrent Clean?
Lazy K?
立ち読みしたけど、 関数型言語を始めるなら純粋な言語がいいという理由でHaskellを勉強する人が一番多い みたいなことがSoftwareDesignに書いてあった気がする
俺としては関数型言語初心者はML系の方がいいんじゃないかと思うけどなぁ
実用レベルのプログラムを書くのでなければ、Haskellの方が楽だと思う。 前方参照できる let/let recの区別が不要 deriving (Eq, Show)がある インタプリタが使いやすい 方言がない 構文がCに似ている --makeで万事よろしくやってくれる
SoftwareDesignといえば、Haskellで書いたWEBサーバが紹介されてましたけど、 JavaのTomcatみたいに、サーバ部分とは独立して作ったアプリケーションを追加していくようなサーバコンテナってないでしょうか それとも、関数型言語だから、Mighttpdみたいなサーバでも、TomcatみたいなWEBサーバコンテナになるのでしょうか
>>196 Tomcatがどんなものか知らないが、お遊びのウェブアプリケーションを書くならhackがおすすめ。
リクエストをレスポンスに変換する関数を書くだけでウェブアプリケーションを実装できる。
バックエンドのサーバはFastCGIやhappstackなどアダプタさえあれば何でもいい。
本格的なウェブサービスを構築するにはそもそもHaskellを使うべきかどうかが問題。
Hac ΦのΦって何だよと思ったらPhiladelphiaのphiか
199 :
デフォルトの名無しさん :2010/05/21(金) 21:12:53
実用にならないプログラムって…
>>199 実用にならないというか、production-qualityでないプログラム。
具体的には、Haskellに多い実験的なライブラリや、
品質上の理由でミッションクリティカルな用途に耐えないインターナルなソフトウェアなどが含まれる。
Haskellにもブレークポイントを張ったりステップ実行できるデバッガが欲しいな。 1ステップ = WHNFの1-stepリダクションで。
品質とは具体的にセキュリティや堅牢性など。 ソフトウェアアーキテクチャの文脈で定義される品質属性すべて。 製品に使われた実績の少ないプラットフォームは一般にエコシステムが弱いので、 製品に使うには不適当。
ところでLLVMバックエンドが話題になっているが、 LLVMというのは本格的なシステムの運用に使えるようなものなのか?
>>201 一応 ghci でブレークポイント張ったりステップ実行できるけど、
ステップ単位は望んでるものではないな。
>>201 と思ったけど、改めて使ってみたら結構ステップ単位が細かい。
もしかしたら望んでるものに近いかも知れんぞ。
「1ステップ = WHNFの1-stepリダクション」が具体的に
どういうステップ単位かよく分かんないけど。
206 :
デフォルトの名無しさん :2010/05/22(土) 08:04:20
どんなときに必要なの? 30行もいくような関数でもつくってるの?
>>206 文脈から察するにデバッガのことか。
自分ではちゃんと動作するはずだと思い込んでて、
紙と鉛筆で簡約のステップを書いて確かめた(証明した)はずなのに、
何故か上手く動かない(実際には証明されていない)時なんかに役立つ。
IO 以外のモナドで do 表記をしている時とか、例外が発生する時とか。
そもそも紙と鉛筆による簡約が面倒な時。
特にGUIを使ってる時は面倒だ。
外部入力の値を確かめる時。
print や GUI で確認表示するコードをいちいち挿入して、後で取り除くよりも、
デバッガで確かめた方が早くて安全な場合もある。
ただ、ghci のデバッガは無いよりマシ程度のものなので、
願わくばもっと使いやすい本格的な Haskell デバッガが欲しいな。
できればビジュアルなもので。
208 :
デフォルトの名無しさん :2010/05/22(土) 15:59:19
209 :
デフォルトの名無しさん :2010/05/22(土) 16:00:31
ハスケラーさんたちも紙と鉛筆で練るのか。リスパーちゃんたちと同じだな。
λ式ってPCで書くにはLaTeXがないと書きにくいもんねw 手のほうが楽でいいよ。
211 :
デフォルトの名無しさん :2010/05/22(土) 16:08:00
ちなみに使ってるノートって 方眼系? ただの白紙? 罫線系?
モールスキン
やっぱ知的=モールスキンでしょ。 見た目だけ知的w
ちら裏コピー裏をクリップでとめたもので十分だろ 近所回って回収してくりゃあっという間に段ボール10箱分ぐらい集まるし
>>211 secion系。
私はあまりたくさんのノートを書かず、そしてグラフィックの割合が高いからだ。
>>215 Haskellプログラミングに使うノートの話をしているんだが。
今更ながらHaskell-Beginersに入ってみたんだけど色々話題が出てていいね。
218 :
デフォルトの名無しさん :2010/05/22(土) 18:56:24
>>219 > A fast HTTP server library with an optional high-concurrency backend using the libev event loop library.
これは期待できそうだな
今度Haskellの入門的な話をすることになったんだけど、 Haskellはじめての人が理解しにくいところってなんだろう? 自分の場合、ラムダ計算やPCFを先にやってたから入りやすかったが、 この辺を知らない人がいきなりHaskellに接したときにつまづくところ があったりするのかな?
>>222 どんな人を対象に話すのかで変わると思うよ。
相手が計算機科学の人なのか? プログラミング言語をひとつくらい習得している
人なのか?まったくの素人なのか?
とかね。
変数を一つだけしか受け取れないとかの原則論がわからんかった。 どうしても多変数脳から脱却出来ん。
>>223 C, Javaについて一通り習った人が相手です。
>>224 モナドですか…さすがに初回からはきついかも。
>>225 なるほど。
その辺、可換図式でも使って説明しますかね。
俺が苦労したのはラムダ式、高階関数、再帰の三つかな これらがいくつか組み合わさったコードを見ると途端に混乱するということがあった それぞれ単独でみれば難しくないし、再帰は既に知ってるだろうし、他も教えられればすぐに理解できるだろうけど、 自在に読み書きできるようになるには時間が必要で、最初のうちはfoldrの定義なんかすごく難しく見えると思う
どうせ触りだけ話すんだろうから、モナドはあまり触れなくてもいいかもね。 c,java系の人なら関数型特有にみえることはわかりにくいかも。 30分で話すとか10分で話すとかなら簡単なことしか話せないだろうしね。 でも高階関数あたりは欲しいかもね。
C/JAVA の人ってloopyだし非loopyのhaskellの世界は戸惑うだろうな。
モナドは IO 以外は使わなくても説明できるからとりあえず置いておけばいいんじゃないかな。 IO も、こう書くものだ、で済ませるか、対話環境だけ使うことにするとか。 個人的には、いちばん理解しにくいのは関数適用だけでプログラムを書くということだと思う。 ループしながら変数に代入、みたいなのから map して filter して fold になかなか切り替えられない。
hello, worldについては気にしないでください、で最初は押し切ってしまうとか。 入力ができないのがプログラムの題材的にちょっと辛いけど。
Haskellの話を聞いてくれる気になってるなら 一番高い壁はクリアじゃね?
>>230 > ループしながら変数に代入、みたいなのから
> map して filter して fold になかなか切り替えられない。
リストの長さを出すのに「各要素を1に変えて合計」ってのは受けるぞ
>>233 その前にsumをfoldで定義することが関数型特有じゃないか?
ぱっと見で何の役に立つのか分かりづらい機能について 実例を見せると納得してくれる
逆に、CやJavaについて一通り習った相手が、 一番惹かれそうなものは何かというアプローチはどうだ? そこに、一番分かりにくいものを絡めていくとか。
たらいがそのままで爆速
副作用とhaskellやc/java のこともかも
240 :
デフォルトの名無しさん :2010/05/29(土) 15:19:22
逆に素人にCやJavaの話するときって何話すの?
まずはhello, world
まぁ、社交の基本だけど、何か専門的な事を素人に話す場合、 人物を語るのが一番良い印象を与えやすいんだよね。 関数がどうのこうのと技術的な話なんて興味を持つ動機には成り得ないよ。
えー? 人物について語るのって専門の話を回避するテクニックであって、 専門的な事を話す目的があったらそれじゃダメじゃん。
>>241-244 何に対しての「逆」を想定してるんだ?
>>222 ,226 の逆であれば、Haskell を一通り習った人が
CやJavaの素人に入門的な話をするという事だと思うが、
それなら Hello, World も、人物の話も、
それほど適切ではないような気がするが。
Haskellから入門するって、従来では考えられなかったケースだからね。 データ構造にしても、可変の方がはるかに蓄積が多いから、まず不変を学習してから可変に移るというのは異常。
みなさん、ありがとう。 あれから、つまるところ関数型言語の本質はなんだろう、などと考え始めて 1日つぶれてしまいました。 余り大上段に構えず、こんな便利なことができる、程度の紹介にとどめておいた方がいいですね。 とりあえず高階関数だけはおさえておこうと思います。
Software Design の、この前出た号に、ちょうど特集がある。
>>249 あれはあんまり参考にならんぞw
考え方が偏りすぎている
そもそもHaskellerに中立的な視点の人なんているのか?
この世の誰一人として社会的中立な人間なんていないと断言できる。 だってその人自身が社会を構成する人間の一人なんだから。
>>248 高階関数と再帰の具体例を挙げて関心を持ってもらうストーリーがよさそうですね。
あとは「変」数じゃなくって…って話かな。
C言語の人は関数ポインタを使うのとどう違うの?とか聞いてくるかもしれませんね。
え?そんなビギナーの聴衆はいないって?w
関数ポインタでは書けなくて、高階関数が必要な例ってあるのかな?
無限リストは他の関数型言語を知っている人でもなかなか理解しにくくない?
俺は A Gentle Introduction to Haskell の fibs の例はなかなか理解できなかった。
>>247 既存のアルゴリズム本を参考にして
リストに (!!) でアクセスしまくるコードを書いて来た人を思い出した
無限リストといえば、ストリームや遅延パターンの話でよく例示される server と client のプログラムを理解するのに時間がかかったな。 紙に鉛筆で簡約ステップを書き下して正しいと頭では分かっていても、 初めは問題なく動くのがなんか不思議な感じだった。 ああいうのをスラスラと例示できるようになりたいな。
Prologやったことあれば無限リストはおなじみ
>>256 ないよ
値としての関数は、ローカル変数の値を記録したオブジェクトと生の関数ポインタの組み合わせ(クロージャ)で表現できる
実際GHCなんかはコンパイル時に似たような変換してるはず
261 :
デフォルトの名無しさん :2010/05/29(土) 23:12:02
なぜかHaskellの講義なのにコンスセルの説明で時間を取られる気がするw
相手がlisperなら色々と話が早そうだ
クロージャについては、実現可能だけど関数ポインタだと面倒っていう例になるかな。 Java の人なら、環境をフィールドとして持つ call メソッドだけが定義されたオブジェクトみたいなものと言えば通じるんだろうか
「Haskell は論文を書くためだけに作られた言語です」
「それなのに実用になるって、凄い事だと思いませんか?」
>>264 LLの王様で超実用言語のperl6がhaskellで作られた、つまり、haskellは超超実用言語だ。
perl6って使われてんの
Perl6のリリースは6月の予定だよ
>>264 prolog がかまってほしそうにこっちを見ています
cabalファイルの書き方についての質問ですが、 実行ファイルの保存先を./binにしたいのですが、 どのように書けば良いでしょうか?
>>270 CabalのBuild-type: Simpleは典型的なケースを「シンプル」に記述できるようにデザインされている。
Executableのパスを明示的に指定するのは典型的なケースではないので、他のBuild-type、たとえばCustomなどを調べてみてはどうだろうか。
>>260 そもそも汎用プログラミング言語はすべてチューリング等価なんだから、
できることは同じ。
生産性と実行効率を改善するための努力が延々と続いている。
cとかjavaとかは関数型に比べれば冗長だもんな。 思考にとって無駄が多すぎる^^; そのてん 生産性の向上はあるわな。
>>273 なにを生産するかによるな
OSを生産させたら関数型のほうが冗長かもしれないし
関数型のキラーアプリである「あれ」を生産させたらもちろんCのほうが冗長だよね
HaskellのキラーアプリといえばParsecだろ
>>274 「あれ」って何? もうさっきから気になって気になって、仕事が手に付きません
>>274 どんな種類のソフトウェアを書くにしても関数型がCより冗長にしか書けないということはありえない。
OSがCで書かれているのは、抽象レベルの高すぎる言語はportableでないからだ。
少なくとも昔は、lispなどでは十分に速い実行コードを生成することができなかった。
Linux のドライバを書くのに C より Haskell の方が簡潔に書けるとは思えないなあ。
それはLinuxのOSモデルが関数型に適していないからだ。
関数型に適してないモデルでは簡潔に書けないとすると
>>278 の主張と矛盾が生じるね。
>>278 は『ありえない。』って言い切っちゃってるから。
lispマシーンが主流な世界だったら変わってたよ。
種類=用途だから。 C言語で書かれたプログラムのエミュレーションにはC言語が最適だろう。
ひとつの関数を書くという意味ではHASKELLとか関数型のほうがC/JAVAより 短くなるよ。その辺のことを冗長で思考を止めやすいといってる。 ちがう? 関数型って思考に素直な印象が強いんだけどな。手続き型って思考する前 の前準備というのか余計な操作が多いという印象なんだな。 手続き型になれちゃってる人には関数型は面倒なんだろうね。
現実には、C から呼び出せる GC のライブラリを作りたいとか、特定のアプリケーションの プラグインを書きたいとか、Haskell では到底簡潔に書けない様な『種類』のソフトウェアも 沢山あるよね。
>>284 その関数が実行される環境を無視するならね。
本来考慮すべきかもしれない事を無視していいなら、それは思考に素直にもなるでしょう。
それぞれの言語に強みがある。 Haskellは、記号的な問題を解くのに強い。 そういう問題は関数に落とし込めるようにあらかじめ抽象化されているから。 > 特定のアプリケーションのプラグインを書きたい Lispでマクロを使うといい。
>>287 >> 特定のアプリケーションのプラグインを書きたい
>Lispでマクロを使うといい。
これってどういう意味だか誰か分かる?
Lisp って CL の事で良いのかな?
マクロはリーダーマクロ?
それとも defmacro の話?
それでどうやってプラグインが書けるの?
ちょっと話が見えないな。
結局、関数型で書き易い問題とそうでない問題の両方があるってことで異論は無いよな?
>>288 記号的というと
・variantがあればLisp風のデータ構造 (括弧は少なめ) を作れる
・concatMapがあればPrologみたいなのを作れる
ただし、クロージャと同じく、関数型ではない言語に取り入れられるかもしれない。
>>291 フィボナッチのように数学の問題ということではないかと
質問に答えられないなら、無理にレスしなくていいよ
>>268 なにを指して無視といってるのかがよくわからない。
>>248 結果はまだ先なのかな。どんな反応があったか、よかったらレポートして下さい。
>>248 2ちゃん規制されていたから、亀レスだけど、「こんな便利なことができる」っていう紹介で良いと思います。
例えば、(都道府県名, 市長村名, 人口, 面積)みたいなリストを作っておいて、それをmap、filter、sortBy、groupByで操作して、都道府県を人口順に並べるとか、ある県の人口密度を出すとかを、ghciでやると面白いのではないでしょうか。
>>297 そうですね。
Haskellの素晴らしさを示すには、オーディエンスが慣れ親しんだ問題を
エレガントに解く方法を示すのがいいと思います。
彼らが使っている手続き型言語による解法との比較もしてはどうでしょうか。
でもただエレガントというだけでは、感情的な反発を引き起こしたり、
マニアックな奴だと思われるかもしれませんから、
人気度やパフォーマンスなどの客観的(統計的)なデータを示し、
長所と短所の両面も伝えてはどうでしょうか。
>>272 それは話してるレイヤが違うだろ
CにもHaskellにも「関数」と呼ばれるものがある。Cの関数は実行時に作れないがHaskellのは作れる
ではCの関数だけを使ってHaskellの関数の真似をすることができるか?みたいな問題
ここでいう「真似」というのは関数に渡せるとか変数に入れられるとかそういう言語の「内部」での性質を真似するということ
チューリング完全性の議論はプログラムが全体としてどういう振る舞いをするかしか問題にしていないので、別の話
(訳注) Haskellは実行時にCの関数を作れないが、Cは実行時にHaskellの関数を作れる Cの関数だけを使ってHaskellの関数の実装をすることができる 「実装」というのはHaskellの「内部」を実装するということ
Cは貴金属の現物みたいなものだな 他の言語は、金融工学を駆使した電子マネーを目指しているようだ
いまいちよくわからない比喩だな。 Cはどこでも動くが、金塊はどこでも貨幣として使えるわけじゃない
>>301 というか電子マネーと金融工学ってあまり関係ないんじゃないか
絶対に関係ないと言い切れないところが面倒臭い
貴金属の現物 → 具体的なもの 電子マネー → 具体的なものと機能は同じだけど、実体ははきりせず抽象的なもの 金融工学は、その抽象的なものから成り立つのを助け、利益を出そうとするもの。 C → 具体的にメモリをいじくったするもの JavaとかPHPとか → 具体的なものと、機能は同じだけど、にラップをかけて抽象的に扱う。動作は遅い。 金融工学 → ガーベージコレクション
Cも高級言語だし。 ポインタ演算はあるがメモリ割り当てまでコントロールするわけではない。 JavaのHotSpotみたいな最適化技術は金融工学みたいなものといえなくもない。
>>279 Haskellを C言語にコンパイルする言語をHaskellで作ればいいんじゃね?
>>307 C のソースを吐いても GC 前提だったりランタイムライブラリが必須だったら使えないでしょ。
なんでHaskellはCの関数作れないの?
>>308 その昔、JavaOSというOSが勝手にGCしちゃう変なモノがありましてね…
>>310 クロージャは「定義された場所のほかに、生成された時刻を持つ」。
(時刻とか言ったら怒られそうだが)
一方、Cの関数はコードの場所だけで特定される。
コードを変更して再コンパイルとかしないと、新たな関数を作ることはできない。
>>311 OS レベルで一括してメモリを回収するのは別に良いと思いますよ?
今はそういう話はしていないですけどね…
foreign import "wrapper"でCの関数作れるよ
evalがない言語は、「関数を実行時に作れる」とは言わないと思う。
お薦めの入門書を教えてください
>>304 そういう場合は、強硬に主張している相手を値踏みして、
切っても問題なさそうな感じだったら無理矢理切ればいい。
真実がどうであろうと、どっちみち現時点では時間の浪費に
しかならないという算段がつくならその話は結局無駄。
>>315 ということは、lex+yaccは「関数を実行時に作れる」言語ということになりますな
Haskellが実行時に関数を作れないってのは、 Haskellが実行時にリストを作れないっていうのと同じくらい馬鹿げてる foreign import "wrapper"は実行時にコード生成するし
320 :
デフォルトの名無しさん :2010/06/01(火) 23:18:39
1 :名無しさん@どっと混む:2009/12/14(月) 20:45:15 ID:unnBMLw10
高根社長のSM趣味サイトMaskRと
副業のSMクラブ銀座プレジス・動画配信専門リアルミストレスばかり語られるが
高根社長の本業コムラッドについても語ろう
銀座プレジス
http://www.prezis.jp/top.htm MaskR
http://maskr.com/ プレジスを語ろう
http://set.bbspink.com/test/read.cgi/sm/1246009466/ 動画配信専門リアルミストレスってどうよ?
http://set.bbspink.com/test/read.cgi/sm/1249183350/ 9 :名無しさん@どっと混む:2010/01/03(日) 18:27:00 ID:RSEbBiG0O
高値はもう大麻やめたの?
10 :名無しさん@どっと混む:2010/01/04(月) 05:15:29 ID:A3l1qdv+O
タカネ社長ってどうやってばれないように脱税してんだろ?
億単位で脱税して億ション暮らしなんて凄いよな
監査役の奥さんもグルなのか?
12 :名無しさん@どっと混む:2010/01/05(火) 01:47:06 ID:KAHwqMrBO
株式会社Comrade株式会社コムラッド株式会社Comrade株式会社コムラッド株式会社Comrade株式会社コムラッド株式会社Comrade株式会社コムラッド株式会社Comrade
株式会社Comrade株式会社コムラッド株式会社Comrade株式会社コムラッド株式会社Comrade株式会社コムラッド株式会社Comrade株式会社コムラッド株式会社Comrade
13 :名無しさん@どっと混む:2010/01/05(火) 01:47:47 ID:KAHwqMrBO
高根英哉高根英哉高根英哉高根英哉高根英哉高根英哉高根英哉高根英哉高根英哉高根英哉高根英哉高根英哉高根英哉高根英哉高根英哉高根英哉高根英哉高根英哉
321 :
デフォルトの名無しさん :2010/06/01(火) 23:19:21
18 :名無しさん@どっと混む:2010/01/07(木) 09:26:06 ID:5NL2jyJpO
高根はMASKRでレイプ仲間募集するのやめたんだね
mixiで募集中か
21 :名無しさん@どっと混む:2010/01/10(日) 19:36:45 ID:FdRwgXUTO
風俗店やってるってことは高根社長は暴力団と繋がってるんだね
どこの組にいくらみかじめ料払ってるんだかw
23 :名無しさん@どっと混む:2010/01/23(土) 03:43:12 ID:Pdcv8aq0O
タカネ社長未成年に酒飲ませてレイプ
24 :名無しさん@どっと混む:2010/01/29(金) 18:16:06 ID:zMwtdkIsO
高根社長のレイプ趣味は病気だから治らない
25 :名無しさん@どっと混む:2010/02/01(月) 01:39:32 ID:uaH5mo2nO
前科者
26 :名無しさん@どっと混む:2010/02/09(火) 00:52:46 ID:JwGmN2cG0
>>25 容疑はレイプ?買春?管理売春?公然猥褻?薬物?脱税?詐欺?傷害?
28 :名無しさん@どっと混む:2010/02/14(日) 22:56:30 ID:lykq8x1VO
どこかのスレで人を死に追いやったと書いてあった
33 :名無しさん@どっと混む:2010/03/04(木) 12:49:19 ID:J8YxaRGO0
金がないって脱税がばれて追徴課税でも来たか?
せっかく脱税の隠れ蓑にプレジス営業してるのに残念だったなw
38 :名無しさん@どっと混む:2010/03/12(金) 21:09:53 ID:L0W4+sivO
首吊り首絞めプレイ大好き高根英哉
322 :
デフォルトの名無しさん :2010/06/01(火) 23:20:03
53 :名無しさん@どっと混む:2010/05/17(月) 13:14:06 ID:E/7OZVtz0
>>18 高根英哉blogでレイプ仲間募集中
私とともにマスクの女どもを弄ぶ仲間を募集する
急に思いついたら連絡をして、集まれるような仲間だ
だから、複数名募集するし、いついつという日時があるわけでもない
条件は以下のとおりだ
・SMを実践している、または興味がある
・マスクを用意できる
・都内でイベント参加できる
・イベント内容およびこの仲間を通じて知りえた情報を口外しない
・成人男子である
・携帯電話および携帯メールアドレスを私に公開できる
・酒が好きである
希望者は私宛にメールを送ってほしい
全員が参加できるわけでもないので、こちらの選択に任せてもらう
なるべく想いを書いてもらうほうがわかりやすいし
経験や顔写真も歓迎。
r
[email protected] [email protected] [email protected]
コピペ君って馬鹿だな、まで読んだ。
実行時コード生成機能なんてあるんだ Haskellは型安全な言語だと思っていたのに…
何をいまさらw HaskellのFFIは、Cと同程度の自由度じゃん 純粋でなくてもいい部分は限りなく自由なのも、Haskellの魅力だと思うね
素晴らしい。 ちなみにmapする関数をユーザに入力させるプログラムはどうやって書けばよいでしょうか? getLine >>= \s -> map (??? s) xs
mapMを使ってください
>>326 お望みのものと違うかもしれないけど。
ghc --make -package ghc Main.hs
module Main where
import GHC
import GHC.Paths ( libdir )
import DynFlags ( defaultDynFlags )
main = do {
; s <- getLine
; defaultErrorHandler defaultDynFlags $ do {
; runGhc (Just libdir) $ do {
; dflags <- getSessionDynFlags
; setSessionDynFlags dflags
; pm <- findModule (mkModuleName "Prelude") Nothing
; setContext [] [pm]
; runStmt ("map (" ++ s ++ ") [0..10]") RunAndLogSteps
}
}
}
セミコロンを行頭にもってくる記法はいいね。
>>328 ありがとう。
なるほど、関数をHaskellの世界に持ってくるわけではなく、
引数を向こうの世界に渡して実行させるわけですか。
確かにこれなら、Haskell側は汚染されずにすみますね。
すみません、途中で送信してしまいました。
>>327 これは、ユーザが文字列として与えた関数をHaskellの関数にできるということでしょうか?
本音と建前を使い分けているかのような嫌な言い方だな
Haskellには組み込みのevalがないだけで、自分で好きな構文のevalを書くのは何も問題ない 「ユーザが文字列として与えた関数をHaskellの関数に」することも当然できる
そもそもevalってlispの用語だしな
文字列をとって可変長引数の関数を返す高階関数になるのかな
あ、いや副作用のある関数を返す可能性もあるし、一筋縄ではいかないか
インタプリタだろ
なんでそんなプログラムを書く必要があるのか理解できないな。 自分一人で使うならHaskellで直接書けばいいし、 そうでなければなぜそんな局所的なインタプリタが必要なのか。 もっとマクロなレベルでデザインが間違っているのではないか。
>>338 チューリング完全である必要がある事は理解できるよな
それをふまえて、他の言語をマネできる自由な言語が勝ち組みたいな雰囲気になった
>>333 C言語も同じようなことできるよね
昔、ウィンドウを操作するプログラムを作ってたときに、アセンブリコードを文字列で与えて実行時に関数を組み立ててた
>>340 ちなみに、printfみたいに引数の数が可変の関数
>>340 できるね
相当手間がかかるのと、機械語に依存することがHaskellとの違いだな
>>330 {-# OPTIONS_GHC -XFlexibleInstances #-}
module Main where
import GHC
import GHC.Paths ( libdir )
import DynFlags ( defaultDynFlags )
import Data.Dynamic
import System.IO.Unsafe
main = getLine >>= \s -> print (map (eval s) [0..10])
eval :: String -> (Int -> Int)
eval s = flip fromDyn (error "Error") $ unsafePerformIO $
defaultErrorHandler defaultDynFlags $ do {
; runGhc (Just libdir) $ do {
; dflags <- getSessionDynFlags
; setSessionDynFlags dflags
; pm <- findModule (mkModuleName "Prelude") Nothing
; setContext [] [pm]
; dynCompileExpr ("(" ++ s ++ ") :: Int -> Int")
}
}
GHCなら、こういうこともできるよ。
ただ、多相型を扱えない/扱いにくい関係で、
>>328 みたいな方法で押し切った方が簡単だし、応用しやすいと思う。
Haskell的にはスマートじゃない感じだけど、そもそもLispのevalにしてもPythonやRubyの似たような関数にしてもインタプリタだからできることであって、インタプリタと連携させる前提で比較しないと不公平という気もする。
ghc apiを息をするように使いやがって この変態どもめ
もうhs-pluginsの時代じゃないんだな、勉強になった
lispの多値返しみたいなことってタプルとか型をつくったりで 対処するの?どっちがはやいん? foo (x,y) = x+y Data point X Y type X = Int type Y = Int foo (Data x y) = x+y みたいなの違い。
ごめん data Foo a b c = X a b c deriving (Eq,Ord,Show,Read) aho (X x y z) = X (x*y) (y*z) (z*x) baka (x,y,z) = (x*y,y*z,z*x) *Main> aho (X 1 2 3) X 2 6 3 *Main> baka (1,2,3) (2,6,3) こんなのについてのこと。
これからlispってどうなるんだろうな。 抽象度の高いプログラミングはHaskellが最先端だし、 実用目的でもClojureよりScalaのほうが有望だろ もうlispは必修言語とはいえないんじゃないか
Haskellの弱点は遅延評価(利点でもあるが) これがある限り、one of them にしかならんだろう
>>348 Lisp の最大の利点はコード=データである事。
Lisp は Haskell とは全く別の世界を持った言語だから、比べてどうと言うモンじゃない。
>>343 >インタプリタだからできることであって、インタプリタと連携させる前提で
インタプリタではなくいきなりコンパイルする実装もあるよ。
それと、別に連携している訳じゃなくてコンパイラが組み込まれているのが当然というだけ。
>>350 Haskellでもデータをコードとして扱えるよ
>
>>352 コードをデータとして扱えるの?
マクロは無いんでしょ?
lispをインタプリタのみだと思ってるなら大きな誤解だろうな。 lispがcobolとかみたいに消えると大きな声をだしてるのは昔からじゃない? 消えると叫ぶ人ほどlispがまだ残ってる理由がわからないんだと思うよ。
lispってのは自由度の高さと強力なマクロや動的な言語だはみんなご存知だけど、 それに伴って、思考を邪魔しない言語なんだよ。それに気がついた人ほど病みつき になりやすいし、他の言語を触りたがらない人になりやすい。なんでかっていうと 特に手続き型なら雑務的なプログラミングでいらいらさせられるから。それ故に 使い続ける人がいるってことさ。 haskellも面白いし、好きだよ。
エンタープライズ用途じゃLispもHaskellも消える以前に存在してないけどな COBOLとは生息している(いた)領域が違う
Haskellが今のところエンタープライズ用途に向かないのは、 言語設計のせいでは無いような気がする。
>>357 Haskellって これから需要がありそうな気がするんだけどな。
時代は関数型なのに、多くの人は手続き型をやってる印象が強い。
関数型言語全盛の時代って90年代からゆるーく続いてる気がするから、今更な感じ。
>>359 言語単体で需要が増えることはまずない
新しい環境とかプラットフォームが出てきてそこで最適な言語であれば需要が出てくる
UNIXでC、WindowsでVB、Webで最初Perl後Java&JavaScriptのように
CL で言う所の Allegro とか LispWorks みたいな会社が出来れば 多少は変わる気もするけど、もしかしてもうあるのかな?
Allegro じゃなくて Franz の間違い
Lisp は LispM じゃないの
Emacsなlisperでも、elispは嫌々使ってるよw
末尾呼び出しの最適化も、レキシカルクロージャも無いもんな。
>>366 Symbolics全盛時でも流行るとこまでいってないだろ
JHaskellとかH#とかあればいいかと思ったけど、 結局、既存のライブラリはそのまま使えなくて意味ないのかな?
既存プラットフォームで先行(普及的な意味で)してる言語と争っても勝ち目ないよ ScalaやClojureも際物で終わる iPhoneとかAndroidのアプリがHaskellでしか書けないとかそういう環境が必要
自サーバとか、普通にHaskell使ってるけど 企業とかに使ってもらうことが普及というなら、 いまだに30年前のアセンブラとかCOBOLとかがメインで動いてるから Javaですらまだ普及していないと言える
COBOL や ASM のコードが動いている事と、Java が普及している事は 同時に成立するんじゃないの。
>>371 保守的にならなきゃならんところほど 動きが鈍いからね。
日本って国を考えても国民性を考えても保守的過ぎるところがあるし
あたらしい動きに合わせられないからね。たしかに人がいないものは
保守ができないという問題はあるけどね。
日本でHaskellをというならば、
アメリカでは〜 とか ヨーロッパでは〜 とかのほうが頭の硬い連中
を説得できるかもな。笑
キラーアプリ次第とはいえるよね。railが出てきたときにRubyとなった
みたいに。
他の言語でも本で みんなの〜 ってあったけど 結局みんな ってのがキーワードだからね。金太郎飴人間みたいで嫌な話だがね。
企業が保守に金払ってるかどうかでいうと、アセンブリやCOBOLにはいまだに金をつぎこんでるけど、Javaには金をかけてない 個人で勝手に使うかどうかが基準ならHaskellはすでに十分に普及している
cobolerってまだいるの? おおいの?
むしろHaskellは普及させてはならない プログラマが他の業種より優れている点は、ツール次第で他人の1000倍以上の生産能力が手に入ること こんなのは他の業種じゃありえない これこそがプログラミングの醍醐味 カタルシス よい言語は普及させずに知ってる人だけでコソコソ共有するべき
大学や情報処理試験で、巨大な整数の加算乗算を丸めやオーバーフローなく計算できるのがCOBOLの特徴だと宣伝してきたので、公官庁を中心にいまだにCOBOL部署は多い
団塊の世代が退職してアセンブリ読める人がいなくなって本当の危機がおとずれると脅されてる。
金融(証券)じゃCobolよりJavaのが仕事多いよ 中小向けじゃバックオフィス(銀行の勘定系相当)もJavaになってきてるし もちろんHaskellの仕事はない
銀行はPCまわりは近代化してもATMまわりがこれからもCOBOLで当分固定だからな… 当然Haskellの出番はない
javaやhaskellの全盛はTRONが死滅してから
Haskellを調べててよくわからんことがあります。
push/popのようなスタックのデータ構造の操作って、ピンとこない。
なんとなく副作用のない操作と合わないというのかメモリを多く食いそうな
感じがしちゃってます。実際はどうなんだろう?
という疑問があります。どうなんでしょうか?
>>360 コメントありがとうございます。
>>387 ありがとうございます。ググッてみます!
Stateモナドで結合を制限できませんか? 例えば状態としてスタックがある場合 push :: forall n, a -> State (Stack (n :+: 1)) () pop :: forall n m, n :+: 1 :==: m => State (Stack n) a みたいに型の制約付きでpush,popが定義されていて、 空スタックを表現する型付きの値をpopすると型システムに弾かれるようなやつです
そもそもスタックって概念には副作用とかないような気がするんだが。 xとxsを引数にとって結合する関数ってpushしてるとは言えない? (x:xs)からxとxsを返す関数ってpopしてるとは言えない? 副作用があるように実装している言語が多いだけのように思えるんだが。
>>390 抽象データ型はデータのインタフェースを定義するだけだからな
consリストでスタックを実装することもできる
>>389 空popを制限するだけなら自然数を数える必要はなくて、
http://en.wikibooks.org/wiki/Haskell/GADT ここのsafelistを参考
{-# LANGUAGE EmptyDataDecls, GADTs #-}
data Empty
data NotEmpty
data Stack a b where
EmptyS :: Stack a Empty
PushS :: a -> Stack a b -> Stack a NotEmpty
pop :: Stack a NotEmpty -> a
pop (PushS x _) = x
push = PushS
pop (push 1 EmptyS) ---> 1
pop EmptyS ---> 型検査ではじかれる Couldn't match expected type `NotEmpty' (略
>>393 そういう手もあるんですなー
普通のファンクタにフラグが付いたものみたいで
何らかのイディオムとしてありそうです
同様に {-# LANGUAGE EmptyDataDecls, GADTs #-} data Z data S a data List a n where Nil :: List a Z Cons :: a -> List a n -> List a (S n) なんてすれば長さつきのリスト型ができますー
>>393 pop EmptySの場合にはじかれるのは分かったけど、
それ以外だと、どのような場合にはじかれるの?
はじかれるかどうか試すテストを書けばいいの?
>>396 型推論器が、NotEmptyと推論できない場合のすべて、じゃない?
関数引数で、型がスタック一般の場合とか。
自然数で持てばスタックオーバーフローも防げるのかな? だとすると凄いな
>>398 コンパイル時に検査できるかということなら無理
一般には長さの部分が抽象化された型になる
>>397 型推論器ってなんなの?
(疎な条件分岐を考慮した) 定数伝播でpopが失敗するとかなら分かるんだが・・・
定数ではない何かが伝播するの?
>>400 定数伝播を型でやってるようなもの…かな
型推論器はコンパイル時に走って、型指示のついていない
式に型をつけ、型が食い違っていればエラーを出す。
popはStack a NotEmpty型をとるため、
popにEmptyS (Stack a Empty型)を食わせるような式があると
コンパイル時にわかる。
402 :
393 :2010/06/05(土) 11:23:16
393はpopしたあとの残りのスタックを取り出す関数 rest (PushS _ s) = x に型がつかなくて、スタックとして使えないことに気付いた。 395の長さつきリストならスタックとしても使える。
403 :
393 :2010/06/05(土) 11:24:00
訂正 rest (PushS _ s) = s
長さ付きのスタックから残りの長さを取得する型関数RestLenがあるとして、 例えば実行するのにスタックをm消費する関数fがあると f :: ((LestLen s) :<: m, n' ~ n - m ,s ~ Stack n a) => Stack n a -> Stack n' a みたいな感じで制約付きの関数が定義できるといいかもなーとか考えてるんだけど できそうにないのか残念
>>404 Agdaがあなたが求めているものかもしれない。
>>406 できるんですか!
ありがとうございます、参考にさせてもらいます
またですかhaskell.org
HaXmlの使い方わかんないお>ω<
キワモノと言われるHXTすらHaXmlよりかはまだわかりやすいと思う
411 :
409 :2010/06/06(日) 22:46:11
ちょっとタグのString読ませて内部表現として保持しておきたいだけなんですけど ハクスムルじゃ大風呂敷なんでしょうか?
やりたいことがよく分からないけど、TagSoupは簡単便利よ。
Yampa か Reactive、あるいは他のFRPライブラリで遊んでみようと思うのですが、 お勧めとか、それぞれの特徴とか教えてもらえませんか? あと、haskell.org の停止、長すぎる。
>>413 私はPhooeyのドキュメンテーションを読んでみて使いやすそうだと思ったのだが、
残念ながら今のghcではビルドできない。
というわけでおすすめはQtだ。
tagsoup-parsecがインスコできね キャバル死ね
Windows 使ってて Haskell Platform を入れてるんだけど、 GHC のライブラリにある Graphics.Win32 以下のものって、 Windows 用の GHC にしか入ってないの? たとえば Linux 用の GHC なら、 なにか別のものが Graphics.*** として用意されてるの? というのも、ここにあるライブラリと Yampa とか使って GUI ライブラリを自作してみたいのだが、 Windows でしか使えない物になってしまうのか訊きたい。
Graphics.Win32はWindowsだけ wxHaskellやGtk2HsはLinuxでも使える
そもそもIOに依存しないライブラリを作って ごく少数のIOを注入するのがHaskellの理想だろ 理想が高くなると「本音と建前は別だよね」って奴も増えるから困る
elereaのようにIOを注入というより一部をIOから隔離するっていう方が好きかな 実際に書くスクリプトはliftIOでモナドにIOを入れまくりってものばかりですが…
Haskellの何がよいかというと、MonadやApplicativeを使って 型安全なDSLを簡単に定義することができることだからな あとは型に応じて自動補完するIDEがあればいいんだが
> 理想が高くなると「本音と建前は別だよね」って奴も増えるから困る 本音と建前のバランスは実際のパフォーマンスを考慮して取られるべきだが、 そもそもHaskellは実用性を目的としていないのだから、困るのは逆ギレみたいなもんだ
>>422 >そもそもHaskellは実用性を目的としていないのだから
Perl6はHaskell製
>Perl6はHaskell製 そうだったか? Perl 6の実装には2つあって、Haskellで書かれたPugsのほうは もうテストにしか使われていないと聞いたが。 それにしても後付けの応用でしかない。
>Haskellは実用性を目的としていない ソースは?
hackagedb見ればほとんどが実用向けだと分かる
haskell以上に素早くプログラミング出来る言語はないだろ。 Cなんかでチマチマやるより遥かに早いスパンで成果物が出来上がる。
>>427 どこにもそんなことは書いてなくね?
むしろ逆じゃないか
たとえば3.6節
...On the other hand, we also really
wanted Haskell to be a useful language, for both teaching and real
applications.
>>429 lispかhaskellかどっちがはやいだろうな。これはなんともいえん。
実行性能が必要だったり、複数人で開発したり、自分以外の人間が保守したり、 有り物のライブラリを使って楽をしたかったり、長期間稼働する必要があったり、 ハードウェアに近い処理を実装する場合だったり、リソースの限られた機械で 動作させる必要があったり、誰かに使ってもらう為のライブラリを作る時や、 コンパイラのバグはコンパイラベンダーに丸投げしたい場合なんかは Haskell は あんまり向いてないかもね。
MLに対するHaskellの優位性というのはどの辺りの分野にあるのだろう? まあ一長一短で全体としてはどちらが良いともいえないと思うが。
並列処理ならHaskell,それ以外ならMLかな
ocamlはhaskellの8倍遅い(笑)
>複数人で開発したり、 lispよりはましだろう。lispこそ独善的なプログラマの言語。
>>432 抽象データ型とかをつかってインターフェースをしっかりと定義しておけば、
C++ や Java と同程度に複数人で開発できる。
したがって、自分以外の人間が保守することも普通にできる。
汎用的に使える応用度の高いライブラリも多く公開されてるから、
有り物のライブラリを使って楽をすることも問題ない。
ハードウェアに近い処理を直接実装するのはたしかに向かんかも。
ただ、ハードウェアに近い処理を抽象的に書く能力自体はあるし、むしろ向いてる。
それを実際のハードウェアに対して実行できるものに変換できればいい。
誰かに使ってもらう為のライブラリを作るのに
Haskell が向かない理由が思いつかない、説明してくれ。
残りは、Haskell の言語としての特徴が招く問題ではなく、
全て純粋に現在のコンパイラの問題だ。
>>432 >コンパイラのバグはコンパイラベンダーに丸投げしたい場合なんかは Haskell はあんまり向いてない
かといって、素人でもメンテナンスを続けられる軽量なコンパイラもない
手も足も出ない
>>437 >C++ や Java と同程度に複数人で開発できる。
>したがって、自分以外の人間が保守することも普通にできる。
Haskell プログラマの人数が圧倒的に少ない
共同開発者や保守要因の確保が困難(もしくは高コスト)
>汎用的に使える応用度の高いライブラリも多く公開されてるから、
>有り物のライブラリを使って楽をすることも問題ない。
当然、C/C++/Java のライブラリの数に比べたら圧倒的に少ない
>誰かに使ってもらう為のライブラリを作るのに
>Haskell が向かない理由が思いつかない、説明してくれ。
C でライブラリを作れば、殆どの言語から呼び出せる
Haskell でライブラリを作っても Haskell でしか使えない
>残りは、Haskell の言語としての特徴が招く問題ではなく、
>全て純粋に現在のコンパイラの問題だ。
現実的な視点では、コンパイラの問題も言語の問題。
抽象レベルが高いのでプログラマ自身が最適化するのが難しいという点では、言語に原因があるといえる
>>439 そうか、すまんな。
全員が普通に Haskell プログラマーであること前提の話だと思ってたよ。
全員が普通に Java プログラマーの開発環境の様に。
共同開発者や保守要因の確保が困難ほど Haskell プログラマーが不足しているという話なら、
おまえの言っていることは当たり前であり、全くの正論で議論の余地はない。
>>439 Haskellプログラマの数が少ないというより、Haskellプログラマ自身を開発するコストがバカ高いと思われ
Haskellプログラマは一人いれば100人の中卒プログラマに匹敵する
Haskellの1行はCの100行に相当する
haskellの1秒はcの1光年に相当する
HaskellではCで考えられないようなプログラムを書くことができる
時間の単位が距離の単位になるくらい超越的なんだろう
>>448 近代物理学の自然単位系では、時間と距離とを区別しない
約30万km = 1秒
1光年 = 1年
haskellのAKB48はCのモーニング娘。に相当する。
Haskellが地球ならCは火星でLispは宇宙そのものだ。
テラフォーミング言語C
Haskellの関数はCのポインタに相当する。 Cの利点: * ポインタを使って、関数を関数の引数にできる * 関数ポインタに自由に四則演算をすることができる * 型キャストが容易。関数型をlong型にすることもできる Haskellの欠点: * ポインタがないので、関数を特別なファーストクラスオブジェクトにしなくてはならない * 関数に自由に四則演算をすることはできない * 型キャストはない
それ欠点なのかw
>>453 おい、初心者の就職活動みたいな事すんなよ
関数に演算できるだろ。
Haskell の関数に四則演算はできんと思ってたんだが、できるのか?
Cでもできないはずだが、どうだろうか?掛け算や割り算って何だ?
関数ポインタにはできないね
和 f +++ f 積 f *** f 差と商はどう定義しよう
積 f***g = \x-> Just x >>= f >>= g 和 f+++g = \x-> Nothing `mplus` f x `mplus` g x
additive inverseを関数に対して定義する…だと?
>>461 というか、MonadPlusが「和」を定義するクラスなんだが
>>462 fが成功かつgが失敗のときf-gが成功
Arrow とか ArrowChoice を持ってくるのが無難なのかな
ArrowでModuleを作るのかー頑張れとしか良いようがないな 色々と制約を追加してModuleを構成できるArrowってのを考えるのが楽か Arrowそのものが抽象だから具体例を考えなくてもいいし
Haskellなんだから積と和はやはり直積・直和にもとづいて定義したい。 * :: (S1 -> T1) -> (S2 -> T2) -> (S1,S2) -> (T1,T2) (f * g) (x1,x2) = (f x1, g x2) + :: (S1 -> T) -> (S2 -> T) -> (S -> T) where data S = Inl S1 | Inr S2 (f + g) x = case x of { Inl y -> f y; Inr y -> g y } 和がHaskellの構文でうまく書けないけど
ていうか関数ポインタの演算ってそんなものじゃないし
どんなの?
>>467 それは命題論理に対応するっていう話で、代数系じゃないでしょ
Prologは述語論理でHaskellは命題論理なの?
>>471 Haskellはそもそも論理型じゃないし
forallがあるから述語論理だろ でtype of typeができないから二階じゃない
なんかよくわからんけど、 RankNTypes拡張を有効にしたら 高階論理なんじゃないの?
Curry-Howard 対応様が見てる
二値じゃないから論理じゃないだろ
関数プログラミングの楽しみっていう本、どこの本屋に行ってもないんですが 7年前の本なんですよね? 絶版したんでしょうか?
>>477 お前の中では論理っていうと二値論理のことなのか?
>>479 この本ずっと待ってんだけど6月下旬らしいね
>>442 大学を思想的に侵略して関数型言語以外はクズという主義を学生に叩き込もうぜ
その前に関数型言語の定義をめぐって内ゲバしないと
Lispは関数型言語かどうかで死闘をくりひろげるわけですね
世間一般ではともかく、今時大学で Lisp を関数型扱いしてたら相当の時代遅れだろう
関数型言語の歴史を知っている人間ならLISPが関数型言語だというのは明らか
マルチパラダイムとお呼び!
yes, sir!
lispって型にはまらない言語なんだから、 枠にはめて考えること自体合わないんだと思うよ。 今じゃマルチパラダイムになってるからね。 型にハメる系統と対照的だといえるよ。
ラムダ計算の筆記用として考え出されたのがLISP 関数型言語はラムダ計算の応用だからLISPは関数型言語
> ラムダ計算の筆記用として考え出されたのがLISP 嘘ですね > 関数型言語はラムダ計算の応用だからLISPは関数型言語 前件が意味不明です
LISPは関数型言語ではない LISPマシン専用言語だ
関数型言語の元祖はlispだが、現代の関数型言語とは似て非なるものだ。 自転車や自動車、それに八つ橋などの例をみても、元祖が子孫と違うのは珍しくない。 関数型言語でも同様のパターンがあると考えるのはごく自然な発想だ。
>>489 >型にハメる系統と対照的だといえるよ。
Haskellのことを言っているのであれば、これは少々不適切な表現だ。
Haskellはデータを既存の型にはめるだけではない。
プログラマが型を積極的に定義することを許しているのだから、型を使う言語と言ってほしい。
Lispを関数型言語ではないというのは、黎明期の巨大携帯電話をmobileでないというようなもの。
型から自由であろうと企てた結果、unsafeになって拡張できなくなってしまうのは残念なこと。 初心者にありがちな失敗コースです。
Lisp は純粋関数型じゃないって事で Lisp はパラダイム非依存のパラダイス言語です
数学も、もともと測量学だったものが長い歴史を経て純粋な神学になったんだから、歴史はより速く繰り返されるものです。
>>499 というか、lispのパラダイムにはsyntactic abstraction(構文抽象)という名前があるんだよ
言われてみれば測量学とラムダ算法って似たようなもんだな 具体的なものから抽象的な概念に進歩していくのか
構文抽象は S 式と繋がりが強過ぎてパラダイムって感じはしないな
関数型言語の始祖はC言語の関数へのポインタ
Cの可変個の引数(printf)とコールバック
真祖はstack winding
古典的関数型言語(関数型言語の古典論)= 現代関数型言語(より良い理解のために)=
どうしよう。 「ただ、リストの再帰処理が書ける言語が欲しかっただけ」 といい出せない雰囲気…
ジョン万次郎か
Haskellは数値計算やシミュレーションには向かないのでは? と書いてあるのをどこかで見た気がします。 これは本当でしょうか?
そのようなことはありますん。書いた人に聞くか、どこに書いてあったかを示して下さい。
>>510 まあ、Haskellに詳しくない人は、シミュレーションをどうやってモデリングすべきか見当もつかないかもしれないね
haskellで速いプログラムを書くコツとかわからないもんね。 副作用がないってのがメモリは食うし遅いという印象があるのかも
>>510 きれいなやり方が見当たらないときは、きたないやり方も許されます
詳しい人はそれを知っているので、数値計算もシミュレーションもこわくない
C++みたいだな
>>510 SoftwareDesignでnobsunが書いた記事でしょ。
Haskellはクソ遅いからシミュレーションみたいなパワーがいる処理には向いてないよw
布教屋さんがそう言ってるのか、
>>517 nobsunが言っているのは、我々が感じているのと同様に
reactiveなプログラミングをするのが非常に煩雑になってしまうというところ。
シミュレーションは物によるけど、決まったタイミングで処理をするもの、
例えばアニメーションとかは書きにくいね。
現在YampaなどFRPライブラリが作られてはおり、
reactiveなプログラミングを支援しようという動きはあるが、
あまりわかりやすくプログラミングできるとはとても言い難い。
そしてさらに誰がいおうと、HaskellはCと比べて明らかに遅い。
まぁ、これからに期待だね
しかし、関数型言語でも並行処理を利用すればオブジェクト指向設計(より強力な設計が可能) を置き換える事が可能だと思う。 だからオブジェクト指向で有利なreactiveなプログラミングも関数型言語で簡単にできるようになると思う。
線形型をもつATSはCに匹敵するパフォーマンスを出せるが 記述量もCと同等以上かつ大抵の人には読めない… やっぱC++でHaskellっぽく書くというところで妥協するしかないのか
CやC++なんて、言って見たらマシン語そのままみたいなもんだからね。それ超えようってなら、 勝手にアルゴリズムを推論して書き換えちゃうくらいじゃないとどうにもならないんじゃないの。
C++って「高級アセンブラに継ぎ接ぎだけど型レベル言語くっつけました^^」みたいなものだろ。
継ぎ接ぎといえどTemplate Haskellよりまとも
>>522 いや、CPUアーキテクチャの違いを吸収してくれるのは大きい。
小さなパフォーマンスコストでポータブルなコードを書けるんだからな。
アーキテクチャまで掘って話すことは今の話の文脈では脱線だと思うが。
アーキテクチャの話はしてないだろ。 高級言語がアーキテクチャの違いを吸収してくれると言っているんだから。
でもね。ダイナミックプログラミングとか 必要な計算ならhaskellは得意だと思うんだけど。
つか、Cと勝負しなくていいだろ。 Javaに勝てれば十分。
HaskellはJavaよりスペース的には有利なはずだが。 しかし遅延評価だからスペースリークが怖いな
スペースリークって、やっぱコンパイラによって違ってくるの? たとえばスペースリークが出ないようにソースを調整したのに、 べつのコンパイラでコンパイルしたら出ちゃったとか。 それとも、共通したテクニックで防げるものなの?
そりゃコンパイラによって違ってくるでしょ。 馬鹿な例だけど例えば必ずリークするコンパイラ作ってそれでコンパイルすればリークするし。
>>532 程度の差はあるだろうが、基本的な考え方は同じでいけるはず。
Haskell でのスペースリークってのは要は遅延させた仕事がたまっていっぱいいっぱいってことだから。
それがないように注意深く調整すればいいって話。
>>532 call by need簡約だけ想定してスペースリークを潰せば実用上問題ない
メニーコアCPUな時代になって、すごく賢く自動的に並列化されるようになれば、 「Haskellで書くより速いプログラムをCで書くなんて非現実的な苦行」と言われるようになるかもしれない。 というか、なってほしい。
Haskellが教えてくれたこと 純粋関数型言語だから自動並列化が簡単になるわけではない
FRP の実装方法のひとつで、Fruit ライブラリなんかが使ってたと思うけど、 単調増加的に刻一刻と変化する「現在時刻」の列を無限リストで表現する方法があるよね。 [t0, t1, t2, t3, .....] みたいな。 ああいう無限リストで表現された現在時刻をつかってアニメーションなんかさせる場合、 リストの既に消費した部分(先頭の方)はちゃんと GC で回収されるものなの? そのようなリストの要素は一度参照されればもう二度と参照されないことは プログラムソースの全体をちゃんと見れば分かることだけど、 そういう事をコンパイラに期待しても良いものなのか、ちょっと心配になる。
あ、Fruit じゃなくて Fran か
無限リストの頭を次々に読み捨てていくような処理なら、間違いなく回収してくれるよ
そうなのか、安心した。 けっこう賢いんだな
特にコンパイラが賢いことをしてる訳じゃなくて、実行時に普通のGCが走査してるだけだけどね
最後にts' - (head ts)で処理時間を返すとかしてなければおk
>>532 どのコンパイラでも、中間コードを生成するオプションを使ってコードを追えば、明らかにヤバい部分は回避できる
>>543 なんで?
この ts' ってのはたぶん最後に取得した時刻の事だよね。
head ts は捨てられないけど、それ以降から ts' までは要らないから、
GC で回収されるんじゃないの?
つまり ts = [t0, t1, t2, t3, ... tn-1, tn] で処理が完了したなら、
tn - head ts としても t1 や t2 などは明らかに要らないよね(参照されないから)。
それでも回収できないの?
(head ts)はその値が必要とされるまで評価が遅延されてるから、 tsが参照されたままなんだよ
そうなのか。 てっきり途中の t1 や t2 などは一度しか参照されないという事を ソースを見て解析しているのかと思ってた。 あくまで実行時に ts が保持されているかどうかで、 リスト全体が保持されてしまうのかが決まるのか。 ずっと勘違いしてた、ありがと。
そういう最適化をするコンパイラもあるかもしれないけどね
tn - (head $! ts) と正格適用すると回収されるのを期待できますか?
>>549 headはもともと正格な関数なので、それでは何も変わらない
やるなら、リストを辿り初める前にあらかじめseqしておく
let h = head ts in seq h {- ここで処理。最後にhを使う -}
>>551 idは正格だけどlength . (:[]) . idは非正格
ごもっとも。 (length . (:[]) . (id $!)) undefined のつもりで書いたんですが、式はそうなってなかったですね。 結局この場合、idを評価する前に終わってしまってるってことか。 例外になるタイミングが理解できないです。「タイミング」なんというものを 考えていること自体が間違ってるのかなぁ… id undefined は id が返す undefined が例外を生成する id $! undefined は idに適用する式 undefined を評価したときに例外を生成する と考えてしまうのですが(なのでidが正格という意味がわからない)、 違うんですよね、きっと…
(id undefined)が例外になるなら、(undefined)と書くだけで例外になるべきでは
>>553 >id undefined は id が返す undefined が例外を生成する
>id $! undefined は idに適用する式 undefined を評価したときに例外を生成する
別にそう考えて問題ない
重要なのは、その二つの式の違いが外部からまったく区別できないということ
どちらの式も、評価されれば例外を生成するし、評価されなければ何もおこらない
正格関数が例外を生成する undefinedが例外を生成する 評価が例外を生成する
>>553 例外はundefinedが評価されたときに発生する,と考えればよい.
ポイントは以下の2点.
・式の評価はその式がwhnfという形式になるまで評価を繰り返すことで行われる.
・undefinedはwhnfではない.
id undefinedという式を評価すると,idの定義からundefinedに変換されるが,
undefinedはwhnfでないため,再び評価が行われ、例外が発生する(有難いことに).
id $! undefinedという式を評価すると、$!の定義から引数であるundefinedが評価され、
例外が発生する.
例外発生までの過程は違うが、結果は同じになる.
正格関数では常にこうなるので、この現象を「idが正格だから〜」と説明しているのだろう.
558 :
デフォルトの名無しさん :2010/06/16(水) 22:02:34
関数型言語で勢いが一番あるスレはここかな?それでもこれから流行る流行らないとか、生き残る生き残らないとか、そういう話が多いね
>>559 Qi使ってる人居る?
HaskellとLispのいいとこ取りみたいで、個人的には重宝してるんだが。
>>559 そういう話は次世代技術にはありがちなんだよ。
>>560 恥ずかしながら、その言語をはじめて知りました。
ちょっとgoogleってみたけど、たしかに面白そう。
型定義のやり方が独特そうで、ちょっと戸惑っているけど。
>>563 Shootoutでは速いほうだよ。
まあ、速くなるように書かれているだからだが
一体誰が遅いといっているのか知らないが、普通に書いてもRubyなどの動的言語よりは速い
Haskellはそもそも静的型なので、型宣言してもパフォーマンスは変わらない
小手先でスクリプト組んでちょこっとした事務処理する場合、開発コストまで考えたらHaskellはおそろしく高速だと思います
私は年賀はがきをHaskellで書いています
Haskell はコンパイルが遅いと聞いたことがある
ソースコードがCの1/10ならコンパイルが10倍遅くても問題無し。 実際には10倍も遅くはないが。
Haskellコンパイラ自体をやってる人は日本にはいないん?
コンパイルは遅くないがリンク(ld)は確実に遅い
OCaml と比べれば遅いけどな>コンパイル ld のメモリ食いは安い VPS だと死ねる
make -jxオプションに相当するものがまだないんだよね… あとリンカはgnu goldがこなれてくればある程度KAIZENできそう
GHC-6.12.2 を使っています。ghcでコンパイルをしてみようと思ったらこんなエラーになります。 $ ghc -o test test.hs <command line>: unknown package: haskell98 ghc -v で気になっているのがこのあたりです。 (略) package haskell98-1.0.1.1-64d0d2445dbab2ae6f4c0ef4dd5acffb is shadowed by package haskell98-1.0.1.1-672bbe87e44bc3d3a6893d91fa352541 package haskell98-1.0.1.1-672bbe87e44bc3d3a6893d91fa352541 is unusable due to missing or recursive dependencies: random-1.0.0.2-53cbb8e9db87dab393d00e96a9805bcd (略) package random-1.0.0.2-53cbb8e9db87dab393d00e96a9805bcd is shadowed by package random-1.0.0.2-f4208c3677aeaaaf41e4d36309c0b4ff (略) wired-in package haskell98 not found. (略) haskell98の 672bbe.. は~/.cabalに入っているもの、64d0d2.. はGHC-6.12.2の一部です。 randomの 53cbb8.. は~/.cabalに入っているもの、f4208c3.. はGHC-6.12.2の一部です。 randomは~/.cabalのものよりGHC付属の方が優先されているようなんですが、これは問題ない のでしょうか? haskell98 が見つからない、というエラーはどうやったら解消できるでしょうか…
>>573 ghc --make test.hs
としてもうまくいかない?
>>574 うまくいきました…
ghc --help の先頭に書いてあるんじゃんねぇ orz
ありがとうございます、そしてお騒がせしました。
本屋に関数プログラミングの楽しみがあったから買ってきたけど、なにこれ? わ け わ か ら ん
目次見ただけで難しそう
慣れてないだけですよ。 分からない言葉はひとつひとつ調べていきましょう。
目次だけ見るととっつきにくそうだな
>>577 いろんなテーマについて関数プログラミングの話してるみたいなんだけど、そのテーマが分からん
この本は続編みたいなんだけど、詳しくは前の本参照、みたいな箇所がいきなり出てきてわけわからん
あと、コード(?)の断片は出てるけど、実行方法とかは載ってないので初心者お断り
初心者お断りなのは仕方ないと思うけど
関数プログラミングの楽しみ(邦訳版)、もう買った人いる?
ttp://www.amazon.co.jp/%E9%96%A2%E6%95%B0%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3 %E3%82%B0%E3%81%AE%E6%A5%BD%E3%81%97%E3%81%BF-%EF%BC%AA%EF%BD%85%EF%BD%92%EF%BD%85%EF%BD
%8D%EF%BD%99-%EF%BC%A7%EF%BD%89%EF%BD%82%EF%BD%82%EF%BD%8F%EF%BD%8E%EF%BD%93-%EF%BD%81
%EF%BD%8E%EF%BD%84-%EF%BC%AF%EF%BD%85%EF%BD%87%EF%BD%85-%EF%BD%84%EF%BD%85-%EF%BC%AD%EF
%BD%8F%EF%BD%8F%EF%BD%92/dp/4274068056/ref=sr_1_1?ie=UTF8&s=books&qid=1277306584&sr=1-1
おっと、すぐ上に居たか。失礼しましたw
糞長いURLを貼るな
>>581 どのテーマにも興味が持てなかったのなら、
仕方がないのではないか?
よくあることだよ。
C/C++ や C# の文法を一通り覚えたら、
簡単なゲームから作り始める人もいれば、
テキストエディタから作り始める人もいる。
計算物理学入門とかの本を実践しながら遊ぶ人もいる。
同じ事だ。
Algebra of Programmingから読むといいよ
関数プログラミングの楽しみ は何かの続編らしいんですが、これの前の本の訳本はないのでしょうか?
関数プログラミングの産声 関数プログラミングの楽しみ 関数プログラミングの終焉 3部冊とか?
あー、世の中は広いんだなぁ。。。
保守age
980超えてない限りそうそう落ちないよ
Real World Haskell 8章214頁にて、:type handle (const…で型を調べる説明があるのですが、 そこではControl.OldExceptionモジュールが使われています。 例題プログラムであるGlob.hsではControl.Exceptionモジュールが用いられているのですが(211頁に記載)、それだと Prelude> :m Control.Exception Prelude Control.Exception> :t handle (const (return [])) <interactive>:1:0: Ambiguous type variable `e' in the constraint: `Exception e' arising from a use of `handle' at <interactive>:1:0-25 Probable fix: add a type signature that fixes these type variable(s) と怒られてしまいます。なして? どう修正すれば良いのでしょうか…いきなり19章の例外までジャンプは無理っすw
:t handle (\(e::SomeException) -> return [])
599 :
597 :2010/07/11(日) 10:56:27
>>598 レスありがとうございます。ただ・・・
Illegal signature in pattern: SomeException
となってしまいました。
結局、元のGlob.hsソースのimportをControl.ExceptionからControl.OldExceptionに替えるとwarningが出るものの一応走りました。
GHC 6.12.2 を使っていて、GHC 6.12.3 をコンパイルしようとすると、 こんなエラーが出ます。6.12.2のソースでもやっぱりこのようになります。 (このコピペは6.12.2のソースをコンパイルしたときの物) "/opt/ghc/bin/ghc" -H32m -O --make utils/ghc-pkg/Main.hs -o utils/ghc-pkg/dist/build/ghc-pkg \ -Wall -fno-warn-unused-imports \ -DCABAL_VERSION=1,8,0,4 \ -DBOOTSTRAPPING \ -odir bootstrapping \ -hidir bootstrapping \ -iutils/ghc-pkg \ -XCPP -XExistentialQuantification -XDeriveDataTypeable \ -ilibraries/Cabal \ -ilibraries/filepath \ -ilibraries/extensible-exceptions \ -ilibraries/hpc \ -ilibraries/ghc-binary/src \ -ilibraries/bin-package-db utils/ghc-pkg/Main.hs:76:7: Could not find module `IO': Use -v to see a list of the files searched for. $ HOME=~/tmp gmake だとコンパイルできるので、~/.ghc の中身が影響して 何か問題が起きているのかなと思うのですが、こういう場合はどうする のがよいのでしょうか?
RWHの258ページにparseWhileの定義が載っていますが、そこで(b:)と 再帰を繰り返して行った時の最後のidentity[]とはどう繋がるんでしょうか? (b1:) <$> (b2:) <$> … <$> (identity []の結果(?))みたいな感じになると思うのですが、 この演算てどう行われるのでしょうか。 隣の頁のparseWhileVerboseを見ると、ifのTRUE節に対応した方はidentity (b:bs)と出てるから、 これが何故出てくるか分かれば理解できそうな気もするのですが…。
初歩的な質問で申し訳ないんですが、 自前のDLLをHaskellで読み込んで使用するのって、どのようにすればいいのでしょうか?
やっと解決した……。誰も必要としてないかも知れないけど、ご報告。
ttp://www.kotha.net/ghcguide_ja/latest/win32-dlls.html ここを参考にHaskellで作ったDLLを、Haskellで呼んでみた。インデント崩れるのはご愛敬。
++ 以下ソース ++
{-# LANGUAGE ForeignFunctionInterface #-}
import Foreign
import System.Win32.DLL
-- ffitest.dllをロード.
ffiDLL = unsafePerformIO $ loadLibrary "ffitest"
-- ffitest.dllで定義されているadder@8をHaskellで定義.
adder = unsafePerformIO $ (getProcAddress ffiDLL "adder@8" >>= return . arg . castPtrToFunPtr)
-- dllで使う引数と戻り値を定義.
foreign import stdcall "dynamic" arg :: FunPtr (Int3) -> Int3
type Int3 = Int -> Int -> Int
main = do print $ adder 3 3
otu
605 :
デフォルトの名無しさん :2010/07/20(火) 11:22:36
>>601 入力を消費(parseByte)しつつ、Functor 型クラスのインスタンスの
Parseの値部分 [Word8]に
f <$> (== fmap f) の f (ここでは (b:) :: [a] -> [a]) を適用
act :: [a] -> [a]
act xs = case xs of -- fmap p <$> peekByte の結果
(b:bs) -> (b:) $ act bs -- Just True の間
[] -> [] -- Just True 以外になった時
ghci> act ['a','b','c']
"abc" -- ('a':) $ ('b':) $ ('c':) $ []
と同様ではないでしょうか
>>601 きちんと動かしてないけど、こんな感じにパラフレーズできるんじゃね?
parseWhile p = do
mx <- peekByte
mp <- return $ fmap p $ mx
if mp == Just True
then (do
h <- parseByte
t <- parseWhile p
return (h:t))
else (return [])
607 :
601 :2010/07/22(木) 00:39:56
>>605 >>606 端的には
>>605 の終わりの方に書いてある意味ですね。
257頁のParse上のFunctorクラスのインスタンス化の意味を理解してませんでした…。
挫折を止まらせてくれたレス、thxです。
608 :
デフォルトの名無しさん :2010/07/22(木) 01:43:46
Haskellってオブジェクト指向プログラミングはどうなってるの?
ポリモーフィズムもカプセル化もできるぞ
モナドとモコナはどう違うのか 永遠の謎
モナドは「ぷぷぅ」って言わない
しかし、モコナはモナドだ
どう違うのかっていわれても、同じオブジェクトが見方によってモナドだったりそうでなかったりするんだよ
モナド可愛いよね
黒モナドモドキ 白モナドモドキ
ホワイトボックスとブラックボックスの違いみたいなもんか
昔は白モナドが美味しそうだったが、 最近はアルコール度数が高い黒モナドの方が美味しそうに思えてきた
何の話だよ
何の話って、モナドだろ?
これはただのモナドではございません、山吹色のモナドでございます。
あーあやっちゃったね
本題に戻りたまえよ君達
急に伸びたとおもって わくわくしてスレを開いたらこれだよ!
で、本題ってなんだったっけ
副作用があるのかないのかって話。
副作用は言語の外にある
外野が勝手に解説(副作用)してくれるってこと?
言語仕様には定義されていないということ。 なにが起こるかはすべて実装依存。
言語仕様のことを言語と呼んでいたのか。
言語仕様とその実装には当然同型対応ができてかつモナドとなる。 ということでおk?
表現がイマイチか。 Computationとは言語仕様のことじゃないか、ということ。
elereaの使いかたがわかりません 誰かあれ+SDL/GLFWでテトリスとか作れるの?本当に??
636 :
デフォルトの名無しさん :2010/07/24(土) 12:14:08
糞スレあげ
Haskellでは共有ポインタはどのライブラリですか?
共有ポインタって?
boostだとshared_ptrです
hackage.haskell.orgにはなさそう GCのある言語だから需要が少いんだと思う もし良かったら、どういう用途で使うのか教えてくれないか どうしても必要なら自分で作ればいいんだけど、C++と違ってコピーコンストラクタを定義できないので 不用意にコピーしないように注意深く扱わないといけない気がする
641 :
デフォルトの名無しさん :2010/07/29(木) 18:59:55
Haskellが得意なやつ集合〜♪ haskellでリストの内包表記と再帰用いずに、ピタゴラス数を求められるソース書ける? 俺は無理だがなwwww
642 :
デフォルトの名無しさん :2010/07/29(木) 19:00:05
Haskellが得意なやつ集合〜♪ haskellでリストの内包表記と再帰用いずに、ピタゴラス数を求められるソース書ける? 俺は無理だがなwwww
内包表記と再帰を使って書く →内包表記をdo式で書き直す →再帰をYコンビネータで書き直す
644 :
宿敵はHaskell :2010/07/30(金) 01:05:59
filterとかmapとか使えば書けそうな気もするけど、どうだろう・・・ 誰か書ける人いる?
教えて欲しいなら教えて欲しいと言えば素直に教えるのに。
646 :
デフォルトの名無しさん :2010/07/30(金) 01:21:42
>645 教えてください
再帰型は使ってますが関数の再帰定義は一切ございません pythagoras = y f data Rec a = In { out :: Rec a -> a } y = \f -> (\x -> f (out x x)) (In (\x -> f (out x x))) f g n = if n == 0 then 0 else n + g (n - 1)
こまけぇこたぁはいいんだよ fib = \n -> round $ (((1 + sqrt 5)/2)^n + ((1 - sqrt 5)/2)^n)/(sqrt 5)
ピタゴラス数なのになんでフィボナッチ数列求めてるんだ俺は…暑さのせいか
頭を冷やした こんなんでいいかな f m n = (m^2-n^2, 2*m*n, m^2+n^2) g m = [1..(m-1)] p n = map (f n) (g n) map p [2..10] ただし gcd ≠ 1
map とか使ってる時点で再帰を使ってることと同義ではないのか そんなのでよかったら、適当に再帰を隠したライブラリ自作しても同じだと思うが
652 :
宿敵はHaskell :2010/07/30(金) 17:59:18
友達が教えてくれたよ〜♪ 皆さんもありがとうございました 647さん650さんありがとうございます。
ウソ言うなよ
654 :
647 :2010/07/31(土) 01:31:40
なにをとちくるったのか
ピタゴラス数を1からnまでの和と勘違いしてた
暑さのせいか…
pyth = [ (x,y,z) | x <- [1..], y <- [1..x], z <- [1..2*x*x], x^2 + y^2 == z^2 ]
を643の方法で書き直した。まったくの力技。
再帰型は使ってますが関数の再帰定義は一切ございません
http://codepad.org/aoVADy5Z うちのパソコンだと、(120,119,169)から次がいくら待ってもでてこない…
>>647 の方法ってどこからでてきたの?
Wadlerのrecursive types for freeでおk?
657 :
647 :2010/08/01(日) 14:15:18
Wikipediaの不動点コンビネータの項から拝借しました。
関数型言語で連立方程式解くにはどうしたらいい? 誰かヒントだけでも教えてください。
>>659 とりあえず関数型言語を使わないで考えてみなさい。
>>660 > とりあえず関数型言語を使わないで考えてみなさい。
なるほど。関数型言語を使わない方が楽に解けるということですね。
というのは置いといて。C++では自分ならどう計算するか考えていけばそれほど
苦労せずにプログラムを書けるのだけど haskell ではどう書いたらいいのか想
像もつかない。
>>661 とりあえず、逆行列を計算するプログラムを Haskell で書けばいいと思うが、
それが書けないということか?
行列計算ならHaskellが得意とするところ。
>>664 何でそういうドンピシャな方法を探そうとするかな
まず普通に LU 分解をベタにプログラムしてみればいいじゃん
より洗練された方法を探したり近づけたりするのは、その後でしょ
親切で書いているのだとは思うが何を言いたいのか分からない。
例に連立方程式をだしたのは簡単で洗練された方法が探しにくいからで
C++では行列が与えられて解を求めるまで10行で書いている。
もう一つは配列の要素を次々に書き換えながら処理が進むのでそのあ
たりをどう書くのかのヒントでもと思ったのだが
>>664 のリンク先がドンピ
シャで洗練された方法ということであれば私には haskell を勉強する意
味は無い。
なんでそんな喧嘩腰なのか分からんが、STUArrayあたりを使ってC++のをそのまま移植すればいいんじゃね 「配列の要素を次々に書き換えながら処理が進む」ような計算ならそれが一番素直
>>662 で反射的に逆行列がプログラムできないのかと訪ね、
>>664 でなぜか肯定されてしまったが、
連立一次方程式を解くだけなら LR 分解だけで十分だったな。
すまんすまん。
マジで思うんだけど、2chは博士号取得者か それ相当の実績を持っている人以外は書き込めないようにしてほしい。
>>671 アメリカ社会みたいにすればいいと思う。
実態を知られることのない支配層と、エリート層と、その他の一般大衆
エリートに上がるには能力が必要
真っ先に排除されそうなのが
>>671 というのは
体当たりで挑んだ皮肉なのだろうか
百人の博士の村?を思い出しました。
>>671 はどうやって自分の質問を書き込むつもりだ
博士課程で超能力は取得できんよ?
678 :
デフォルトの名無しさん :2010/08/03(火) 22:23:21
何でhaskell使用する例題って連立方程式だとか、大多数の実務に適用出来ない様な例しかないの? 学生向けオナニー言語?
ふつうのHaskellでも読めば? それとも大多数の実務って要するにCOBOL仕事のこと?
あなたにはCOBOLをおすすめします.
大多数はJavaを使うから問題ないのでは。
Haskellは結局Prologのように”使えないけどおもしろい”言語なんだろうな。
なんでそう思うの?
>>679 Haskell の例題で連立方程式なんて初めて聞いた
>>683 Prologの様にすぐに廃れはしないだろうが、Haskellの重大な欠点は処理速度なんだよなぁ。
それさえ解決できれば次の選択肢として有望なんだがな。
687 :
デフォルトの名無しさん :2010/08/05(木) 12:47:20
きめえwwwwwwwwwwwwwwwなにこのクソスレwwww Haskellやっていみあるの?ww 仕事してるの?wwwなあ?wwwニート&ブログ技術ネタ公開ヲタしかこんなくそ言語やらねえよwwww おめえら ずっと勉強の勉強オタで本番や作品作りによわいアホばっかだろ?wwww Haskellやりながらクソブログにかきつづって 自己満足wwwwwwwwwwwwwwwwwwwwwwwww 仕事は?って聞かれると 何も言えないwwww 御前等クソ「研究してます」 一般ピーナッツ「え・・なんの?」 黒い画面に表示される 御前等クソ「方程式のプログラムです」 オレ「え・・・(苦笑) これだけ?」 くそすぎるこいつら生きてる価値ないよ(笑) 御前等ゴミはご自慢のブログ日記ちゃんのカテゴリに 「D言語 Haskell erlang」ってクソカテゴリつくって そこにゴミみたいな車輪の再発明ネタでも永遠にかきこんでてくださいwwwww ゴミみたいな言語やってどうするの?すぐ人の真似でしょ?wwwwww真似ばっかりwwwww すぐ人の真似wwww真似しかやらないwwww御前等クズはごみhaskellやって日記に永遠とかきこんでてよwwwwww つまらねえからwwwwww一番日記で読む気うせるのは、ただの技術ネタなんだよねwwwwww モジュールの使い方とかツ使いやすいは紹介したりするのはいいけどwwwwごみみたいなちょっとひねった違うやりかたみたいなのやめてくれないかな?wwww 反省したらhaskellやめてしねよ^^;
688 :
デフォルトの名無しさん :2010/08/05(木) 12:48:28
ゴミPHP厨より許されない存在だよ君たちはwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
なんだ、Haskellに一般ピーナッツの人気を奪われたるび厨の遠吠えか。
690 :
デフォルトの名無しさん :2010/08/05(木) 12:50:51
Perlに勝てないくそ言語wwwwwwwww
クソHaskell「それぞれ人により、クソとかどうかは一概には言えない ってことでお前がクソ」
wwwwwwwwwwwwwwwww
wwwwwwwww
おめえがくそだよごみwwwwww
>>689 てめえみたいなゴミはhaskelやってろよwwwwwwwwwしねよごみ
今すぐ市んでくれない?うざいんだよ
691 :
デフォルトの名無しさん :2010/08/05(木) 12:52:04
Haskellばっかやって目ん玉いかれたのかな?^^; もうメガネどもに書くね^^; ゴ ミ P H P 厨 よ り 許 さ れ な い 存 在 だ よ 君 た ち は(苦笑)
692 :
デフォルトの名無しさん :2010/08/05(木) 12:56:16
>>679 ,687,688
はいはいわろすわろす
実務の大多数はゴミみたいなもんだろ
このレベルの気違いがスレに現れるとは、ようやくHaskellも有名になってきたんだな
694 :
デフォルトの名無しさん :2010/08/05(木) 12:58:41
っていうけど自分はHaskell使った事無いんですよどんな感じなんですかね? Perlよりごみなのは確実ですか楽しいですか?(笑) あとHaskellの本をブログなどに自慢げに載せてるバカいますがどんな心情なんですかね(笑) 将来の夢はゴミ研究者ですか そうですか アンケートありがとうございました^^;(苦笑)
695 :
デフォルトの名無しさん :2010/08/05(木) 13:04:29
私「Haskellをやってる理由はなんですか?」 バカ「け、けけけけ、研究でつかうんででです」 私「はいそうですか(苦笑) Haskellを使ってなんか作った事はありますか?」 バカ「あ、あはい まままだないです 方程式のプログラムつくってます 卒論はhaskellでゲームです」 私「ゲームなら他の言語があるんですが 何故haskell?」 バカ「ゆゆゆゆ有名な人がブ、ブブブ、 はぁはぁ・・・ちょっと待ってください」 私「はい^^;」 バカ「ゆ、ゆ、有名な人がブログで使っていて あ、、あ、あとHaskellって名前がHacker(ハッカー)みたいだからかっこいいからは、はは、じめました」 私「鼻息あらいですよ?大丈夫ですか?」 バカ「ふんがーふんがー 初音ミクちゃんさいこう! ブログの自己紹介や壁紙では ケイオンとかつかってます」 私「そんなこと聞いてないんですが^^;」 私「これでアルファギークの質問は終わりです ありがとうございました^^;(苦笑) バカ「フンガッ!はぁはぁ は、はははい! ありがとうごじました」 私「キモッ・・・」
ハカセ様もいろいろだな 暑い日が続いているから大変なんだろうな
Part12まで来て初の出来事かもしれない
699 :
デフォルトの名無しさん :2010/08/05(木) 14:46:28
>>698 博士号もっててそんなうれしい?wwwwwwwwwwww
俺はノーベル賞もってるけどなwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
低レベルすぎるよ君
2chをアカウント制にして申請時に身分証明と審査を行えばいいんじゃね。
そうすれば
>>699 みたいなカスはレスできなくなってキレイな2chの出来上がり。
701 :
700 :2010/08/05(木) 15:45:22
2chをアカウント制にして申請時に身分証明と審査を行えばいいんじゃね。
そうすれば
>>700 みたいなカスはレスできなくなってキレイな2chの出来上がり。
702 :
PHPヲタ :2010/08/05(木) 15:49:23
関数型プログラミングをやってるバカの例 1、手続き型言語しかやったことないやつは 一度でもいいから関数型言語やってみろよ wwwwwwwwwwwwwwwwwバカ発症しちゃってるwwwwwww 職場にhaskellやってるばかがいるよwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww たいしてプログラミングできねえのにブログにつづってて難しいことやってる自分がかっこいいとおもってるやつwwwwwwwww
重要なのは主観ではなく成果だな
そんなに暑いかなあー
705 :
PHPヲタ :2010/08/05(木) 16:04:30
職場のhaskellやってるバカ「Haskellの本もってる人はできるとおもうな(笑)」 痛々しい発言だよねwwwwwwwwwwwwブログにも書いちゃってwwwwwwww Haskellの白い本持ち歩いてる割に クソだし、あんまり役に立ってない 下手の横好き まじしんでいいとおもうよwwww
>>671 2chから博士号取得者かそれ相当の実績を持っている人以外を追い出すより
博士号取得者かそれ相当の実績を持っている人だけのBBSを作った方が早いだろボケ
707 :
デフォルトの名無しさん :2010/08/05(木) 16:24:24
_, ._ ( ・ω・) んも〜 ○={=}〇, |:::::::::\, ', ´ 、、、、し 、、、(((.@)wvwwWWwvwwWwwvwwwwWWWwwWw wWWWWWWwwwwWwwvwWWwWwwvwWWW wvwwWWwWWWwvWwwwwWWwWWWwWWWWwWWWWWwWWWWWWwWWWWWWWwWwwwwwwwwwwwwWWWWwWWWWWWWwWWWW WWWWWWWWWWwWWWWWWWWWWWwwWWWWWWWWWWwwWWWWWWWWWWWWwWWWWWWWWWWwwWWWWWWWWWWwwwwwwWWW WWWWWWWWWWWWwWWWWWWWWWWWWWWWWWWWWWwWWWWWWWWWWWWWWWWWWwwWWWWWWWWWWWWWWWWWwwWWWWWW WWWWWWWWWWWwwwwwWWWWWWWWWWWWWWWWWWWWwwWWWWWWWWWWWWWWWWWWWWWWwWWWWWWWWWWWWWWWWWWW WWWWWWwwwwwwwwwwwwwwwwwwwwwwwwwwWwwwwwwwwwwWWwwwwwwwWWWwwwwwwwWWWWwWWWWWwwwwwwww WWWWWWwwwwwwwwwwwwwwwwWWWWWWWwwwwwwwwwwwwwwwwwwwwWWWWWWWWwwwwwwwwwwwwwwwwwwwwwww wwwwwwwwwwwwwWWWWWWWWWwwwwWWWWWWWWWWwwwwwwwwwwwWWWWWWWWWWWwwwwwwwWWWWWWWWWWWWwww wwwwwwwwwwwwwwwWWWWWWWWWWWWWwwwwwwwwwwwwwwwwwwwwwwwww
>>686 もちろん適用領域にもよるんだろうけど
そんなに重大な問題かなあ?
>>709 重大だよ。
C10Kパッケージはもっと最適化する余地はあるけど、
Haskellがもっと早ければもっと高パフォーマンスのWEBサーバを作れるよ。
Haskell の遅さは何が原因?
遅延評価のために、IntやCharみたいな小さい値までポインタ経由で持つこと でかいレコードの一部のみ更新したいときに全体を再構築せざるを得ないこと デフォルトの文字列型がCharのリストであること
ポインタ経由っていうかクロージャ参照かな。 突き詰めたらポインタなんだけどねw rubyとかで遅延評価を実装してみたらわかると思うけど。
もしHaskellが高速だったら・・っていうケースはいっぱいあるよ。 もしHaskellが高速だったらHaskellによるPerl6の実装Pugsがデファクトスタンダードになったかもしれない。
マジレスは禁止ですw
>>712 >でかいレコードの一部のみ更新したいときに全体を再構築せざるを得ないこと
レコードのフィールドは全部ポインタになってて、
一部を更新するとレコードのガワは新たに作られるけど、
変更されていないフィールドは前のレコードが指していたのと同じモノを指し、
変更されたフィールドだけ新たに作られてそこを指すようになってると思ってた。
巨大なレコードに色んな値を詰め込んで、
グローバル変数の様にころころ更新させて使うのは危険なのか。
勉強になった。
>>717 >レコードのフィールドは全部ポインタになってて、
>一部を更新するとレコードのガワは新たに作られるけど、
>変更されていないフィールドは前のレコードが指していたのと同じモノを指し、
>変更されたフィールドだけ新たに作られてそこを指すようになってると思ってた。
いや、それで合ってる
>>712 で言ったのは、一番外側のレコードを作り直すだけでもオーバーヘッドが無視できないってこと
フィールドが沢山あればそれだけ時間が掛かるし、メモリ確保も伴うからGCのコストにも寄与する
C言語なんかで x.a->b->c += 2; とかやるのと比べれば凄く重い処理
おいこらもっと荒せよ Haksellスレがこんな流れになるのなんて最初で最期かもしれないんだから
効率もそうだが、書くのが面倒。 Cだと s.f.g++; ですむ処理が s { f = f s { g = g (f s) + 1 } } になる。
Data.Accessorを使って f^.g ^: (+1) $ s とか書けるけどそれでも効率はどうしようもない…
723 :
デフォルトの名無しさん :2010/08/06(金) 13:38:32
まだ語ってるの????????????? 痛すぎるよwwwwwwwwwwwwwwwwwwwwww本と御前等うんこいかだね!! カスすぎるよwwwwwwwwwクソすぎてかわいそうwwwwwwww 無駄な努力wwwwwwwwwwwwww
724 :
PHPヲタ :2010/08/06(金) 15:40:13
くそばっかだなwwwwwwwwww 君たち頭良いんだろ?だったら教えてくれないか? プログラミングおしえてくれwwwwwwwwwwwwwwなあああああ?wwwww コツとかうんちくとか何でも良いから教えてくれよwwwwwwwwwwwwwwwwwwwww
まってたよ、この調子でどんどん頼む
ごぜんなど、うんこ烏賊だ? 俺は御前なんて呼ばれるほど立派なやつじゃないぜ。」 うんこイカって何だよ? 臭いの?
うんこの調子
HackageDB から適当なパッケージを落としてきて "cabal haddock" したらエラーが出た(適当に改行を入れた)。 haddock: internal Haddock or GHC error: E:\Program Files (x86)\Haskell\haddock-2.7.2\html\haddock.css: openFile: does not exist (No such file or directory) haddock.css は本当はこんなパスには無く、 "C:\Program Files\Haskell\haddock-2.7.2\html\haddock.css" にある。 だから "cabal haddock --css="c:\..."" とパスを指定してやったら、 今度は別のエラーが出た。 haddock: internal Haddock or GHC error: E:\Program Files (x86)\Haskell\haddock-2.7.2\html\haskell_icon.gif: openFile: does not exist (No such file or directory) 何で検索パスが "E:\Program Files (x86)\..." になってるのか分からない。 どうすれば "C:\Program Files\..." に治せますか?
>>729 Aドライブを新たに作り、haddock.exe をそこに置くという意味ですか?
申し訳ない、言い忘れました。
現在ドライブはC(メイン)とD(光メディア)しかありません。
どこかに haddock の設定ファイルなどがあり、
そこにEドライブへのパスが書かれているのではと思いましたが、
探しても見つかりませんでした。
また、cabal の設定ファイルも開いてみましたが、
haddock そのものの場所に関するパラメータは無かったようです。
>>731 すいません、その場しのぎではなく、
意図しない動作の理由を知って解決を図りたいです。
具体的には "E:\Program Files (x86)\..." というパスが
何によって決定されたのかが知りたいです。
その上で、今のところその場しのぎでしか進めないのなら、
それはそれで仕方がありません。
cabal haddock --verbose=3とかやってどんな出力がでるか見せて
Haskell に直接は関係ないかも知れんが、 wxHaskell を使ったプログラムを ghc ではコンパイルできるけど、 今のところ ghci 上では実行できないよね。 これって、wxHaskell に必要な stdc++ ライブラリが静的なものしか無く、 ghc は静的ライブラリを埋め込んでコンパイルできるけど、 ghci は動的ライブラリしか使わないようになってるから、 stdc++ ライブラリが無いよと怒られるわけだよね。 これって、stdc++ の動的ライブラリ版を作って解決できないの?
reactive ライブラリの integral 関数の挙動が分からない。 integral :: (VectorSpace v, Scalar v ~ TimeT) => Event () -> Behavior v -> Behavior v そもそも、ライブラリのドキュメントには Euler integral とだけ書かれており、 引数の説明は全く書かれていないので、結果の値から想像するしかない。 おそらく、第2引数のビヘイビアに対して定積分した結果を 戻り値のビヘイビアとして返しているのだと思うが、 第1引数のイベントの役割が分からない。 例えば time ビヘイビアの TimeT による a から b までの定積分は、 (a^2)/2 - (b^2)/2 だと思う(下記の挙動を見ると自信が無くなる)。 そこで次のようにプログラムすると、v の 4 秒目以降の値は 16 だ。 v = atTimes [0, 4] `integral` time イベントのタイミングが積分範囲になっていると予想していたが、 違っていたようだ(それなら 16 ではなく 8 になっているはず)。 次のだと、2 秒目から 4 秒目までが 4、4 秒目以降が 12 だ。 v = atTimes [0, 2, 4] `integral` time 意味が分からない。 この第1引数のイベントはどのように働いているのだろうか。
738 :
736 :2010/08/14(土) 23:34:26
>>736 しまった、書き間違えた。
> 例えば time ビヘイビアの TimeT による a から b までの定積分は、
> (a^2)/2 - (b^2)/2 だと思う
a と b が逆だった。正しくは
(b^2)/2 - (a^2)/2
イベントの度に (前イベント時の積分値(初期値0))+(現イベント時の値)*(前イベントと現イベントの間の時間) を出力してるように見える。 そうだとすれば、atTimesで与える時間を細かくたくさんにすると 解析的に求めた定積分に近づくかな。
740 :
736 :2010/08/15(日) 01:05:47
>>739 なるほど、短冊の面積を足してるのか。
たしかに atTimes [0.0, 0.5 ..] にすると 4 秒目は 7 になって、
解析的に求めた定積分に近く。
その計算であってると思う。
ありがと、納得した。
でも、イベントをたった 0.25 秒刻みに設定するだけで処理が重くなり、
時間通りにイベントを捌けず渋滞を起こすようだ。
実用には耐えられん、何だろこの機能。
GLUT を試してるんだけど、 forkIO で分けた別スレッドから postRedisplay を呼ぶと、 何故かウィンドウ上をマウスが動いている間しか再描画されない。 (再描画 = displayCallback に設定した関数を呼ぶ) 普通に同じスレッドの、たとえば idleCallback に設定した関数内で呼べば、 ちゃんとそのタイミングで再描画される。 こういうもの? 実際にやりたいことは、yampa を使って計算した値を元に OpenGL で描画すること。 たとえば GLUT を使うと GLUT の mainLoop も、yampa の reactimate も、 どちらも制御が戻ってこないから、どちらかをサブ スレッドにしないといけない。 今は reactimate の第3引数に渡した関数内で postRedisplay を呼んでる。 どうすればいい?
742 :
741 :2010/08/17(火) 00:25:50
[[a,b,c]| a<-[1..10], b<-[3..15], c<-[10..20]] 上記は3つの集合の場合ですが 不定個の集合で同様の事をする関数はどう書けば良いですか?
すいませんググったらありました ごめんなさい
GLFW を使おうとしたら、openWindow 関数の第1引数でエラーが出ました。 次のがエラーが出る最小限のコードです。 import Graphics.Rendering.OpenGL as GL import Graphics.UI.GLFW as GLFW a = GLFW.openWindow (GL.Size 640 480) ghci を立ち上げて、上記コードを書いたファイルをロードしたら、 次のエラーが出ました。 Couldn't match expected type `OpenGL-2.2.3.0:Graphics.Rendering.OpenGL.GL.CoordTrans.Size' against inferred type `Size' 環境は次の通りです。 Windows7 Haskell Platform 2010.2.0.0 (GHC 6.12.3) opengl-2.4.0.1 glfw-0.4.2 Haskell の OpenGL ライブラリのバージョンが新しすぎるのでしょうか。
Haskell の OpenGL には glPushMatrix と glPopMatrix に対応する関数はないの?
ghciで,メモリ使いまくるので関数の評価を強制終了させたんですが メモリ使用量は減りません。 強制カベッジコレクションはできますか?
>>746 これ
preservingMatrix :: IO a -> IO a
渡したIO aの前後でpopとpushを自動的にやってくれる
preservingMatrix $ do
loadIdentity
....
みたいに使う
>>750 そいつか、ありがと
今まで Graphics.Rendering.OpenGL.Raw から
glPushMatrix と glPopMatrix をわざわざインポートしてた
状態変更関数の固まりのせいで返って読みにくくなっちゃうのか>>OpenGLをHaskellで使う
>>752 状態変更関数による読み難さはそれほどでもない
それよりも GLfloat や GLint などへの型変換がうっとうしい
fromIntegral や realToFrac などの関数と :: GLfloat とか
:: Vector3 GLfloat などの明示的な型宣言をセットで書かないといけない
だから、結局のところ楽に記述できるように一枚ラップを自作することになる
754 :
忍者Perl ◆M5ZWRnXOj6 :2010/08/21(土) 12:13:57
なにこのクソスレまだあったんすか!!ッシュッシュッシュ!!!!!!!!!!!!!!!!!!!!!!!!!!! シュッシュッシュパネーーーーーーーーーーッス!!シュッシュッシュパネーーーーーーーーーーッス!!シュッシュッシュパネーーーーーーーーーーッス!! wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww シュッシュッシュパネーーーーーーーーーーッス!!シュッシュッシュパネーーーーーーーーーーッス!!シュッシュッシュパネーーーーーーーーーーッス!! wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww シュッシュッシュパネーーーーーーーーーーッス!!シュッシュッシュパネーーーーーーーーーーッス!!シュッシュッシュパネーーーーーーーーーーッス!!シュッシュッシュパネーーーーーーーーーーッス!! シュッシュッシュパネーーーーーーーーーーッス!!シュッシュッシュパネーーーーーーーーーーッス!!wwwwwwwwwwwwwwwwwwwwwwwwwwwwww シュッシュッシュパネーーーーーーーーーーッス!!シュッシュッシュパネーーーーーーーーーーッス!!シュッシュッシュパネーーーーーーーーーーッス!!wwwwwwwww wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww シュッシュッシュパネーーーーーーーーーーッス!!シュッシュッシュパネーーーーーーーーーーッス!!シュッシュッシュパネーーーーーーーーーーッス!!wwwwwwwwwwwwwwwww wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww シュッシュッシュパネーーーーーーーーーーッス!!シュッシュッシュパネーーーーーーーーーーッス!!シュッシュッシュパネーーーーーーーーーーッス!! wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww シュッシュッシュパネーーーーーーーーーーッス!!シュッシュッシュパネーーーーーーーーーーッス!!シュッシュッシュパネーーーーーーーーーーッス!! wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww シュッシュッシュパネーーーーーーーーーーッス!!シュッシュッシュパネーーーーーーーーーーッス!!シュッシュッシュパネーーーーーーーーーーッス!!シュッシュッシュパネーーーーーーーーーーッス!! シュッシュッシュパネーーーーーーーーーーッス!!シュッシュッシュパネーーーーーーーーーーッス!!wwwwwwwwwwwwwwwwwwwwwwwwwwwwww シュッシュッシュパネーーーーーーーーーーッス!!シュッシュッシュパネーーーーーーーーーーッス!!シュッシュッシュパネーーーーーーーーーーッス!!wwwwwwwww wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww シュッシュッシュパネーーーーーーーーーーッス!!シュッシュッシュパネーーーーーーーーーーッス!!シュッシュッシュパネーーーーーーーーーーッス!!wwwwwwwwwwwwwwwww wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
755 :
デフォルトの名無しさん :2010/08/22(日) 22:50:36
「やさしい Haskell 入門」や「本物のプログラマは...」 などで紹介されている 遅延パターンの説明で -- ファイル: TT.hs module Main where reqs = client inits resps resps = server reqs client a (b:bs) = a : client (next b) bs -- @非遅延束縛とした場合 server (c:cs) = process c : server cs inits = 0 next d = d process e = e+1 main = print $ take 10 reqs -- ファイル END 非遅延パターンで実行形式を ghc --make TT.hsで作成し、 $ ./TT TT.exe: <<loop>> と表示され ghci では $ ghci TT.hs :main (エラー表示なしで終了しない) となります。 実行形式の場合の <<loop>> とは、stack overflow となることを 実行時の処理系が検知して表示しているのでしょうか?その場合 ghci が終了しないのは何故でしょうか? stack overflow と関係ない場合の <<loop>> の意味は?
>>755 式の評価が無限ループに陥ったことを検出してる
(技術的には、あるサンクの評価中にそのサンクの値が必要になったらNonTermination例外を投げる)
ある意味お節介機能だし、完全にやるのは無理なので、働かなくても文句は言えない
ghciで働かないのは何故だろう、俺は知らない
757 :
デフォルトの名無しさん :2010/08/23(月) 09:01:31
>>756 ありがとうございます。
>あるサンクの評価中にそのサンクの値が必要になったらNonTermination例外を投げる)
サンク reqs の評価中に、client をサンク respsに適用しようとして
resps の評価に、server をサンク reqs に適用しようとして、
ループを検出する。ということですね
758 :
Perl忍者 ◆M5ZWRnXOj6 :2010/08/24(火) 17:15:52
自称博士+研究者の集い(笑)
Perl忍者()
スルーできてない男の人って…
スルーしたら俺の常駐スレにやってきちゃうだろ!
どこよ
このリスト内包表現中のlet式ってどう考えたらいいの? let式が二つ連続してるし、inがないんだけど。。 [ x | y <- [1..99], z <- [y..99], let x = y * z, let s = show x, s == reverse s ]
ふつうのlet式とは関係ないと考える
do式の「let文」と同じようなもの do y <- [1..99] z <- [y..99] let x = y * z let s = show x guard (s == reverse s) return x
766 :
763 :2010/08/29(日) 12:30:17
> 765 あぁ、なるほどね! リスト内包表現中は特殊なのね。 ありがとう!
>>767 「回避できる」というのは「記述を回避できる」という意味であって発生しないという意味ではないと思う。
雑多で定型的な操作をモナドに押し込めてしまえば、見かけ上は構文をそのまま書き下せるので綺麗だねっていう話。
IOモナド以外はsyntax sugarと思っておけば間違いない
まあそうだな。 Haskell に限らず、大抵の言語は処理の単位をどう抽象化するかに注意を払って設計している。 例えば C なんかで極論すればループ構文は goto と if の組み合わせの構文糖衣だと言えるけど、 「分岐とジャンプ」で考えるのと「ループ」という概念で考えるのとではまるきり違うってのはわかると思う。 モナドも何だかんだの処理を纏めたもの、関数の束でしかなくて無くて、モナドが無ければ無いなりに使えるとは思うよ。 でも、「モナドという考え方」を導入したことでわかりやすくなる部分がある。 利点を短くまとめるのは難しいな。 強いてまとめるなら Haskell ではモナドを使うと簡潔に書けるケースが実際に多いってことだな。
>>770 「System.Collections.Generic.IEnumerator<T>とLINQ」で考えるのと
「リストモナドと内包表記」で考えるのが、まるきり違うだろうか。
何らかの抽象化を施せば、両者は同じになるはずだ。
しかし現実には、抽象化よりも差別化が重要視されたのだと思う。
C#やSQLなどと差別化するための「関数型らしさ」を出すための構文糖だと思う。
パターンが見えているような見えていないような 機械的にやれそうでよくわからない という状況を見えやすくしてくれるのがモナド ということにしたかったんだよ。成功しているかどうかはともかく。
直感と数学的整合性はときに衝突することがある。 「人間は論理的ではない」ので Haskell が誰にとっても使い易いというわけにはいかないだろう。 わかる人にはわかる。 まるで禅問答のようだ。
Haskellは規格制定時点における関数型言語の最新研究成果をまとめた言語であり、 ZF記法のような構文糖や遅延評価前提は、できる限り数学の記法(いわゆる数式)に 近い表現を持ち込んだ言語設計のように見える だから、数学者(あるいは数式表現に慣れた人)なら直感的に理解しやすいけど、 数式(数学的思考法)に不慣れな一般のプログラマには理解しづらいのでは? などと、数学が苦手だたけど現在Haskellと格闘中の初心者が言ってみる
タプルのおかげで逆に数学の直積の意味を知った僕がいる。 直積=「安直に積んだもの」って標語を自分で作って覚えた。
双対性ってのが結構面白いと思った。
GHC の次期リリース haskell 2010 に準拠して、 version 7.0とかになるんかな
完全オブジェクト指向脳のHaskell入門者です。 IOモナド等の一方向モナド(普通の値を取り出せないモナド?)は 例えばIOの場合、IOという型コンストラクタがないので、パターンマッチでIO x = ... のようにかけないために、普通の値を取り出せないってことでいいのでしょうか? もし合ってるならやっと眠れる...。
IOが型コンストラクタ ないのはデータコンストラクタ
780 :
778 :2010/09/12(日) 02:26:44
データコンストラクタでしたorz ですが少しわかりました。Haskellおもしろいですね。
781 :
778 :2010/09/12(日) 02:29:55
あれれ、すみません。また疑問が。。。 では、IOモナドのreturnはどうやってIOを作り出しているのでしょうか? 処理系に隠蔽されている?
>>781 モナドをどのように扱っているかは処理系によるが、
mainの返り値がIOモナドになっている以外は、IOモナドも普通のモナドと何ら変わらない。
3つのモナド則に従う普通のモナドだよ。
まずプログラムが起動すると、いきなりmainがIOモナドを返し、その実行が開始される。 実行が開始されると中身が評価されるってわけ。 それが遅延評価。
えっとIOがMonad型クラスのインスタンスである以上、 return :: a -> IO aが実装されていると思うのですが、IO aを作り出すデータコンストラクタ がないので、どうやってreturnが定義されているのかわからないのです。
785 :
778 :2010/09/12(日) 02:50:51
↑778です。
>>784 IOのreturnはプリミティブだと思うよ。
実装によって違うだろうけど。
787 :
778 :2010/09/12(日) 02:59:20
>>786 おお、わかりました。ありがとうございました。
windows版はデフォルトでparsecは入ってないんでしょうか ググってわかったのは Text.Parsecに名前が変わった ghc-pkg listで今入ってるリストがわかること 試したのは ghc-pkg list | grep parsecの結果が0なこと ghc -o hoge b.hs -package parsec cannot satisfy -package parsec これって「今インストールされて無い」ってことですよね
ありがとうございます。それを試してみます。 たった今cabalとか言うのを知って、 pdf見てmtl -> parsecの順でconfigure,build,installしたけど 多分オプションまちがってたのか、失敗したところです。
サンプル動いた!深夜にありがとうございました
Haskell のクロスプラットフォーム開発を行いたいです。 Windows 上の GHC で Haskell ソースをコンパイルして Linux(CentOS 5.5)用の実行ファイルを作成する方法はありますか? 具体的にやりたいことは、Haskell で CGI を作ることです。
インタープリターでええんちゃうん?
LinuxでSamba動かしてファイル共有でWindowsから見えるようにして、 Windowsのエディタで編集。TeraTermか何かでリモートログインして Linuxでコンパイル、じゃダメなの?
そもそもLinuxにGHCが入ってない&入れられないってことなんじゃないの? GHCでクロスコンパイルとかできないと思うから、 virtualboxとかで仮想PCにLiunx&GHC環境作ってコンパイルするのが良いと思う。
ghcはバックエンドでgccを動かせるから,そこをクロス用の設定にすればよいかと
GHCの吐くGCC用コードが素直にクロスコンパイラなGCCを通ってくれそうにはとても思えない。 やってみたわけではないのでサクッとできるかもしれないけど。
GHCに(それなりに)ポータブルなCを吐かせるにはunregisterizedなGHCを用意しないといけない
すごく面倒だと思う
たぶん
>>795-796 が最短ルート
800 :
793 :2010/09/17(金) 19:15:21
みなさん、ありがとうございます。 サーバー側で Haskell ソースをコンパイルして CGI として公開することは成功しました。 クライアント側を Linux にして、 そこでコンパイルしたモノをサーバーにアップしてCGI として公開することも成功しました。 クライアント側を Windows にして、 そこでコンパイルしたものでやってみたいのですが、 どうも「できなくはないだろうが、そうとう面倒」みたいですね。 でも、いくつかヒントを戴けたので挑戦してみます。
801 :
793 :2010/09/17(金) 19:56:50
>>794 すいません、言い忘れてました。
インタープリタ形式でも CGI として動くことを確認できました。
処理速度を求めなければ、これが一番簡単ですね。
全部10以上かしらべるのに all ((<=)10) [10,20,30] よりは all (flip (>=) 10) [10,20,30] が直感的だけど all (`>=` 10) [10,20,30] こうできれば良いのに
all (>= 10) [10,20,30]
all (10 <=) [10, 20, 30] の方がより直感的に感じるが
>>805 対称的になってて見栄えがいいとは思う
さらに
(10 <=) `all` [10,20,30]
とかやると逆に`all`の存在で対称が崩れてるような感じになって見栄えが悪く感じる
直感って本当にわがままだな、わがままな俺にそっくりだ
807 :
デフォルトの名無しさん :2010/09/18(土) 20:49:51
GHCi で take 3 (reverse [1..1000000]) はちゃんと結果を返すけど take 3 (reverse [1..1000000000]) を実行すると死んでしまうのは何故ですか?
reverseするにはリストを最後までたどる必要があるため、 ヒープにリストが入りきらなくて死ぬ。
64bit環境ならいけそうだな
810 :
デフォルトの名無しさん :2010/09/18(土) 21:26:35
>リストを最後までたどる必要があるため それは何故? 遅延評価するなら、take 3 が必要な3つだけ要素を生成すればいい、 ってわけじゃないの? それとも遅延評価させるには何か指令が必要だったり、 または Haskell は遅延評価をサポートしてないの?
>>810 だって、双方向リストじゃないんだから一番後ろの3つを手に入れるためには
前から順番にたどっていかなきゃいけないでしょ?
>>810 自分でreverseを書いてみればわかるよ
うーむ、[1..1000000000] は単方向リストだったのか でもそれって実装上の問題じゃないの?
>>814 しかし双方向リストって凄いメモリ食うぞ
ただでさえHaskellはメモリ食いって言われてるのに・・・
[1..1000000000]がどう言う構造かって仕様で決まってるんだと思ってた。
GHC の Linux (X86) 版を使ってみたいのだけど、 2つあるファイルのうち、どちらを選べばいいのか分からない。 ghc-6.12.3-i386-unknown-linux-n.tar.bz2 (106 MB) ghc-6.12.3-i386-unknown-linux-t.tar.bz2 (106 MB) 後者は libtinfo.so.5 が要るって書いてある。 これは端末非依存形式で TUI の API を提供するという ncurses パッケージに入っている事までは調べられたけど、 これが GHC とどう関係するのか分からない(ghci で使う?)。 結局、何を基準にしてどちらを選べばいいの?
というか関数型言語ならリテラルが用意されてるリストっぽいのは大抵単方向リストじゃない?
>>819 実装では真面目な単方向リストとしては実装されていないよ。
GHCではlst!1もlst!100もかかる時間は同じだったような気がする。
別の実装ではまた違う結果が出るかも。
100くらいじゃね。
diffList xs [] = xs diffLIst [] ys = ys diffList (_:xs) (_:ys) = diffLIst xs ys lastn n xs = diffList (drop n xs) xs lastn 3 [1..1000000000] は、コンパイルせずrunghcで七分半ほどで結果を出した。 ghc -O2 でコンパイルしたものは30秒ほどで返ってきた。 take 3 $ reverse [1..1000000000] は30分待っても終わらない挙句、スワップファイルが増殖して HDDの空き容量を食いつくしても終わらない。 2GHz Intel Core 2 Duo メモリ 2GB Mac OS X 10.6.4 ghc 6.12.3 でした。
823 :
デフォルトの名無しさん :2010/09/19(日) 07:39:59
関数型言語での遅延評価の実装方法に依存する話だと思うけど、 [1..1000000000] はリストを正格に生成せず、最初と最後のイテレータを生成し、 reverse でイテレータ順序を反転するアダプタを生成し、 それを take 3 に食べさせれば 結果は瞬時に求まって、事はすべてまるく収まると思うんだけど、違うのかな?
いやHaskellのリストは真面目な単方向リストだよ
data List a = Nil | Cons a (List a)
と同じ構造
>>823 のようなことをやりたければ、リストじゃない別のデータ構造が必要
>>823 > [1..1000000000] はリストを正格に生成せず、最初と最後のイテレータを生成し、
> reverse でイテレータ順序を反転するアダプタを生成し、
> それを take 3 に食べさせれば
それって双方向リストかもしくは配列にしないとできないのでは。
双方向リストはメモリの関係で嫌がられるしなぁ・・・
関数型言語でメモリアクセスの仕方を気にするって 馬鹿らしくね?
パターンマッチの仕方を気にするんだ リストの構造は二種類あって [] x:xs この二者択一だから、最初の要素をxとおくことは簡単だが、最後の要素は難しい
双方向リストとか配列だと結局メモリにデータを全部置くことになるから、
たぶんC++の双方向イテレータみたいなのを考えてるんだろう
Haskellだとこういう感じ?
http://ideone.com/bgI8P >>826 どんな言語だろうが有限メモリの計算機で走らなきゃ無用の長物だろ
>>825 >双方向リストはメモリの関係で嫌がられるしなぁ・・・
そんなあなたにマジックリスト
(多少アクセス速度が犠牲になるけどね。)
>>825 > それって双方向リストかもしくは配列にしないとできないのでは。
> 双方向リストはメモリの関係で嫌がられるしなぁ・・・
いや、だから引数を評価(生成)せずイテレータを生成すればいいじゃん。
オブジェクトの生成は必要になるときまで遅延するのが関数型言語ってもんじゃないの?
> 826 関数型言語を使う人がメモリアクセスの仕方を気にするのは変だよね。 言語を実装する人が気にする話。
>>830 825じゃないけど、イテレータを生成するのはいいが、
実際には末尾の要素までどうやって到達するの?
>>830 ちょっと誤解してると思う
「Haskellが計算を必要なときまで遅延する」ってのは、単にcall by needを採用しているという意味であって、
なにかすごく賢い方法で不要な計算を省いてる訳じゃない
そしてcall by needでreverseを計算すると、リストの最後まで辿るのは避けられない
もう一つ、関数型言語だからといって遅延評価とは限らないよ
>>830 言いだしっぺの法則
〜すればいいじゃんって言ったやつが自己責任で〜すればいい
>>832 take 3 (reverse [1..1000000000]) の場合であれば、
(最初の要素から)末尾の要素まで到達する必要は無いだろ
末尾の要素から前に向かって3つの要素を生成するだけ
take 3 (reverse [1..1000000000])
take 3 [1000000000..1]
[1000000000, 999999999, 999999998]
[x..y]はenumFromTo x yで [..a,b..]のときbはsucc aで定義されるんで 末尾の要素が必要になった時点でsucc.succ....というのが作られるから無理 succのかわりにpredを使うenumToFromとかあればそういうのもできるけど reverseによりenumFromToと切り替えるみたいな機構が必要になるからもはや普通のリストとはいえない代物になる
>>830 イテレータを生成できるかどうかはコンパイラに判断させる気?
それとも、プログラマが指示するの?
このリストはこのようにしてイテレータで表現できるぞ、とか。
後者なら、そういう型クラスとインスタンスを作るのと何ら変わらないよ。
前者なら、コンパイラはどうやってイテレータを作るわけ?
たとえば100万個の要素のフィボナッチ数列の後ろ3つ欲しい場合、
コンパイラはどうするの?
> reverseによりenumFromToと切り替えるみたいな機構が必要になるからもはや普通のリストとはいえない代物になる 普通のリストでないとダメなの?
>837 イテレータは常に生成されるが、それが指す要素が実際に生成されるのは 要素が参照された場合のみ。 > たとえば100万個の要素のフィボナッチ数列の後ろ3つ欲しい場合、 > コンパイラはどうするの? この場合は前から順にイテレータの要素が参照されるので、順に値が生成される
>>839 ちょっと待て、それなら [1..100] だって
結局前から順にイテレータの要素が参照されなければ
後ろ3つは計算できないだろ。
[1..100] は要するに [n1=1, n2=n1+1, n3=n2+1, ...] ではないのか?
>>839 お前のいうようなイテレータ方式は可能だけど、Haskellのリストはそういう物じゃないんだよ
具体的には、
・同じリストを二回走査した場合、要素の値を計算しなおしてはいけない
・リストの先頭に要素を追加する演算(:)が定数時間で終らないといけない
みたいな要求があって、イテレータ方式とは相容れない
始点と終点と次の要素を計算する関数だけを持つとして [1..n]だと(1,n,succ) inv succ = predだとして(predがpartial functionであることはとりあえずおいとく) reverse (1,n,succ) = (n,1,pred) takeはどう定義しよう、継続か? take 3 xs = (n,1,pred,take 3) でこれを普通のリストに変換する手段を使る toList xs = take 3 (until (==1) pred n ++ [1]) 仮にreverse (take 3 (reverse [1..n]))とかやったときに2回目のreverseも上の定義でいいのかな?
>>838 Haskellは無限リストと有限リストを区別しないのが自慢だった
後ろの要素を取れるのは有限リストに限定されるからダメ
data NR s e = Succ s e | Pred s e tolist (Succ s e) = [s..e] tolist (Pred s e) = [ s + (e - x) | x <- [s..e]] reverse_ (Succ s e) = (Pred s e) reverse_ (Pred s e) = (Succ s e) take_ n (Succ s e) = Succ s (s + n) take_ n (Pred s e) = Pred (e - n) e tolist (reverse_ (take_ 3 (reverse_ (Pred 123 1000000000)))) [126,125,124,123] haskellはよく解らないのですが、これでどうですか?
845 :
844 :2010/09/19(日) 23:04:43
間違い。 take_ n (Succ s e) = Succ s (s + n - 1) take_ n (Pred s e) = Pred (e - n + 1) e
>>844 どうですかと言われても、そのコードを提示した目的が分からん。
何が言いたいんだい?
旧来の言語では、ふつうのリストと遅延リストが区別され、 両方に対応するためほとんど同じような関数を二度も書かされるという、 おかしな事態に陥っていました。 そこで、ふつうのリストと遅延リストを区別しない言語が開発されました。 ある日、reverseが非効率なことに不満を持ったプログラマーが 効率的にreverseできるリストを発明し、普通のリストと区別することにしました。
>ある日、reverseが非効率なことに不満を持ったプログラマーが 正しい選択だね。現実世界のプログラミングでは、効率は重要な要素だから。 同様に、現実世界は入出力や状態遷移に代表される副作用に満ちあふれている。 それをモナドやアローといった回りくどいやりかたでしか表現できないとしたら、 それは「おかしな事態に陥っている」と言えるだろう。
モナドは副作用の解決のためだけじゃないぞ 確かに、それがうまく解決されているとは言い難いが
>モナドは副作用の解決のためだけじゃないぞ
そんなことは分かっている。
もし「旧来の言語のおかしな事態を解決する為に(Haskellが)開発された」のだとしたら、
旧来の言語では自然に表現できた副作用を不自然な形式でしか表現できない
言語設計を決定した研究者達は、お馬鹿さんだらけだったのね、ということになる。
それは(本人は気付いていないけど)
>>847 のHaskellに対する無知と研究者達への侮辱であり、
だから
>>847 の詭弁に対して詭弁で混ぜ返した(反論した)わけ。分かるかな?
なるほどわからん。
value constructorや値コンストラクタって用語をたまに見るけど 仕様書にはないんだね real world haskellを見て混乱した
いや
>>847 が言ってることは正しいだろ
旧来の言語のおかしな事態を解決しようとしないなら、新しい言語を作る価値なんてない
IOについては、旧来の言語よりもHaskell方式の方が自然に扱えてると思うけどな
>>853 > 旧来の言語のおかしな事態を解決しようとしないなら、新しい言語を作る価値なんてない
これがくせ者で、「おかしい、扱いにくい、直感的じゃない」
と感じるかどうか、感じる度合いは人によって千差万別。
ある人がそういう目的で新言語を開発してコミュニティができてきても、
それに共感できない人たちも大勢いる。
855 :
853 :2010/09/20(月) 16:55:32
>>854 俺もそう思うが、何か変なこと言ってるか?
コードを提示した目的が分からん ↓ Haskell標準のリストは汎用性が低かったから別のを作ったって事だろ ↓ 汎用性を高める事(だけ)が目的だったのではないから、汎用性を批判するのは詭弁だ という流れですか 汎用性は、かなり微妙な高さだと俺は思います もし十分に高かったら、言語の取っつきにくさとか多少の犠牲を払っても使う価値があるのが明白だったわけですが、そこまで高くはない けど低いというわけでもない
>>856 コードを提示した目的が分からんと発言したのは私だが、
その後のレスとは全く繋がってないんじゃないかな。
私には
>>844 があのコードを提示した理由が本当に分からん。
どうですかと言うからには、本人にとっては前レスまでに提示された問題を
少しでも解決の方向へ導けると思ってコードを提示したのだろう。
しかし、前スレまでの何の問題に対する解なのか・・・
>>857 「本当に分からん」のに、なんで「全く繋がってない」って確信してるの?
自分に都合の良いことだけ信じてるの?
>>858 確信してたら理由を説明して断定してる
確信できないから「じゃないかな」と曖昧な表現にした
data Ni e = Infinity | Limit e data Nt = Succ | Pred data Nrs s e li = Li Nt s (Ni e) tolist (Li t s e) = case (t,e) of (Succ,Limit l) -> [s..l] (Succ,Infinity) -> [s..] (Pred,Limit l) -> [ s + (l - x) | x <- [s..l]] reverse_ (Li t s e) = case t of Succ -> Li Pred s e Pred -> Li Succ s e take_ n (Li t s e) = case (t,e) of (Succ,Limit l) -> Li t s (Limit (min (s + n - 1) l)) (Succ,Infinity) -> Li t s (Limit (s + n - 1)) (Pred,Limit l) -> Li t (max s (l - n + 1)) (Limit l) tolist (reverse_ (take_ 3 (reverse_ (reverse_ (Li Succ 123 Infinity))))) もういいよコードが読めないならわからなくていいよ。
>>859 そうですか
でも「全く」は断定的な表現ですよ
何の問題を解決したのか、一言添えていただけないでしょうか ちゃんと理解したいです
>>861 少ししか繋がっていないんじゃないかな(曖昧、緩い)
少ししか繋がっていない(断定)
全く繋がっていないんじゃないかな(曖昧、緩い)
全く繋がっていない(断定)
>>862 何の問題を解決したかと言われれば、
定数時間かつ定数空間でreverseできるような遅延リスト風データ構造の設計、じゃね
>>828 も同じ
>>864 そんなの何千人も同じこと考えてでたのが今の結論なんだからねぇ。
>>865 今の結論って何?
少なくとも標準ライブラリには入ってないよ
>>866 横だが
仕様と実装を分離して、実装のことは思考停止する、みたいな結論かもしれない。
効率とかは実装側の問題だから考えないと。
仕様と実装の話題は
Common LispとかSchemeとかECMAScriptとか色々あるみたいだね。
>>866 結論は今のリスト実装だよ。
いろんな構造を考えたけど速度やメモリ容量やいろんな要素を考慮して結局今の実装になった。
双方向リストじゃ無限リストを作れないだろ それに [0..100] みたいな書き方は言語のプリミティブじゃなくてシンタックスシュガーだ、 って認識しないと。
>>867 リストの実装は決まってる
>>868 それは今のリスト以外の構造を非難する理由にはならない
リストが万能じゃないからこそ、ArrayやData.Sequenceなんかが必要になる
reverseが高速にできることが必要なら、また別のデータ構造が要る
で、それを提示したのが
>>844 だろ
>>869 その点を誤解してる奴は多分いないから安心してくれ
>>870 lazyが万能じゃないからこそ、lazyをデフォにしたらダメだろ?
lazyがデフォの言語は、lazyが万能だと主張し続けないと生きのこれないんだよ
僕の胃の中もリバースされそうです
>>864 その提示された構造は [a .. b] あるいは [a ..] で表現できるリストに限定されていないか?
もしそうなら、遅延リスト風データ構造という名前はちょっと大げさな気がする。
リストがもつ能力の半分も表現されていないと思う。
単純な整数列に対して`take n (reverse [a..b])'を行うような限られた使い道しか
無いのなら意味ないよね。
これだけなら`take n [b,b-1..a]'とか`[b,b-1..b-n+1]'とでも書けば済む問題だし。
>>844 や
>>860 はこれ以外の用法を提示してほしいな。
それとも、これだけでも十分有用だということなのか。
はsけっl
もういいよコードが読めないならわからなくていいよ。
もういいよ論文しか書けないならわからなくていいよ。
下流プログラマは帰りたまえ
int 0x80ってなんすか?
コードレビューをやると、自分で書いたプログラムなのに自分の口では説明できない、 ってのは初級プログラマにありがちなんだよね きっと彼も(説明しないんじゃなくて)説明できないんだと思う
上流と下流を分離して、下流をこきつかう、みたいな
中流でいこう
別にtake n $ reverse [a..b]って書きたくて、でもエラー出るなら[b..a]に相当する関数を末尾再帰で書けばいいだけ。 全てにおいて完璧なデータ構造なんて無いんだから適切な構造をto/from用の関数と一緒に定義すればいいだけじゃないの? 話の肝を勘違いしてたらすみません。
haskell-modeを2.4から2.8にアップデートしたら :load "/home/my/hoge.hs" が動かず :load "c:/cygwin/home/my/hoge.hs" としなければいけなくなっていた件 emacs lispわからん
>>886 haskell-mode のせいか?
cygwin 上で普通にビルドした実行ファイルはファイル操作関連のことをしようとすると cygwin1.dll がパス変換する仕組があり、
あたかも cygwin ディレクトリがルートディレクトリに見えるようになっている。
:load を処理しているのは haskell 処理系の方のはずだから haskell-mode と直接の関係はなさそうに思うんだけど。
んー、そうなのかな。2.4に戻したら普通に動くよ setqで設定してるhaskell-program-name(ghcii.shを指定)とか add-hookのモードは全くさわって無くて loadのhaskell-site-file.elだけを2.4から2.8.0に差し替えただけなんだけども C-c C-l(inferior-haskell-load-file)でghciにパス名を渡す際の cygwinパス⇔windowsパスの変換をサボってるんだろうと思って 実装を眺めては見たけど elispはよくわからないので諦めて2.4に戻しちゃった そもそもが、インデントに不満があったから変えようと思ったんだけども タブを複数回押せばくるくる回るのがわかったので満足してしまった
最近emacs卒業してnotepad++使ってるよ。
それは卒業ではなくて退学ではないのか?
物は言いよう
いや、HaskellってCとは違ってひたすら打ち込むより考えながら打ち込む事が多いじゃん? だとしたらHaskellプログラミングに適したエディタはタイピング機能よりも リーディング機能のほうが重要だと思うんだ。
notepad++はhaskellのコードのアウトライン解析とか ライブラリのドキュメント参照機能とか充実してるの?
emacs:キーボードを打つので前かがみ → 腰が痛くなる notepad++:マウス操作メインで背もたれ → 腰が痛まない
実際のところ、アウトライン解析が必要なほど 長く込み入ったコードを書くことってまず無いのではないか? 字下げが強要されるという事も相まって、 適切な空白とコメントと型宣言があれば、 全体の見通しは解析が必要なほど悪くはならないと思う。
>>894 俺は逆だなぁ
マウス操作メインの時は前かがみになってキーボード操作メインの時は背もたれ
ちょっと質問しても良いでしょうか {-# LANGUAGE TypeSynonymInstances #-} class My a where t :: a -> String instance My String where t = id このコードはコンパイル出来るんですが、1行目を外すと通りません その状態で、instance宣言を instance My [Char] where t = id こう記述してもコンパイル出来ないんですが、 pragma無しだとどう記述すれば良いのですか?
自己解決。不可能なんですね。拡張ではこれで解決 {-# LANGUAGE FlexibleInstances #-}
>>897 まっすぐな机使ってる?
俺は真ん中が凹んでて左右が手前に伸びてる形の机を使ってる。
机の形の違いかな。
節子それ机ちゃう、便座や!
時代の先端を行く純粋関数型言語Haskellのスレで昭和のコントが見られるとは思わなかった
903 :
デフォルトの名無しさん :2010/09/24(金) 23:06:05
20年ぐらい前に生まれた言語じゃなかったっけ?
booooooooooooooo!!!!!!
仕様のバージョン1.0が1990年だから、ちょうど20年だね
モナドって90年代の関数型コミュニティのホットな話題だったらしい。
>>906 経済学といい世界から遅れるのが日本のデフォだよな
()笑
いやいやいまさらなモナド入門は日本に限らず世界中で量産されてる
>>908 で、日本のバブル崩壊を笑っていた欧米がどうなっているかというと....。
こいつらには学習能力がないのかって感じですねw
党のお偉方 「同志。あの資本主義を掲げる憎きアメリカの情勢を報告したまえ。」 部下 「はい、閣下!もはや崖っぷちに立っている状態であります!」 偉 「では、わがソビエト連邦の情勢はどうなっておるか?」 部 「はい!アメリカより常に一歩先んじております!」
いろいろとすごい歯がゆい思いをしてた人がいっぱいいたんだろうねー。 Googleに入れるような人がなんだかんだと最高なんだろうと思ってたけど、 全く別タイプのすごい業界がどっかにありそうな感じがする。
asw
マイクロソフトリサーチに入るような人の業界?
マイクロソフトリサーチといえば、 Parsec も wxHaskell もあそこで生まれたんだな 長くお世話になってたが、最近初めて知った あそこのサイトで Haskell をキーワードに検索をかけると、 いろいろ興味深い記事や論文が大量に出てくる
MSリサーチは、MSに研究内容をタッチできないような約束をさせてんだよね チューリング賞やらノーベル賞やら取ってる人が一杯いるしMSっぽくない
連邦がー
インデントとかミスを自動修正してくれる プラグインしらない? 文法にインデントの制約儲けるってアホだろ
あるインデントがあって、その意味論が正しいかミスかという判断は、 プログラマの意図を正確に推論できなければ実現不可能。 今のところ、そんな素晴らしい夢のようなプラグインは存在しないと思われ。 個人的には「インデントによる制約(いわゆるオフサイドルール)」は嫌いなんだよな。 プログラミングスタイルは自由でありたい。C言語風の中括弧 ('{' .. '}') でええやん。
>>918 ,919
オフサイドルール使わなくっても、{}を使って書けるよ。
オレはオフサイドルール使うほうが好きだけど。
haskell勉強中なのですが、文字列のリストを改行付で出力したくて こういうのを書いたけど、putStr ""のあたりがなんか汚い もっと良い書き方はありますか? strdump :: [String] -> IO () strdump = foldl (\a x -> a >> putStrLn x) (putStr "")
>>922 IO () 型で何もしないことを表すのなら return () を使う
strdump = foldl (¥a x -> a >> putStrLn x) (return ())
ただ、この場合なら mapM_ 使ったほうが楽
strdump = mapM_ putStrLn
>>922 動作確認してないけど
strdump = mapM_ putStrLn
でいけんじゃね?
925 :
924 :2010/09/27(月) 17:39:56
だからリロードしろとあれほど…orz
>>923-924 ありがとうございます。return ()は知らなかったです。
mapM_はmapに対するiterのような感じですね
先に改行付きの文字列にしてしまって、 それを出力する方法も。 strdump = putStr . unlines -- unlines [ "abc", "def" ] = "abc\ndef\n"
なんとなくだが
>>922 は foldl の初期値を
指定しないですむ方法が知りたいだけのような気がする
strdump = foldl1 (>>) . map putStrLn
ただ、これだと空リストを渡した時にエラーになってしまう
データが小さい間は>972がいいね。副作用の切り分けという点で。 mapM_ に最適化してくれたら最高だけど。
>>930 map show [1..1000000]
を/dev/nullに書き捨ててみたら
mapM_ putStrLn より putStr . unlines のほうが早かった。
mapM_ に最適化ってどういうことだ?
>>931 I/Oを1000k回実行するのとI/Oを1回実行するなら1回の方が早いに決まってる
あと、flushも忘れるなよ。 flushしなかったらI/Oが終了するまえにプログラムが終了するぞ。
書き出しはrunhaskellや実行ファイルからのリダイレクトで ( > /dev/null) 行ったからか、flushの有無は関係ないみたい。実行時間が変わらない。 haskell内部から書き出すときは注意したほうがいいんだろうな。 IOはまとめたほうが早い、でいいのか?場合による?
メモリいじいじよりIOのが遅いからね
putStr . unlines だと無限リストはダメなのかと思ったら、ちゃんと表示されるな。 てことは、ある程度の数の文字を評価した後、まとめてシステムコールを呼び出しているんだろうから、 どれくらいの文字をまとめれば効率が良いか考えて、最適化されているのではなかろうか。
>934 標準ライブラリの実装依存じゃない? ライブラリのIO関数がまとめている場合、プログラムでまとめるのは二度手間になるし。
>>937 つーか、入出力はフツウにバッファリング
されてるだけじゃないの?
939 :
デフォルトの名無しさん :2010/10/01(金) 08:12:25
Haskell のモナドはイテレータ 繰り返しとは限らないけどイテレータ ほとんどの言語が、独特の工夫を凝らしたイテレータをもっている
>>939 合ってると思う
Haskellの学習という観点だったら、モナドについて圏論的な理解を深めるよりも
プログラミング上のテクニックとしてモナド変換子の使い方でも学んだ方が良い
>>939 俺もこれ読んで少しモナドが理解できた。
Haskellのモナドって正確にはKleisliなんたらってやつなんでしょ?
ぐぐったら、プログラム・プロムナードの2006年3月号に書いてた Haskellのモナド⊂圏論のモナド、になるんだな 該当のPDF,teeの定義ではあってるのに 巻末のまとめのfmapの型が間違ってる気がする
>>941 なるほど。Haskellにおけるモナドの全体像が見えてきた気がする。
参考までにもう一つ聞きたいんだけど、圏論の道具がプログラミングに使えるっていうのは、
いちおう理論的な裏付けがあるんだよね? もし三行で説明できる内容なら教えて欲しい。
>>944 色々な概念の整合性が理論的に保証できる事が圏論を使うことの利点の一つ。
>>946 1行で要約すると: IOは置いてconcatMapの話を聞け
948 :
Perl忍者 ◆M5ZWRnXOj6 :2010/10/01(金) 22:00:04
まだ続いてますか きもいですね
やあ、久しぶり! 君も立派にきもいよ!
>>945-947 分かったような分からないような。。とりあえずそのエントリ読んでみます。
ごめん、これから出かけるから次スレ誰かお願い。
この勢いなら950で立てなくてもいいだろ
たまに突発的に活気付くから困る
954 :
Perl忍者 ◆M5ZWRnXOj6 :2010/10/05(火) 07:22:23
きも
あんきも、おいしいよね♪
アンキモ アンキモ アンキモ!
>>954 こう言って欲しいんだろ
「perlも関数型言語だからHaskellの仲間だね」
?
959 :
Perl忍者 ◆M5ZWRnXOj6 :2010/10/05(火) 19:14:55
haskellって名前じゃなかったらやってないくせによ どうせハッカーみたいな名前してるからやってんでしょ gnwとか意味わからない名前だったらやってないでしょ haskell=hacker みたいだからやってるだけのお前らはな やめたほうがいいと思うよ
960 :
Perl忍者 ◆M5ZWRnXOj6 :2010/10/05(火) 19:15:45
そういうやつらのキーボードって happy hackingとかそういうキーボードつかってんでしょ ハッキングとか名前ついてるから まじうざいんだよね
kinesis使ってる人もいるお
>960 だよなー、キーボードなんて1000円もしないのを使ってるよ
え、俺FPSで強くなるために買ったRealforce91つかってプログラミングしてるよ
俺はフリック入力してる
>>962 A の横が Contorl であるキーボードで 1000 円くらいのものがあるのなら教えてください。
親指シフト使ってる。自分以外に見たことないわ。
やっぱりHaskellはキーボードを選ぶということですか。
kinesisは親指ctlとかできる 果ては足shiftとか足enterとか...
キーボードのキー配置とか出力値とかマクロとか全て Haskell でプログラミングして キーボード内蔵のフラッシュメモリに書き込めたらいいのに
XMonadで妥協してください
>>971 驚いた、こんなのがあるのか
現物もさることながら、作り方も興味深い
フォーカス機能の実装に zipper データ構造をつかうとか、
ウィンドウマネージャの特性を QuickCheck で検査するとか、
なかなか勉強になる
ありがと
なにそのパイプオルガン
mini guru が中止にさえならなければなあ
ctrlは現状使ってるキーボードでマップ変えればええがな… Windowsはフリーソフトで出来ると思うし Linuxもほとんどの環境でできると思うし MacはApple標準キーボードがAの隣だからそのままでいいし、そうでなくてもOSX側に入れ替えあるし
976 :
Perl忍者 ◆M5ZWRnXOj6 :2010/10/08(金) 12:03:01
Haskellバカ君とFPS対戦したいんですがどうすればいいですか?教えてください やっぱりHaskellでHSAIMとかしちゃうんでしょうか?・・・ そこらへん気になります 具体的にいうとHaskellやってればFPS強くなりますか? Perler vs Haskell のFPSバトルしませんか?
>バカ 正しい
FPS - Faculty of Policy Studiesの略。 総合政策学部の意。
WASD大学ですね。わかります
980 :
Perl忍者 ◆M5ZWRnXOj6 :2010/10/09(土) 13:01:29
ここのスレのやつ頭が沸いてるしね 暴言をわざとうけねらいの方に狙うカス 死ねばいいよ
>>980 いきなり死ねって、どういう事ですか?
君には社会の常識がないのですか?
普通は、『あのう、すいませんけれども死んでくれませんか?』とか
『あなたには、死ぬという選択肢もありますよ』とか言うものですよ、
あなたみたいに最初から喧嘩腰だと、
言われた方は『じゃあ死んでみようかな』とかいう気持ちがなくなるものです。
まずは、親切丁寧に人に死んでと頼むべきだと思いますよ。
そこから、人の輪と協調が生まれ、『よーし死んでみるか』
という気持ちが生まれるわけです。
push型のFRPライブラリで、Grapefruit以外で良いのある?
FRP の push と pull って、何を以て分けるんだっけ?
定期的にサンプリングして内部状態を更新し続けるのがpull型 外部からイベントを受け取った時だけ内部状態を更新するのがpush型 だと理解してる
>>986 ありがと
ということは、Yampa は pull 型なのか。
普通は微少な差分時間を入力し続けないとまともに機能しない。
でも、微積する必要がなければ、
べつに正しい差分時間をしなくても良いんだよな。
それなら外部からイベントを受けたときだけ
内部状態を更新するようにすればいいから、
push 型としても使えるのか?
いまいち分からんな・・・
reavtive は論文読むと push 型と pull 型の
いいとこ取りみたいなことが書かれてるけど、それじゃダメ?
["a","b","c"]みたいなリストをa,b,cと出力したいんですが mapM_ (\x -> putStr x >> putStr ",") ["a","b","c"] これだと余分な,が一個つきます 最後1つの処理が余計で微妙なんですが こんな時どう書くのが簡単でしょうか
List.intersperse使って putStrLn $ concat $ intersperse "," ["a","b","c"]
書いてから自分で一個思いつきました let str = ["a","b","c"] in putStr (head str) >> mapM_ (\x -> putChar ',' >> putStr x) (tail str)
>>989 ありがとうございます。これは便利ですね。こっちのほうが効率も良さそうだし
intercalate x = concat . intersperse x という関数があるから、 putStrLn $ intercalate "," ["a", "b", "c"] でおk
Hoogle Sugeeeeeee!!!!!!と言わざるを得ない 次スレを作るなら是非テンプレに入れて欲しい てか次スレのことを忘れてた
今更かよって感じだな
建ててくる
建てれなかったので誰か頼みます
>>998 でこの体たらく。
もうすぐ埋まっちゃうじゃん。
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。