トップページtech
981コメント300KB

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

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2008/05/17(土) 16:41:29
haskell.org
http://www.haskell.org/

日本語サイト
http://www.sampou.org/cgi-bin/haskell.cgi
http://www.shido.info/hs/

過去ログ
関数型プログラミング言語Haskell
Part1 http://pc.2ch.net/tech/kako/996/996131288.html
Part2 http://pc2.2ch.net/test/read.cgi/tech/1013846140/
Part3 http://pc8.2ch.net/test/read.cgi/tech/1076418993/
Part4 http://pc8.2ch.net/test/read.cgi/tech/1140717775/
Part5 http://pc8.2ch.net/test/read.cgi/tech/1149263630/
Part6 http://pc11.2ch.net/test/read.cgi/tech/1162902266/
Part7 http://pc11.2ch.net/test/read.cgi/tech/1174211797/
Part8 http://pc11.2ch.net/test/read.cgi/tech/1193743693/
・2chの仕様により、行頭の半角スペースは表示されません。
 コードをインデントしたいときは、代わりに または全角スペースを使うことができます。
0067デフォルトの名無しさん2008/05/23(金) 01:04:34
>>27
数学基礎論がまるで分からないんだね。
0068初心者修業中2008/05/23(金) 02:23:32
>>66
data Hoge = Hoge0|Hoge1|Hoge2|Hoge3|…|Hoge10

これじゃ駄目?
0069デフォルトの名無しさん2008/05/23(金) 07:10:08
数学できない奴くるな
0070デフォルトの名無しさん2008/05/23(金) 13:34:41
haskell関係の文書(特に論文)を読みたくてhaskell.orgをあさってるんだけど
沢山あるからどれを読もうか迷ってしまう
このスレ的に、コレは読んでおいて損は無い!って奴あったら教えてくらはい
今のとこ読んだのはImperative functional programmingとLazy vs Strictと
Haskell vs. Ada vs. C++ vs. Awk vs. ...
0071デフォルトの名無しさん2008/05/23(金) 13:47:07
Tackling the awkward squad
0072デフォルトの名無しさん2008/05/23(金) 13:49:13
もうここで紹介される論文はすべて読んだんだよなぁ。
2chは時代遅れ情報しか出てこねーな。noobどもしかいねぇ。
0073デフォルトの名無しさん2008/05/23(金) 13:53:08
2chの情報に価値がないと思うなら立ち去ればいいじゃないか!
0074デフォルトの名無しさん2008/05/23(金) 14:18:52
>>71
落として読んでみるよー
他にもあったら是非教えてクレクレ
>>72
玄人さん面白かった論文教えて
0075デフォルトの名無しさん2008/05/23(金) 14:36:10
>>69
そんな事を言う奴が来るな!
数学なんぞできんでもプログラムはできる!!
0076デフォルトの名無しさん2008/05/23(金) 14:49:15
最初のうちはな
手続き型にどっぷり浸かった後で関数型言語を触って嵌ってしまったやつは
やつは皆計算機科学の世界に飛び込み二度と帰ってこなくなっちまうものなのさ

「コード書いてるより数式弄くってるほうが楽しいおwwww」
俺の同僚の最後の言葉さ・・・
0077デフォルトの名無しさん2008/05/23(金) 16:03:56
だからオブジェクト指向が生き残るのですね
0078デフォルトの名無しさん2008/05/23(金) 18:02:35
最近、自作のソースをarrowで設計段階からやり直そうとしているんだけど、
いまいちメリットが無いんだよなぁ。
前のコードの方が短かったし、arrowにしたせいで複雑になってしまうことも多々ある。
arrowのメリットを具体的に教えてくださいよ。
論文読んでみてもarrowのうまみが伝わってこないんだよね。
0079デフォルトの名無しさん2008/05/23(金) 18:31:30
難読化
0080デフォルトの名無しさん2008/05/23(金) 19:12:20
どんなものが分かりやすいかなんて人それぞれだし
arrowを使ったほうが分かりやすいって感じる人も少しはいるでしょうから
そういう人が勝手に使ってればそれでいいんでしょう
008136 ◆K0BqlCB3.k 2008/05/23(金) 19:20:21
arrowを使ったプログラミングでは設計段階で図式化しやすいところにうまみがあるのかな?
008236 ◆K0BqlCB3.k 2008/05/23(金) 19:21:01
ミスってコテハンつけちゃったぜ
0083デフォルトの名無しさん2008/05/23(金) 19:39:51
>>82
warrockに帰れwww
0084デフォルトの名無しさん2008/05/23(金) 19:58:07
>>78
(モナドと比較した場合)arrowの旨みって、モナドではないがarrowである型があるっていう一点じゃないの?
そういう型を扱うときはarrowの枠組みが便利というだけ
008536 ◆K0BqlCB3.k 2008/05/23(金) 20:07:01
っていうかさ、俺は(\x -> (x, x))とかして処理を分けるのをいちいち書くのがめんどくさいときにarrow使うぜ
0086デフォルトの名無しさん2008/05/23(金) 20:12:53
>>85
確かにそれは慣れれば便利かもな
でも、Arrow (->)という特定のインスタンスを使ってるだけなら、
>>78が言ってるようなArrowの旨味とは別の話な気がする
0087デフォルトの名無しさん2008/05/23(金) 23:35:21
>>71
ちょwwBeautiful Codeって本みながら、たまたまスレ覗いたら、
本の中でソレ紹介されてたぞww
0088デフォルトの名無しさん2008/05/24(土) 00:10:42
arrowって今のところ
解析関係かデバッグ関係
形式証明以外使えそうな分野
無い
0089デフォルトの名無しさん2008/05/24(土) 04:49:01
分かってねーな
0090デフォルトの名無しさん2008/05/24(土) 04:59:31
分かってねーなじゃわからないっす。
0091デフォルトの名無しさん2008/05/24(土) 22:25:11
>>76
関数型が好きな理由は、所謂プログラミングの面白さがあるからではないな。
0092デフォルトの名無しさん2008/05/25(日) 00:01:55
do { ... } は「アクションっていう値」という認識でいいの?
0093初心者修業中2008/05/25(日) 00:18:03
>>92
do構文はbind演算子で結合された式を
手続型言語っぽく見せる糖衣構文と認識してますが。
0094デフォルトの名無しさん2008/05/25(日) 01:33:41
>>92
do{...}が値を持つ単なる式であるか、という質問ならそのとおり
>>93が言うようにdo式は構文糖で、bind演算子(>>=)の略記
do式の値が(広い意味で)アクションか、という質問ならそのとおり
具体的には、IOモナドに関するdo式なら値はIOアクション、リストモナドならリスト、という具合
0095922008/05/25(日) 01:35:15
>>94
そういう意図の質問でした。ありがとう。
0096初心者修業中2008/05/25(日) 02:31:03
>>94

>(広い意味で)アクション
の意味がわかりません。

Maybeも(広い意味で)アクションなのでしょうか?
0097デフォルトの名無しさん2008/05/25(日) 03:08:50
>>96
そういうつもりで書いた
一般的でない用語法だったらすまん
0098デフォルトの名無しさん2008/05/25(日) 03:28:30
Just x : なにもしないでxを返すアクション
Nothing : 計算を即座に終了させるアクション
0099デフォルトの名無しさん2008/05/25(日) 07:33:24
f x: xにfを適用するアクション
1 + 2: 1と2を加えるアクション
0100デフォルトの名無しさん2008/05/25(日) 09:42:48
理系の方々に伺いたいんですけど、Haskellは数学で蓄積された
知識をダイレクトにコード化が可能だと感じますか?

Cなんかだと似ても似つかないものにしないといけませんよね。
数学的なモデルのシュミレーションなんかを記述する際に、
正しく書くのは結構大変じゃないかと思ってしまいます。

そういう点で、Haskellはそのままとは言いませんが書きやすいの
かなぁと。だけど、僕の知人で理系の人たちはC言語使う場合が
多いようです。最大の理由はスピードだそうですが、手間を考えると
早い計算機使ってHaskellで書いた方がいい、という考えの人も
いるんでしょうか。
0101デフォルトの名無しさん2008/05/25(日) 10:41:40
ダイレクト云々よりも
LINPACKが使えるかどうか
それが問題だ
0102デフォルトの名無しさん2008/05/25(日) 10:49:58
>>99
関数とアクションは同じものなの?
0103デフォルトの名無しさん2008/05/25(日) 10:55:25
>>102
別のものだよ
>>99はネタ(か、たちの悪い誤解)だから真に受けんな
0104デフォルトの名無しさん2008/05/25(日) 11:19:31
LINPACKとか言ってるおっさん
氏ねよw
0105デフォルトの名無しさん2008/05/25(日) 11:24:30
>>100
0か1かみたいな考え方は辞めた方がいいかと。
工学の人は合理的、合目的的に考えるから、適材適所でやります。

速い計算機に、さらに速いソフトウェアがあれば、より計算を回せます。
計算機が速いから、ソフトウェアは遅くていいなんてやり方じゃ、
ライバルに負けてしまいます。遊びならそれでもいいけど。
0106デフォルトの名無しさん2008/05/25(日) 11:39:54
>>100
0107デフォルトの名無しさん2008/05/25(日) 12:36:24
「アクション」ていうのはIOモナドだけじゃねえの?
Maybeとかでも「アクション」ていうの?
0108デフォルトの名無しさん2008/05/25(日) 12:43:09
少なくともStateとかSTMモナドではアクションって言うよ
0109デフォルトの名無しさん2008/05/25(日) 12:43:17
自分もActionというのはIOだけを指しているのだと思ってました。要するに
関数の外の世界に対して、関数の動きが影響を与えたり、逆の現象が発生
するのがActionであり、IO型であると。

IOがモナドなのは、モナド則に当てはまるから、ってだけではないでしょうか?
0110デフォルトの名無しさん2008/05/25(日) 13:21:38
モナド則に当てはまらないものをモナドと言うわけないでしょ。
0111デフォルトの名無しさん2008/05/25(日) 13:24:07
>>105
そうそう、その時点その時点でのベストを尽くします。そして、過去の仕事に対するリスペクトも忘れません。
0112デフォルトの名無しさん2008/05/25(日) 15:24:57
質問です

たとえば
data Hoge = Hoge { x1 :: Word32, x2 :: Word32, x3 :: Word16, x4 :: Word16}
のようなHogeを[Word8]と相互変換する便利な方法ってないでしょうか?
0113デフォルトの名無しさん2008/05/25(日) 15:29:12
使ったことないけどSerTHとか?
0114デフォルトの名無しさん2008/05/25(日) 15:33:25
>>113
へえ・・・ 何となくおもしろそう
ドキュメントとか読んでみます
0115デフォルトの名無しさん2008/05/25(日) 15:58:20
SerTH見てみましたけれど、どうやら私の用向きとは違うようですね。
0116デフォルトの名無しさん2008/05/25(日) 16:02:02
Template Haskellの方もちょっと見てみます
0117デフォルトの名無しさん2008/05/26(月) 00:05:41
計算理論の基礎
計算機プログラムの構造と解釈

ってどっち買ったらいいの?
なんか最近数学の基礎たりねー
0118デフォルトの名無しさん2008/05/26(月) 00:17:22
ちなみに計算理論の基礎が
つい先日第2版が出たので聞いてみた
私事だけど金がないので優先度が欲しい
0119デフォルトの名無しさん2008/05/26(月) 07:36:44
後者は原著がネット上で無料で読めるから前者
0120デフォルトの名無しさん2008/05/26(月) 09:26:17
というか全然違う傾向のほんのどっちがいいか聞かれても…
しかもHaskellには関係ない
推薦図書スレは別にあるよ
0121デフォルトの名無しさん2008/05/26(月) 14:08:03
こっちでいいかと
http://science6.2ch.net/test/read.cgi/informatics/1160740645/
012236 ◆K0BqlCB3.k 2008/05/26(月) 15:31:05
全く調べずに聞くが、concurrent arrowなんてのは無いの?
arrow使ってていつも思うんだが、並列処理に向いてなくない?
FPGAとかのHDL記述とかに応用したりしてる人いないの?
0123デフォルトの名無しさん2008/05/26(月) 22:01:15
>>117
若いうちに読んどいた方がいいのは計算理論の基礎 の方だろ。
計算機プログラムの構造と解釈は仕事で必要になってからで十分。
0124デフォルトの名無しさん2008/05/26(月) 22:17:09
>>123
独学でやってしまった奴は
次何すればいいの?
とりあえず今自習でλの数学側の
側面勉強してみているが
何の役に立つかわからん
0125デフォルトの名無しさん2008/05/26(月) 22:24:27
絵を描いて学ぶ・プログラマのためのラムダ計算
http://d.hatena.ne.jp/m-hiyama/20070220/1171956186
0126デフォルトの名無しさん2008/05/26(月) 22:27:23
僕が「ラムダ計算は知っておいたほうがいい」と思う理由は、形式的計算体系としての“純粋ラムダ計算”が理論的に重要だから、というだけではありません。
むしろ、次に述べるようなことがより大きな動機となります。
まず、関数を表現する方法としてのラムダ記法(lambda notation)に慣れて、紙と鉛筆によるインフォーマルなラムダ計算が出来ると、
けっこうそれを使える場面が多いのです。例えば、「JavaScriptによるテンプレート・モナド、すっげー簡単!」の最後で、モナド法則を示すために、
インフォーマルなラムダ計算を使っています。
ある種の計算的実体(例:クロージャ)や計算手法(例:継続ベースの計算)の説明にもラムダ式がよく使われます。
式言語(EL; expression language)に対する処理系(パーザーやエバリュエータ)を作る場合なども、ラムダ計算が良いヒントになるでしょう。
もちろんラムダ計算は、既存の関数型言語を理解する基盤となります。あるいは、新しいプログラミング言語を設計する際にもラムダ計算が規範になるかも知れません。
0127デフォルトの名無しさん2008/05/26(月) 22:45:04
そもそも計算とはいったいなんなんだ?
0128デフォルトの名無しさん2008/05/26(月) 23:36:50
後者関数ってなんだぉ?
0129デフォルトの名無しさん2008/05/27(火) 00:14:01
やっぱ手書きしねーと理解できねーよw
0130デフォルトの名無しさん2008/05/27(火) 07:23:35
data type Nat = O | S Nat
という定義で自然数(0以上の整数)が表現できる。(ペアノの公理を満たす)
このとき S のことを後者関数(successor function)と呼ぶ。
0131デフォルトの名無しさん2008/05/27(火) 11:39:43
ここで
定義に再帰を使っていいんですか?
とか聞くとYコンビネータとか出てきちゃうんだろうか
0132デフォルトの名無しさん2008/05/27(火) 16:49:17
質問です

yampaっていったい何ですか?
ごく簡単に馬鹿でもわかるように概要を説明してください
0133デフォルトの名無しさん2008/05/27(火) 19:16:35
>>132
http://d.hatena.ne.jp/propella/20070315/p1
なんかどうよ。
0134デフォルトの名無しさん2008/05/27(火) 20:06:04
>>132
http://ll.jus.or.jp/llw2004/program/Reactive.pdf
5ページ目
Haskell による Arrowised Functional Reactive
Programming という実装
0135デフォルトの名無しさん2008/05/27(火) 22:54:50
Yampaってコンパみたいなもん?
0136デフォルトの名無しさん2008/05/28(水) 07:20:03
>>127N.D.Jones, Computability and Complexity
その他良本情報はこちら
ttp://www.kurims.kyoto-u.ac.jp/~hassei/reading_list.html
0137デフォルトの名無しさん2008/05/31(土) 11:55:19
「The Haskell School of Expression」で使われているコードの
ファイルってどこかに落ちてませんかね。
0138デフォルトの名無しさん2008/05/31(土) 13:59:28
>>137
ttp://www.haskell.org/soe/software1.htm
0139デフォルトの名無しさん2008/05/31(土) 14:22:28
>>138
あ、これってグラフィックライブラリだけじゃなくて、本のコードも
入ってるのか。勘違いしてた。ありがとう。
0140デフォルトの名無しさん2008/05/31(土) 20:44:19
comb :: Maybe a -> (a -> Maybe b) -> Maybe b

このときの

Maybe a -> (a -> Maybe b) ここまでが入力だよね?
2項目の引数が関数になっているって解釈でいいんだよね?
0141デフォルトの名無しさん2008/05/31(土) 21:04:28
うん
0142デフォルトの名無しさん2008/05/31(土) 21:41:20
違うだろw

入力 : Maybe a
出力 : (a -> Maybe b) -> Maybe b
0143デフォルトの名無しさん2008/05/31(土) 21:51:45
()でくくるとどうなるのw?
0144デフォルトの名無しさん2008/05/31(土) 21:52:57
>>142
同じことじゃねーか
関数を返す関数と二引数の関数を同一視するのはHaskellでは普通の習慣
0145デフォルトの名無しさん2008/05/31(土) 22:22:38
>>143
a -> Maybe b
っていう関数を引数にとるっていうことだよ
0146初心者修業中2008/05/31(土) 22:30:19
>>140
Maybe a -> (a -> Maybe b) の2つを入力とする事もできるし、
Maybe a だけを入力とする事もできる。

後者の場合は(a -> Maybe b) -> Maybe bの関数が出力となる。
これを部分適用といい、こういった事ができるのが
Haskellの魅力である。

…と認識しています。
0147デフォルトの名無しさん2008/05/31(土) 22:31:41
>>145
えっとねそれじゃあ
Maybe aと関数を引数に取るために
(a -> Maybe b)、この2つを与えてますよね?
関数渡すためにこう記述するしか方法がないから
そのようになっていると理解したてみたのですが
どうやら上の人曰く間違っているようで何が違うのでしょうか

Haskellはグラフ簡約によって1度に1つのTermを解釈していくだけ
なので、最終的な結果は高々1つになるはずだと思っていたのですが
どうやら違うようで混乱してきました。困った、不勉強だ困った
0148デフォルトの名無しさん2008/05/31(土) 22:38:00
>>143
右結合の二項演算子?である「->」の結合順序をデフォルトから変更している。

A -> B -> C -> D
は、「->」が右結合の二項演算子?であるがゆえに、
A -> (B -> (C -> D))
と解釈される。

A -> (B -> C) -> D
は、
A -> ((B -> C) -> D)
と解釈される。
0149デフォルトの名無しさん2008/05/31(土) 22:39:34
>>147
>どうやら上の人曰く間違っているようで
間違ってないよ
0150デフォルトの名無しさん2008/05/31(土) 22:55:51
>>147
> Haskellはグラフ簡約によって1度に1つのTermを解釈していくだけ
> なので、最終的な結果は高々1つになるはずだと思っていたのですが
> どうやら違うようで混乱してきました。困った、不勉強だ困った

型の問題と適用の問題が、頭のなかでうまく区別が付いていないのでは?

適用される関数はA -> (B -> C) -> D型で変化はないけど、

* A型の「値」に適用すると、(B -> C) -> D型の「値」(関数)が帰ってくる。
* A型の「値」と、 (B -> C)型の「値」(関数)の2引数に適用すると、D型の「値」が帰ってくる。

このように考えてはどうか。

これで納得できなければ、やっぱり単純に、
A -> (B -> C) -> D型は、A型の値をとって、(B -> C) -> D型の値を返す関数の「型」
という出発点に戻るべきかな。
0151デフォルトの名無しさん2008/05/31(土) 22:56:33
>>142が突っ込んでるのは

> Maybe a -> (a -> Maybe b) ここまでが入力だよね?

の部分。

> 2項目の引数が関数になっているって解釈でいいんだよね?

こっちは合ってる。
0152デフォルトの名無しさん2008/05/31(土) 23:54:09
カリー化とは何か?を書いた方がいいんではないでしょうか。

↓ではお願いします。
0153デフォルトの名無しさん2008/05/31(土) 23:58:34
この関数適用は出来損ないだ。食べられないよ。
0154初心者修業中2008/06/01(日) 01:08:22
カリー化とは、
複数の引数を持つ関数を
引数一つの関数の組み合せとする事。

…と認識しています。
0155デフォルトの名無しさん2008/06/01(日) 01:08:36
カリー化という言葉を見ると頭の中で
「カリンカカリンカ カリンカマヤ」という歌が繰り返されて止まらなくなる。
0156デフォルトの名無しさん2008/06/01(日) 01:54:38
おれもそうりかいしてる。<154
でも、カリー化ときいてターメリックをぶっかけてるイメージしかないw
0157デフォルトの名無しさん2008/06/01(日) 09:01:04
ガラムマサラとかも入れた方がいいのでは?
0158デフォルトの名無しさん2008/06/01(日) 10:27:15
エバラ化、桃屋化
0159デフォルトの名無しさん2008/06/01(日) 10:28:14
味の素化
0160デフォルトの名無しさん2008/06/01(日) 10:59:26
>>140
  A -> (B -> C)
というふうに切り出してしまったけど、これは本来の
  A → ((B → C) → D)
という結合関係を無視してる(「A -> (B -> C)」という型を扱うみたいに書いている)。
ってのが>>142でしょ。

カリー化の影響として、「複数の引数をとる」
  (A × (B → C)) → D
ことと、「関数を返す」ことの、どちらに主眼があるかが不明瞭になるってのがあると思うね。
0161デフォルトの名無しさん2008/06/01(日) 11:24:29
>>151>>160
その理屈は分かるんだが、カリー化を理解してるのか怪しい初心者に対して
混乱させるようなことを言うのは不親切だと思う
Maybe aと(a -> Maybe b)の二つが引数になっているという理解で正しい、と教えれば十分じゃないか
0162デフォルトの名無しさん2008/06/01(日) 11:29:36
f(a,b,c) = y
f : A×B×C→Y

f a b c = ((f a) b) c = y
(((f a) b) c) : Y
((f a) b) : C→Y
(f a) : B→(C→Y)
f : A→(B→(C→Y))
0163デフォルトの名無しさん2008/06/01(日) 11:48:09
> Maybe a -> (a -> Maybe b) ここまでが入力だよね?

「ここまでが引数リストに対応する部分だよね?」と読むと○
「ここまでが引数の型だよね?」と読むと× ← ちょっと窮屈な解釈かも、みたいな空気
0164デフォルトの名無しさん2008/06/01(日) 15:19:49
> Maybe a -> (a -> Maybe b) -> ここまでが入力だよね?

と書けばおk
0165デフォルトの名無しさん2008/06/01(日) 17:10:16
なるほどw
0166デフォルトの名無しさん2008/06/01(日) 23:06:52
複数引数の邪悪な関数をこらしめるのがカリー化です。
■ このスレッドは過去ログ倉庫に格納されています