関数型プログラミング言語Haskell Part19
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2012/06/27(水) 10:21:10.18ttp://www.haskell.org/
日本語サイト
ttp://www.sampou.org/cgi-bin/haskell.cgi
ttp://www.shido.info/hs/
過去ログ
関数型プログラミング言語Haskell
Part1 ttp://pc.2ch.net/tech/kako/996/996131288.html
Part2 ttp://pc2.2ch.net/test/read.cgi/tech/1013846140/
Part3 ttp://pc8.2ch.net/test/read.cgi/tech/1076418993/
Part4 ttp://pc8.2ch.net/test/read.cgi/tech/1140717775/
Part5 ttp://pc8.2ch.net/test/read.cgi/tech/1149263630/
Part6 ttp://pc11.2ch.net/test/read.cgi/tech/1162902266/
Part7 ttp://pc11.2ch.net/test/read.cgi/tech/1174211797/
Part8 ttp://pc11.2ch.net/test/read.cgi/tech/1193743693/
Part9 ttp://pc11.2ch.net/test/read.cgi/tech/1211010089/
Part10 ttp://pc12.2ch.net/test/read.cgi/tech/1231861873/
Part11 ttp://pc12.2ch.net/test/read.cgi/tech/1252382593/
Part12 ttp://hibari.2ch.net/test/read.cgi/tech/1272536128/
Part13 ttp://hibari.2ch.net/test/read.cgi/tech/1286706874/
Part14 ttp://hibari.2ch.net/test/read.cgi/tech/1299385928/
Part15 ttp://hibari.2ch.net/test/read.cgi/tech/1310199414/
Part16 ttp://toro.2ch.net/test/read.cgi/tech/1317958045/
Part17 ttp://toro.2ch.net/test/read.cgi/tech/1325510368/
Part18 ttp://toro.2ch.net/test/read.cgi/tech/1331902463/
0322デフォルトの名無しさん
2012/07/24(火) 08:09:46.54fmap :: (Functor f) -> (a -> b) -> f a -> f b
だから、基本的にはfmapは引数を二つ取る関数
fmap (replicate 3) [1,2,3::Int]
なら、f=[], a=Int, b=[Int]だから返り値の型はf b=[[Int]]
fmap (*3) (+(100::Int))
だと、f=(->)Int, a=Int, b=Intだから返り値の型はf b=Int->Int
ここからIntを得るにはもう一つ引数を与える必要がある
0323322
2012/07/24(火) 08:10:41.80これは
fmap :: (Functor f) => (a -> b) -> f a -> f b
の間違い
0324デフォルトの名無しさん
2012/07/24(火) 20:14:32.46Readerモナドが欲しい時はnewtype R a b = R (a -> b)のようにコンストラクタを明記した形でだけ使わせるべき
0325デフォルトの名無しさん
2012/07/24(火) 21:19:11.76(r ->) がインスタンスになってたって困ることないだろう。
気にいらないなら明示的に Reader, runReader 使えばいいじゃん。
0326デフォルトの名無しさん
2012/07/24(火) 21:38:02.81> join (+) === (2*) みたいなことができて便利。
すげー。
0327デフォルトの名無しさん
2012/07/24(火) 22:27:52.060328デフォルトの名無しさん
2012/07/24(火) 23:05:03.730329デフォルトの名無しさん
2012/07/25(水) 00:32:26.57よくわからない。何がすごいの?
0330デフォルトの名無しさん
2012/07/25(水) 01:02:38.56例えられれば例えられる程分からん。
0331デフォルトの名無しさん
2012/07/25(水) 01:05:26.320332デフォルトの名無しさん
2012/07/25(水) 01:08:47.29定数の2を使わずに済む
圧倒的難読化効率
わざわざMonad ((->) a)のインスタンスをインポートしなければならない
ぐらいしか思いつかない
0333デフォルトの名無しさん
2012/07/25(水) 04:23:23.00この例だけがすごいわけじゃなくて、
f x x みたいに同じ引数を二回使うとき、
join f x と書けるということ。
ようは runReader なしで使える Reader モナドなので、
共通の引数を使い回せる。
0334デフォルトの名無しさん
2012/07/25(水) 06:46:55.56を、ポイントフリーで
join (***) f
と書くのはたまに見る。俺は使わないけど
0335デフォルトの名無しさん
2012/07/25(水) 07:30:14.88H本に載ってないような?
0336デフォルトの名無しさん
2012/07/25(水) 07:38:38.47H本にも載ってるはず…
0337デフォルトの名無しさん
2012/07/25(水) 14:03:27.240338319
2012/07/25(水) 19:26:48.34こうしたらエラーが出た。
data A a b = A a b
type B b a = A a b
instance Functor (B b) where
f `fmap` (A a b) = A (f a) b
エラーメッセージ
Type synonym `B' should have 2 arguments, but has been given 1
In the instance declaration for `Functor (B b)'
こっちは GHC 7.4.1 使ってる。
0339デフォルトの名無しさん
2012/07/26(木) 12:12:16.640340319
2012/07/26(木) 12:38:04.82いや、俺もそう思うんだが、>>320 がこれでできるんちゃうかと・・・
結局、>>319 の事はできるのかできないのか、どうなんだろ?
0341デフォルトの名無しさん
2012/07/26(木) 15:05:07.43@PostgreSQLをインストールした場所のbinへパスを通します
これはSetupがpg_config.exeを実行できるようにする為でございます
Acabalファイルのextra-libraries: 欄で、pq → libpq とします
BHaskellをインストールした場所のmingw\lib にliblibpq.aを用意しておきます
これにはPostgreSQLをインストールした場所のlibからlibpq.dllをコピーして
上記へリネームします
インストール後は消して良いです
CPostgreSQLをインストールした場所のlibへパスを通します
因みにlibにはlibpq.dllが、(@で通した)binにはlibpq.dllがさらに参照する2つの.dllがあります
以上で後は普通にセットアップして動く筈でございます
因みに私個人の環境は
Windows2000 SP4、Haskell Platform2011.4.0.0、HDBC-postgresql-2.3.2.1、PostgreSQL9.0.3でございます
0342デフォルトの名無しさん
2012/07/26(木) 21:06:22.62何故Just 3は、Just 3なの?
0343デフォルトの名無しさん
2012/07/26(木) 21:15:08.580344デフォルトの名無しさん
2012/07/26(木) 21:16:17.080345デフォルトの名無しさん
2012/07/26(木) 21:42:08.680346デフォルトの名無しさん
2012/07/26(木) 22:46:14.73そうすると関数になるから色々な関数の引数に利用できるのかな?
0347デフォルトの名無しさん
2012/07/26(木) 22:49:06.000348デフォルトの名無しさん
2012/07/26(木) 22:53:10.850349デフォルトの名無しさん
2012/07/26(木) 22:54:55.34すると3になるんだよ。すごいね
0350デフォルトの名無しさん
2012/07/26(木) 22:59:40.020351デフォルトの名無しさん
2012/07/26(木) 23:53:20.390352デフォルトの名無しさん
2012/07/26(木) 23:55:31.660353デフォルトの名無しさん
2012/07/27(金) 00:14:48.20じゃあHaskellの型って群なの?
0354デフォルトの名無しさん
2012/07/27(金) 01:09:05.200355デフォルトの名無しさん
2012/07/27(金) 01:19:40.57でしょうか?
0356デフォルトの名無しさん
2012/07/27(金) 01:26:37.080357デフォルトの名無しさん
2012/07/27(金) 01:28:03.190358デフォルトの名無しさん
2012/07/27(金) 01:30:49.100359デフォルトの名無しさん
2012/07/27(金) 01:36:06.29ttp://www.amazon.co.jp/dp/4274068854
この本買ってきて頭から読むと良いよ、Maybeまでなら土日使えば辿りつけるはず
ここで散発的な質問するより絶対そっちの方が早いから
0360デフォルトの名無しさん
2012/07/27(金) 08:08:49.030361デフォルトの名無しさん
2012/07/27(金) 09:05:16.02ハアハア
0362デフォルトの名無しさん
2012/07/27(金) 12:07:44.570363デフォルトの名無しさん
2012/07/27(金) 12:44:49.63Haskell とはどうやってつき合ってる?
Windows 用 GHC のアルファ バージョン(64bit の実験もされてる)を使ってる?
GHC は 7.6 になるまで待って、今は Linux とデュアルブートしたり、
VMware 仮想環境上の Linux で GHC 64 bit版を使ってる?
思い切ってメモリ8GB、Windows7 64bit版を乗せたノーパソ買ったんだけど、
Windows 用 GHC の 64bit版がまだ正式には無い事に今さら気づいた (´・ω・`)
0364デフォルトの名無しさん
2012/07/27(金) 13:06:14.88VMでもαでも本気で突き合いたいならどこでもできる
0365デフォルトの名無しさん
2012/07/27(金) 13:25:16.310366デフォルトの名無しさん
2012/07/27(金) 16:18:20.48伸びるとか、本気などのメンタル的な話ではなく、
実際に具体的にどの様に対応しているのかという話です。
併せて、32bit版にはない64bit版での運用上の問題点があれば、
それも聞いてみたいです。
>>364 はアルファ版も使ってみたのですよね。
例えば、大量のメモリを使ったりしたとき、
実用上問題にぶつかったとかあるでしょうか。
0367364
2012/07/27(金) 16:46:39.180368デフォルトの名無しさん
2012/07/27(金) 16:56:42.240369デフォルトの名無しさん
2012/07/27(金) 17:26:33.50リバプール
デボンシャー
ウェールズ
仲間はずれはどれでしょう?
0370デフォルトの名無しさん
2012/07/27(金) 17:29:18.190371デフォルトの名無しさん
2012/07/27(金) 18:39:53.8832bit版GHCじゃ困る理由があるの?
0372デフォルトの名無しさん
2012/07/27(金) 18:51:50.90どうして知らないのでしょうか。
>>363 で、Windows の 64bit 版をメイン使ってる人に
Haskell とはどうやってつき合ってるのかを聞いて、
>>364 でそれに応じているので、当然使ってると思ったのですが。
しかも、VMでもαでも本気で突き合いたいならどこでもできる事を知っている。
自分で体験されたから知っているのではないのですか。
ひとの受け売り、また聞き、何となく脳内妄想、といった類なのでしょうか。
でしたら残念です。
0373デフォルトの名無しさん
2012/07/27(金) 20:07:21.510374デフォルトの名無しさん
2012/07/27(金) 20:23:08.45すまんすまん
>>364 の的外れな返答についカッとなってしまった。
質問をちょっと変えて、的を絞るわ。
Windows7 64bit 版で GHC 64ビット版を使う方法はいくつかありそうですが、
処理速度をできるだけ落とさないように、という主眼だと、
どの方法がベターでしょうか?
0375デフォルトの名無しさん
2012/07/27(金) 20:30:51.3132bit版のGHCだと、メモリを大量に使えなかったりしません?
ちょっと大きめサイズで移流拡散現象をシミュレートしたくて、
Windows7の32版でやったら使えるメモリが足りず、
満足いくシミュレーションができなかったんです。
64bit版のWindows + 32bit版GHC で8GBメモリとか使えるのなら、
それで問題ないのですけど。
今はマシンが手許になくて試すことができない状態です。
0376デフォルトの名無しさん
2012/07/27(金) 21:08:25.310377デフォルトの名無しさん
2012/07/27(金) 21:10:01.43メモリ8G使いたいなら確かに64bit版をなんとかして使うしかないな、納得
0378デフォルトの名無しさん
2012/07/27(金) 21:25:51.33俺以外にも移流拡散解析をHaskellでやろうとか思う奴がいるとは、、、
0379デフォルトの名無しさん
2012/07/27(金) 22:34:10.850380デフォルトの名無しさん
2012/07/27(金) 23:32:50.02こ難しいインテリで付き合いにくいで
何とか理解する方法ないでしょうか?
0381デフォルトの名無しさん
2012/07/27(金) 23:35:32.40無理矢理ヤれば、そのうちアプリカティブちゃんのほうから腰振ってくるよ
まずはヤってみろ
0382デフォルトの名無しさん
2012/07/28(土) 00:24:39.830383デフォルトの名無しさん
2012/07/28(土) 00:31:59.82do記法の<-を普通の変数束縛のlet構文だと思ってみると
do { f <- mf ; x <- mx ; return f x }
これが
let f = mf in let x = mx in f x
こうなる。実際Identityモナドのdo記法とlet式は意味的には同等。
しかし変数束縛を使わずにこう書きたいこともある。
mf mx
これに相当するものがApplicativeを使うとこう書ける。
mf <$> mx
つまりApplicativeを使えば変数束縛が減らせゴルフコードが書きやすくなるということ。
0384383
2012/07/28(土) 00:34:50.860385訂正
2012/07/28(土) 00:56:52.15do記法の<-を普通の変数束縛のlet構文だと思ってみると
do { x1 <- mx1 ; x2 <- mx2 ; return f x1 x2 }
これが
let x1 = mx1 in let x2 = mx2 in f x1 x2
こうなる。実際Identityモナドのdo記法とlet式は意味的には同等。
しかし変数束縛を使わずにこう書きたいこともある。
f mx1 mx2
これに相当するものがApplicativeを使うとこう書ける。
f <$> mx1 <*> mx2
つまりApplicativeを使えば変数束縛が減らせゴルフコードが書きやすくなるということ。
0386デフォルトの名無しさん
2012/07/28(土) 02:01:13.63Prelude Control.Applicative> let add = (+)
Prelude Control.Applicative> add 3 4
7
Maybe上の足し算ができちゃう><
Prelude Control.Applicative> add <$> Just 3 <*> Just 4
Just 7
リストモナド上で多値の足し算もできちゃう><
Prelude Control.Applicative> add <$> [1,2,3] <*> [10,20,30]
[11,21,31,12,22,32,13,23,33]
まあ読み書きやすくした部分がapplicativeだけどさ
0387デフォルトの名無しさん
2012/07/28(土) 08:47:57.970388デフォルトの名無しさん
2012/07/28(土) 09:15:47.980389デフォルトの名無しさん
2012/07/28(土) 09:22:51.230390デフォルトの名無しさん
2012/07/28(土) 16:11:08.070391デフォルトの名無しさん
2012/07/28(土) 17:20:35.960392デフォルトの名無しさん
2012/07/28(土) 18:40:30.260393デフォルトの名無しさん
2012/07/28(土) 21:02:13.680394デフォルトの名無しさん
2012/07/28(土) 21:58:11.97http://themonadreader.files.wordpress.com/2010/01/issue15.pdf
free monad:
http://www.haskellforall.com/2012/06/you-could-have-invented-free-monads.html
http://www.iai.uni-bonn.de/~jv/mpc08.pdf
0395デフォルトの名無しさん
2012/07/28(土) 22:14:58.18ありがとう。
0396デフォルトの名無しさん
2012/07/29(日) 13:51:01.380397デフォルトの名無しさん
2012/07/29(日) 13:52:53.800398デフォルトの名無しさん
2012/07/29(日) 17:51:00.77「 と」とか「 くさ」とか。
0399デフォルトの名無しさん
2012/07/29(日) 19:26:20.440400デフォルトの名無しさん
2012/07/29(日) 19:59:37.88型が文脈持つってなんなの?
0401デフォルトの名無しさん
2012/07/29(日) 21:03:27.45変数への破壊的代入を行えるインタプリタも行えないインタプリタもあるように、
変数への破壊的代入を行える文脈も行えない文脈もある。
例えばIOモナドを使うとIOの順序がsequentialになるが、
これはIOモナドがstrictな言語のインタプリタだからだと解釈できる。
(ただしhttp://www.haskell.org/haskellwiki/What_a_Monad_is_notの
Monads are not about strictnessにあるように、non-strictな言語のインタプリタだって作れる)
0402デフォルトの名無しさん
2012/07/29(日) 21:22:56.500403デフォルトの名無しさん
2012/07/29(日) 21:36:40.770404デフォルトの名無しさん
2012/07/29(日) 21:54:06.03これが「成否」のコンテキストなんだけど。
「成否」というコンテキストの中での値が、「否」なら値なし、「成」ならa型の値。
これは抽象データ「型」でしょ?
この抽象データ型は、a型の値に「成否」コンテキストを付与してる。
別に難しいことじゃないよね。
0405デフォルトの名無しさん
2012/07/29(日) 22:21:47.700406404
2012/07/29(日) 22:37:14.660407デフォルトの名無しさん
2012/07/29(日) 22:39:27.960408デフォルトの名無しさん
2012/07/30(月) 01:34:58.730409デフォルトの名無しさん
2012/07/30(月) 02:38:13.45実は『日本語としての』文脈の意味がわかんねって言いたいんじゃね 。>>405とか見る限り
辞書引いてください
0410デフォルトの名無しさん
2012/07/30(月) 05:36:18.380411デフォルトの名無しさん
2012/07/30(月) 12:41:29.26型が文脈そのもの。持つのではない。
ラップされることで文脈を持つのは値の方。
0412デフォルトの名無しさん
2012/07/30(月) 14:29:08.97文脈を持った型というよりも文脈を持った値として考えるべきじゃね。
そこでいう型は別に大事じゃない。関数適用したら別の方に簡単に変わるし。
大事なのはあくまでも文脈。
文脈を持った値というのは文脈を持つコンテナに包まれてる値としてもいいかも。
その文脈についての実装をbindとかで実装することでその文脈として適した振る舞いをすることができる。
0413デフォルトの名無しさん
2012/07/30(月) 17:51:46.46代数データ型で文脈を定義しているので。
それから>>404のMaybeは、定義の形を見れば明らかだが、
要素が一つしかないコンテナとみなせる。
つまりコンテナ型は文脈でもある。
だからリストモナドというものがある。
> 文脈を持った値というのは文脈を持つコンテナに包まれてる値としてもいいかも。
というのは相当おかしい。
0414デフォルトの名無しさん
2012/07/31(火) 00:38:45.92うーんよくわからけど、Maximaの事実と文脈みたいなものなのかな?
ある値や関数にMaybeという事実を適用した結果は、失敗するかも
しれないという事実の集合である文脈を返すことができるってことなのかな?難しい
0415デフォルトの名無しさん
2012/07/31(火) 00:55:53.18なぜ不正確な話をしている412にレスしているのかわからんし、
> ある値や関数にMaybeという事実を適用した結果は、失敗するかも
もうちょっと落ち着いて、解説ドキュメントを正確に理解するようにしたら?
0416デフォルトの名無しさん
2012/07/31(火) 10:02:54.99コンテキスト付きの値というよりcomputationという表現を使ってるな
m aだとaという型の値を主軸にした何らかの計算(実際にaを通常の値として取り出せるとは限らない)というイメージか
コンテキストと聞くとどちらかというとcomonadをイメージしてしまうね
コモナドの場合はw aという値からaは「必ず」取り出せる
0417デフォルトの名無しさん
2012/07/31(火) 13:32:22.97別にリストモナドとかも
> 文脈を持った値というのは文脈を持つコンテナに包まれてる値としてもいいかも。
で、おかしくなくない?
0418デフォルトの名無しさん
2012/07/31(火) 17:18:32.38コンテナが文脈そのもので、
コンテナが文脈を持つのではない。
0419デフォルトの名無しさん
2012/07/31(火) 19:35:51.55リストもなどでも、結果を順列として出すのか組み合わせとして出すのかなど文脈を変えることはできるけど?
0420デフォルトの名無しさん
2012/07/31(火) 20:01:58.390421デフォルトの名無しさん
2012/07/31(火) 20:29:53.64その例だとリスト自体が文脈を表現してるじゃないですか。
■ このスレッドは過去ログ倉庫に格納されています