トップページtech
1001コメント306KB

関数型プログラミング言語Haskell Part19

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2012/06/27(水) 10:21:10.18
haskell.org
ttp://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.54
>>321
fmap :: (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を得るにはもう一つ引数を与える必要がある
03233222012/07/24(火) 08:10:41.80
>fmap :: (Functor f) -> (a -> b) -> f a -> f b
これは
fmap :: (Functor f) => (a -> b) -> f a -> f b
の間違い
0324デフォルトの名無しさん2012/07/24(火) 20:14:32.46
(->)aがMonadのInstanceになってるのはクソ仕様。ゴルフしか用途無い
Readerモナドが欲しい時はnewtype R a b = R (a -> b)のようにコンストラクタを明記した形でだけ使わせるべき
0325デフォルトの名無しさん2012/07/24(火) 21:19:11.76
個人的には join (+) === (2*) みたいなことができて便利。
(r ->) がインスタンスになってたって困ることないだろう。
気にいらないなら明示的に Reader, runReader 使えばいいじゃん。
0326デフォルトの名無しさん2012/07/24(火) 21:38:02.81
>>325
> join (+) === (2*) みたいなことができて便利。

すげー。
0327デフォルトの名無しさん2012/07/24(火) 22:27:52.06
そんなコードを読まされる人のことも考えてあげてください
0328デフォルトの名無しさん2012/07/24(火) 23:05:03.73
そこまで難しくもないだろ
0329デフォルトの名無しさん2012/07/25(水) 00:32:26.57
join (+) === (2*)
よくわからない。何がすごいの?
0330デフォルトの名無しさん2012/07/25(水) 01:02:38.56
Haskellの難しさが何かに似てると思ったら、OOPの猫クラス犬クラスだ。
例えられれば例えられる程分からん。
0331デフォルトの名無しさん2012/07/25(水) 01:05:26.32
形式言語の理解に例えを頼るなよw
0332デフォルトの名無しさん2012/07/25(水) 01:08:47.29
頭の悪い俺には
定数の2を使わずに済む
圧倒的難読化効率
わざわざMonad ((->) a)のインスタンスをインポートしなければならない
ぐらいしか思いつかない
0333デフォルトの名無しさん2012/07/25(水) 04:23:23.00
join (+) === (2*)
この例だけがすごいわけじゃなくて、
f x x みたいに同じ引数を二回使うとき、
join f x と書けるということ。
ようは runReader なしで使える Reader モナドなので、
共通の引数を使い回せる。
0334デフォルトの名無しさん2012/07/25(水) 06:46:55.56
(\(a, b) -> (f a, f b))
を、ポイントフリーで
join (***) f
と書くのはたまに見る。俺は使わないけど
0335デフォルトの名無しさん2012/07/25(水) 07:30:14.88
runReaderとReaderモナドがなにかわからない。
H本に載ってないような?
0336デフォルトの名無しさん2012/07/25(水) 07:38:38.47
Readerモナド = 関数モナド
H本にも載ってるはず…
0337デフォルトの名無しさん2012/07/25(水) 14:03:27.24
モナxモナ
03383192012/07/25(水) 19:26:48.34
>>320
こうしたらエラーが出た。

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.64
2引数が必要やのに1個しかないやんけ!といってるだけやん
03403192012/07/26(木) 12:38:04.82
>>339
いや、俺もそう思うんだが、>>320 がこれでできるんちゃうかと・・・

結局、>>319 の事はできるのかできないのか、どうなんだろ?
0341デフォルトの名無しさん2012/07/26(木) 15:05:07.43
さて本日はWindows環境でHDBC-postgresqlをインストールする手順をご説明致します
@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っていうのがよくわからん。
何故Just 3は、Just 3なの?
0343デフォルトの名無しさん2012/07/26(木) 21:15:08.58
哲学的すぎる…
0344デフォルトの名無しさん2012/07/26(木) 21:16:17.08
That which we call Just 3 by any other name would smell as sweet.
0345デフォルトの名無しさん2012/07/26(木) 21:42:08.68
シェークスピアみたい
0346デフォルトの名無しさん2012/07/26(木) 22:46:14.73
もしかしてJust 3にすると型になるの?
そうすると関数になるから色々な関数の引数に利用できるのかな?
0347デフォルトの名無しさん2012/07/26(木) 22:49:06.00
どこから突っ込めばいいやら
0348デフォルトの名無しさん2012/07/26(木) 22:53:10.85
すべてが型になる
0349デフォルトの名無しさん2012/07/26(木) 22:54:55.34
fromJust(Just 3)
すると3になるんだよ。すごいね
0350デフォルトの名無しさん2012/07/26(木) 22:59:40.02
そもそも型とは何かということをですね…
0351デフォルトの名無しさん2012/07/26(木) 23:53:20.39
型って何なの?
0352デフォルトの名無しさん2012/07/26(木) 23:55:31.66
類別、かな。
0353デフォルトの名無しさん2012/07/27(金) 00:14:48.20
>>352
じゃあHaskellの型って群なの?
0354デフォルトの名無しさん2012/07/27(金) 01:09:05.20
Just 3 すると、Maybe 型の値になるんだよ。Just の型を考えてみて。
0355デフォルトの名無しさん2012/07/27(金) 01:19:40.57
Just :: {3} -> Maybe
でしょうか?
0356デフォルトの名無しさん2012/07/27(金) 01:26:37.08
どこから突っ込めばいいやら
0357デフォルトの名無しさん2012/07/27(金) 01:28:03.19
そもそもhaskellがインストールされていないんだろう
0358デフォルトの名無しさん2012/07/27(金) 01:30:49.10
見放すべきか、教えてあげるべきか・・・
0359デフォルトの名無しさん2012/07/27(金) 01:36:06.29
>>355
ttp://www.amazon.co.jp/dp/4274068854
この本買ってきて頭から読むと良いよ、Maybeまでなら土日使えば辿りつけるはず
ここで散発的な質問するより絶対そっちの方が早いから
0360デフォルトの名無しさん2012/07/27(金) 08:08:49.03
すごいHのFunctorからモナドまでの説明はとても良いよね(´・ω・`)
0361デフォルトの名無しさん2012/07/27(金) 09:05:16.02
Hなモナ
ハアハア
0362デフォルトの名無しさん2012/07/27(金) 12:07:44.57
2012のffi何処行ってしもたん・・・
0363デフォルトの名無しさん2012/07/27(金) 12:44:49.63
Windows の 64bit 版をメイン使ってる人に質問
Haskell とはどうやってつき合ってる?

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.88
ドアを叩く手前で悩んでいる人は結局それ以上伸びない
VMでもαでも本気で突き合いたいならどこでもできる
0365デフォルトの名無しさん2012/07/27(金) 13:25:16.31
ノーパソ喫茶
0366デフォルトの名無しさん2012/07/27(金) 16:18:20.48
>>364
伸びるとか、本気などのメンタル的な話ではなく、
実際に具体的にどの様に対応しているのかという話です。
併せて、32bit版にはない64bit版での運用上の問題点があれば、
それも聞いてみたいです。

>>364 はアルファ版も使ってみたのですよね。

例えば、大量のメモリを使ったりしたとき、
実用上問題にぶつかったとかあるでしょうか。
03673642012/07/27(金) 16:46:39.18
知りません
0368デフォルトの名無しさん2012/07/27(金) 16:56:42.24
グラスゴーってイギリスだったんだな。サカーで始めて知った。
0369デフォルトの名無しさん2012/07/27(金) 17:26:33.50
マンチェスター
リバプール
デボンシャー
ウェールズ

仲間はずれはどれでしょう?
0370デフォルトの名無しさん2012/07/27(金) 17:29:18.19
そんなことよりケントはどうした、ケントは。
0371デフォルトの名無しさん2012/07/27(金) 18:39:53.88
>>363
32bit版GHCじゃ困る理由があるの?
0372デフォルトの名無しさん2012/07/27(金) 18:51:50.90
>>367
どうして知らないのでしょうか。

>>363 で、Windows の 64bit 版をメイン使ってる人に
Haskell とはどうやってつき合ってるのかを聞いて、
>>364 でそれに応じているので、当然使ってると思ったのですが。

しかも、VMでもαでも本気で突き合いたいならどこでもできる事を知っている。
自分で体験されたから知っているのではないのですか。

ひとの受け売り、また聞き、何となく脳内妄想、といった類なのでしょうか。
でしたら残念です。
0373デフォルトの名無しさん2012/07/27(金) 20:07:21.51
なにこのくだらないやり取りw…
0374デフォルトの名無しさん2012/07/27(金) 20:23:08.45
>>373
すまんすまん
>>364 の的外れな返答についカッとなってしまった。

質問をちょっと変えて、的を絞るわ。

Windows7 64bit 版で GHC 64ビット版を使う方法はいくつかありそうですが、
処理速度をできるだけ落とさないように、という主眼だと、
どの方法がベターでしょうか?
0375デフォルトの名無しさん2012/07/27(金) 20:30:51.31
>>371
32bit版のGHCだと、メモリを大量に使えなかったりしません?

ちょっと大きめサイズで移流拡散現象をシミュレートしたくて、
Windows7の32版でやったら使えるメモリが足りず、
満足いくシミュレーションができなかったんです。

64bit版のWindows + 32bit版GHC で8GBメモリとか使えるのなら、
それで問題ないのですけど。

今はマシンが手許になくて試すことができない状態です。
0376デフォルトの名無しさん2012/07/27(金) 21:08:25.31
ドアを叩く手前で悩んでいる人は結局それ以上伸びない
0377デフォルトの名無しさん2012/07/27(金) 21:10:01.43
>>375
メモリ8G使いたいなら確かに64bit版をなんとかして使うしかないな、納得
0378デフォルトの名無しさん2012/07/27(金) 21:25:51.33
>>375
俺以外にも移流拡散解析をHaskellでやろうとか思う奴がいるとは、、、
0379デフォルトの名無しさん2012/07/27(金) 22:34:10.85
シミュレーションでメモリが云々でノーパソ。。。
0380デフォルトの名無しさん2012/07/27(金) 23:32:50.02
アプリカティブちゃんと仲良くできません。
こ難しいインテリで付き合いにくいで
何とか理解する方法ないでしょうか?
0381デフォルトの名無しさん2012/07/27(金) 23:35:32.40
>>380
無理矢理ヤれば、そのうちアプリカティブちゃんのほうから腰振ってくるよ
まずはヤってみろ
0382デフォルトの名無しさん2012/07/28(土) 00:24:39.83
vm player にubuntu 64bit入れて、その上のHaskell弄るとか。
0383デフォルトの名無しさん2012/07/28(土) 00:31:59.82
>>380
do記法の<-を普通の変数束縛の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を使えば変数束縛が減らせゴルフコードが書きやすくなるということ。
03843832012/07/28(土) 00:34:50.86
スマン型がちょっと違うわ。。。誰か訂正頼む。。
0385訂正2012/07/28(土) 00:56:52.15
>>380
do記法の<-を普通の変数束縛の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.63
足し算を定義すると
Prelude 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.97
モナド分かってる前提で説明していいんだろうか
0388デフォルトの名無しさん2012/07/28(土) 09:15:47.98
モナドとモノイドは何が違うの?
0389デフォルトの名無しさん2012/07/28(土) 09:22:51.23
モノイドは項。モナドは文脈を持った値に対する関数適用。
0390デフォルトの名無しさん2012/07/28(土) 16:11:08.07
haddockってもしかしてpaddock捩ってんの?
0391デフォルトの名無しさん2012/07/28(土) 17:20:35.96
haddockは鱈
0392デフォルトの名無しさん2012/07/28(土) 18:40:30.26
haddock haddock してんじゃねーよ!
0393デフォルトの名無しさん2012/07/28(土) 21:02:13.68
operationalモナドとかfreeモナドの話はどこで読めますか?
0394デフォルトの名無しさん2012/07/28(土) 21:58:11.97
operational monad:
http://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
>>394
ありがとう。
0396デフォルトの名無しさん2012/07/29(日) 13:51:01.38
このすれ来て大分モナドわかってきた
0397デフォルトの名無しさん2012/07/29(日) 13:52:53.80
次は福岡モナドだな
0398デフォルトの名無しさん2012/07/29(日) 17:51:00.77
存在し無い概念の翻訳が難しい。
「 と」とか「 くさ」とか。
0399デフォルトの名無しさん2012/07/29(日) 19:26:20.44
javascriptでモナってみる
0400デフォルトの名無しさん2012/07/29(日) 19:59:37.88
文脈ってなんなのかよくわからない。
型が文脈持つってなんなの?
0401デフォルトの名無しさん2012/07/29(日) 21:03:27.45
monadとはインタプリタを作る方法で、文脈というのはインタプリタの能力だと思えば良い。
変数への破壊的代入を行えるインタプリタも行えないインタプリタもあるように、
変数への破壊的代入を行える文脈も行えない文脈もある。
例えば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.50
「破壊的かもしれない文脈」を略して「文脈」というのか
0403デフォルトの名無しさん2012/07/29(日) 21:36:40.77
いや、いわない
0404デフォルトの名無しさん2012/07/29(日) 21:54:06.03
data Maybe a = Just a | Nothing
これが「成否」のコンテキストなんだけど。

「成否」というコンテキストの中での値が、「否」なら値なし、「成」ならa型の値。
これは抽象データ「型」でしょ?
この抽象データ型は、a型の値に「成否」コンテキストを付与してる。
別に難しいことじゃないよね。
0405デフォルトの名無しさん2012/07/29(日) 22:21:47.70
コンテクストをコンテクストという用語を用いずに説明求む
04064042012/07/29(日) 22:37:14.66
コンテキストで説明したけど?
0407デフォルトの名無しさん2012/07/29(日) 22:39:27.96
ワロスwwww
0408デフォルトの名無しさん2012/07/30(月) 01:34:58.73
バカ晒し上げ
0409デフォルトの名無しさん2012/07/30(月) 02:38:13.45
文脈の意味がわかんねって言ってる奴は、
実は『日本語としての』文脈の意味がわかんねって言いたいんじゃね 。>>405とか見る限り
辞書引いてください
0410デフォルトの名無しさん2012/07/30(月) 05:36:18.38
何言ってるのかわからないw
0411デフォルトの名無しさん2012/07/30(月) 12:41:29.26
>>400
型が文脈そのもの。持つのではない。
ラップされることで文脈を持つのは値の方。
0412デフォルトの名無しさん2012/07/30(月) 14:29:08.97
>>400
文脈を持った型というよりも文脈を持った値として考えるべきじゃね。
そこでいう型は別に大事じゃない。関数適用したら別の方に簡単に変わるし。
大事なのはあくまでも文脈。
文脈を持った値というのは文脈を持つコンテナに包まれてる値としてもいいかも。
その文脈についての実装をbindとかで実装することでその文脈として適した振る舞いをすることができる。
0413デフォルトの名無しさん2012/07/30(月) 17:51:46.46
型は型で重要なんだけど。
代数データ型で文脈を定義しているので。

それから>>404のMaybeは、定義の形を見れば明らかだが、
要素が一つしかないコンテナとみなせる。
つまりコンテナ型は文脈でもある。
だからリストモナドというものがある。
> 文脈を持った値というのは文脈を持つコンテナに包まれてる値としてもいいかも。
というのは相当おかしい。
0414デフォルトの名無しさん2012/07/31(火) 00:38:45.92
>>412
うーんよくわからけど、Maximaの事実と文脈みたいなものなのかな?
ある値や関数にMaybeという事実を適用した結果は、失敗するかも
しれないという事実の集合である文脈を返すことができるってことなのかな?難しい
0415デフォルトの名無しさん2012/07/31(火) 00:55:53.18
>>414
なぜ不正確な話をしている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
>>413
別にリストモナドとかも
> 文脈を持った値というのは文脈を持つコンテナに包まれてる値としてもいいかも。
で、おかしくなくない?
0418デフォルトの名無しさん2012/07/31(火) 17:18:32.38
コンテナの場合、
コンテナが文脈そのもので、
コンテナが文脈を持つのではない。
0419デフォルトの名無しさん2012/07/31(火) 19:35:51.55
>>418
リストもなどでも、結果を順列として出すのか組み合わせとして出すのかなど文脈を変えることはできるけど?
0420デフォルトの名無しさん2012/07/31(火) 20:01:58.39
文脈の定義が曖昧だから水掛け論にしかならない印象
0421デフォルトの名無しさん2012/07/31(火) 20:29:53.64
>>419
その例だとリスト自体が文脈を表現してるじゃないですか。
■ このスレッドは過去ログ倉庫に格納されています