関数型プログラミング ..
[2ch|▼Menu]
2:デフォルトの名無しさん
08/05/17 16:42:18
関連書籍
・Introduction to Functional Programming Using Haskell
 URLリンク(www.amazon.co.jp)
・Haskell: The Craft of Functional Programming
 URLリンク(www.amazon.co.jp)
・The Fun of Programming
 URLリンク(www.amazon.co.jp)
・The Haskell School of Expression: Learning Functional Programming Through Multimedia
 URLリンク(www.amazon.co.jp)
・入門Haskell
 URLリンク(item.rakuten.co.jp)
・ふつうのHaskellプログラミング
 URLリンク(item.rakuten.co.jp)


3:デフォルトの名無しさん
08/05/17 16:42:39
関連スレ
・関数型言語Part IV
 スレリンク(tech板)
・【数学者】Haskellはクソ言語【オナニー】
 スレリンク(tech板)
・純粋関数型言語Concurent Clean
 スレリンク(tech板)
・関数型言語ML(SML, OCaml, etc.), Part 5
 スレリンク(tech板)
・Lisp Scheme Part21
 スレリンク(tech板)
・【入門】CommonLispその4【質問よろず】
 スレリンク(tech板)
・Emacs Lisp 3
 スレリンク(tech板)


4:デフォルトの名無しさん
08/05/17 16:43:00
・日本語の扱いについて

Haskell98によると、Charは一つのUnicode文字を表す(6.1.2)。
これに従って、比較的新しいHugsやGHC(6.4系を含む)ではCharは32ビット整数になっている。
ただし、どちらも入出力に際しての変換が完全でない。具体的には、
・ソースコード中の文字列リテラル
・System.IOライブラリでの入出力
が問題になる。

1. GHC6.4.2以前
ソースコード・入出力ともLatin-1を仮定する。Latin-1ではバイト値と
コードポイントが一致するので、入力時には外部エンコードの各バイトがそのままCharに
入り、出力時にはCharの下位8ビットのみが出力されるような実装になっている。
このため、あるエンコーディング(Latin-1とは限らない)の入力をgetLineで受け取り、
それをそのままputStrで表示すれば、入力時とおなじエンコードにおいて正しく表示される。
これを利用して、[Char]を、本来のコードポイントの列としてではなく、特定のエンコードの下での
バイト列として使うことができる。ただし文字列リテラルについては、GHCはLatin-1として
不正な文字を受け付けないので、EUC-JPのような例外を除くと、単純にリテラルを使うことはできない。

2. GHC6.6
ソースコードにはUTF-8、入出力にはLatin-1を仮定する。このため、EUC-JPでリテラルを直に
書くことはできない。

(続く)


5:デフォルトの名無しさん
08/05/17 16:43:20
(続き)

3.最近のHugs(非WindowsかつCのwchar_tがUnicodeの環境、というかLinux)
ソースコード・入出力ともロケールのエンコードを利用する。

4.最近のHugs(Windows)
ソースコード・入出力ともLatin-1を仮定する。ただし文字列リテラルにShift-JISを使ってもエラーにならない。

5.最近のHugs(それ以外)
未調査。

・結局どうするか。
規格どおりにCharにUnicodeを入れるか、Charを単なるバイトとして扱うかの二択。

i. CharをUnicodeとして扱う
(3)以外の場合入出力で変換が必要。(2)または(3)以外の場合文字列リテラルでは
明示的なエスケープ(たとえば"\22234")が必要。

ii. Charをバイトとして扱う
(3)ではファイルをバイナリモードで開くなどの対策が必要。(1)でEUC-JPを使う場合と(4)
を除き文字列リテラルでは明示的なエスケープ(たとえば"\143\153")が必要。
lengthやisAlphaのような関数、およびwin32パッケージの関数(win32API)が正しく動作しない。


6:デフォルトの名無しさん
08/05/17 16:43:41
テンプレはここまで。
前スレが終わってからしばらく建ってなかったので建てました。
行き届かないところがあったらごめんなさい。


7:デフォルトの名無しさん
08/05/17 17:05:58
      _
   , '´ λ ヽ   
    !,.イリノ)))〉   
    リ)^ヮ^ノ|  このスレのマスコットキャラ
   ノ⊂)水!つ     
  ((( く/_l〉 リ  はすけるたん    
   `` し'ノ

8:デフォルトの名無しさん
08/05/17 18:53:58
質問です

Word8からWord32に変換する方法についてなのですが、
Word8からtoInteger・fromInteger関数を経てWord32に変換する以外に、
クレバーな方法はありませんか?

9:デフォルトの名無しさん
08/05/17 18:54:51
リアルhaskellたん
URLリンク(www.haskell.org)

10:デフォルトの名無しさん
08/05/17 19:44:18
>>8
n(n-1)個のcastを用意するのが
2n個のcastを用意するよりクレバーだと思いますか?

11:デフォルトの名無しさん
08/05/17 20:00:31
そろそろ、テンプレの GHC 6.6 の日本語の取り扱いについて書き改めて欲しい。
1. ソース中の文字列 hello = "こんにちは" :: String は UTF-8
2. これを ghci で表示することは可能:(ただし、環境変数 LANG を UTF-8 にしておくこと、また、ターミナルも UTF-8 で入出力できるようにしておくこと)
Main> print hello
こんにちは
Main>
3. 入出力 IO は Latin-1 だが、package utf8-string (URLリンク(code.haskell.org)) を導入することにより、入出力を UTF-8 にすることができる
4. その他の文字列エンコード(ShiftJIS, JIS, EUC-JP など) は、package iconv (URLリンク(hackage.haskell.org)) で UTF-8 な文字列にする
とまあ、こういうことで、日本語表示できるわけだ。iconv package は MacOSX と *BSD では cabal を少しいじらなければいけないことに注意しろよ(iconv.cabal のコメントに書いてある)
よろしくたのむ、な。

12:sage
08/05/17 20:05:38
>>8
toEnum . fromEnum でよくね

13:デフォルトの名無しさん
08/05/17 21:23:49
>>11
>1. ソース中の文字列 hello = "こんにちは" :: String は UTF-8
これどういう意味?Stringになってしまえば文字コード関係なくね?

>2. これを ghci で表示することは可能
*Main> print hello
"\12371\12435\12395\12385\12399"
こうなった

14:デフォルトの名無しさん
08/05/17 21:25:11
>>8
fromIntegral :: (Integral a, Num b) => a -> b
fromIntegral = fromInteger . toInteger
という関数がある

15:デフォルトの名無しさん
08/05/17 21:41:45
fromIntegralはGHCだといろいろ特殊化されてて効率もいいしな

16:デフォルトの名無しさん
08/05/18 08:26:56
新スレ乙です。

上げていただいている関連書籍で、

・Introduction to Functional Programming Using Haskell
・Haskell: The Craft of Functional Programming

は読み終えて、

・The Haskell School of Expression: Learning Functional Programming Through Multimedia

を問題解きつつ進めているところですけど、

・The Fun of Programming

次はこちらがいいんでしょうか。それともネット上の新しい記事とかを
見ていくほうがいいですか?



17:デフォルトの名無しさん
08/05/18 09:26:23
>>16
The Haskell Programmer's Guide to the IO Monad ― Don't Panic
URLリンク(stefan-klinger.de)
は、Haskellのモナドを理解するのにおすすめ。

18:デフォルトの名無しさん
08/05/18 12:25:58
質問です。

100MB程度の音楽データを編集するツールを作ろうと思っているのですが、
音楽データを格納するための型のお勧めは何ですか?

19:デフォルトの名無しさん
08/05/18 12:39:36
音楽データって波形データ?

音楽ツールのことは良く知らないから一般的なことだけ言うと、
Haskellで配列っぽいデータを扱うときに一番空間効率がいいのは非ボックス化配列
(具体的にはUArrayかIOUArrayかSTUArray)で、Cの配列と同じくらいコンパクト
ただし、これは生の配列だから切ったり貼ったりするのには向かない
切り貼りしたいなら、「非ボックス化配列を葉とする木」みたいな構造が必要かも

ところで音楽編集ソフトって全部メモリ上で作業するんだろうか

20:デフォルトの名無しさん
08/05/18 22:20:25
>>17
ありがとうございます。文系なので理解できるか不安ですがw。

一通りの基本構文については馴染んできたと思うので、もう少し
アプリ全体の構成などについての解説文書みたいなものって
ありますでしょうか。

或いは、モナドもその一つだと思うのですが、関数型によるプログラミング
テクニックというんでしょうか、そういったものがもう少しまとまっている
本があると嬉しいんですが。

21:デフォルトの名無しさん
08/05/18 23:25:58
文系出身のやつって知ったかぶり多いよな。
細かいこと考えないのが吉なのか凶なのか。

22:デフォルトの名無しさん
08/05/18 23:34:12
絶対的な真理は無いという事を知ってるからじゃないかな。

23:デフォルトの名無しさん
08/05/18 23:37:22
理系は論理を重視するんだよ。
真理?なにそれ食えるの?

24:デフォルトの名無しさん
08/05/18 23:40:59
例えば
4 :: Int
は絶対的な真理じゃね?

25:デフォルトの名無しさん
08/05/18 23:50:33
論理は文系だろ

26:デフォルトの名無しさん
08/05/19 00:15:42
はい?俺理系なんで良く分かりません。
ささ、次行きましょう

27:デフォルトの名無しさん
08/05/19 00:16:50
>>24
その例のようなことが成り立つ数体系が便利だから、
たまたま人間が採用して「正しい」として使ってるだけとも言える

とはいえ、「数学は人間の存在にかかわらず成立するから
数学はこの世の真理の一つだ」と主張する哲学者もいたような


28:デフォルトの名無しさん
08/05/19 00:19:33
哲学者なんてはったり言うだけのでくの坊だろ 次行くぞ次

29:デフォルトの名無しさん
08/05/19 00:22:38
理系のやつって細かい事考えないんだな。

30:デフォルトの名無しさん
08/05/19 00:27:10
>>27
言葉が足りなかったな

Haskell98における式「4」は、Haskell98における型式「Int」で表される型を持つ

と言えばよかったか
もちろんHaskell98ってのは地球でBC1998年に定義された「あの」Haskell98のことで、
「型」とか「式」とかの術語はHaskell98の仕様に従って解釈するものとしてね

31:デフォルトの名無しさん
08/05/19 00:49:11
真理に「絶対的」なんて付けてるところを見ると
真理の意味が分かってないんだろ

32:デフォルトの名無しさん
08/05/19 00:52:18
真理の意味をお願いします

33:デフォルトの名無しさん
08/05/19 00:53:52
>>32
まことのことわり。
コレは絶対の真理。

34:デフォルトの名無しさん
08/05/19 00:55:36
真理・・・いつもどんな時も変わることのない、正しい物事の筋道。真実の道理。
例:HaskellスレはHaskellを論ずる為に存在している

これでおk?

35:デフォルトの名無しさん
08/05/19 00:55:40
理系の雑談っていつもこんななの?

36:デフォルトの名無しさん
08/05/19 00:59:02
>>33-34
そこから >>31 を導出するのは至難だなw

37:デフォルトの名無しさん
08/05/19 01:04:01
「真理」は既に絶対的なものだから「絶対的な真理」という表現は「絶対的」が重複しているってことだろ

38:デフォルトの名無しさん
08/05/19 01:06:01
>>35
理系に限らず2chの雑談はどこもこんな感じです。

39:デフォルトの名無しさん
08/05/19 01:07:30
今日はいつにもましてバカが多いな
春か?春だからなのか?

40:デフォルトの名無しさん
08/05/19 01:19:01
>>37
修飾語は強調する為にも使うけど、意味内容の重複は許されないという主張?

41:デフォルトの名無しさん
08/05/19 01:25:54
程度の存在しない物に強調もクソもないだろ

42:デフォルトの名無しさん
08/05/19 01:31:46
あ、強調って分かり辛かったか。念押しだと考えてみな。

43:デフォルトの名無しさん
08/05/19 13:06:15
程度の存在しない物に念押しもクソもないだろ

44:デフォルトの名無しさん
08/05/19 13:50:33
まさに自転車置場の議論

45:デフォルトの名無しさん
08/05/19 18:57:28
+++ってどういう意味なんですか?
+とか++とかもあってよくわからないのですが

46:デフォルトの名無しさん
08/05/19 19:25:42
>>30
× haskell4000年の歴史
○ AD

47:デフォルトの名無しさん
08/05/19 19:41:15
>>45
解らないなら使うな以上

48:デフォルトの名無しさん
08/05/19 19:46:25
>>45
(+) は Integralクラスのインスタンス、つまり数の加法。
(++) は リストの結合。[1, 2, 3] ++ [4, 5, 6] は [1,2,3,4,5,6]。
(+++) は Arrowの合成かなにかに使う。Arrowは俺も良くわかんないし、まあ知らんでもプログラムは書けるから気にするな。

49:デフォルトの名無しさん
08/05/19 19:46:29
>>45 型を見てみろ

50:デフォルトの名無しさん
08/05/19 19:49:24
>>48
失敬!(+)はIntegralじゃなくてNumクラスのインスタンスの加法だな。

51:デフォルトの名無しさん
08/05/19 20:03:27
質問です。

「16文字のString型」という定義は型定義の段階でできるのでしょうか?

52:デフォルトの名無しさん
08/05/19 20:11:35
>>48
ありがとうございます

53:デフォルトの名無しさん
08/05/19 20:14:01
>>51
絶対の真理

54:20
08/05/19 22:42:22
「文系」という一言でスレがこんなに伸びるとは思いませんでしたw。
ちなみに自分は理系人間に対しては羨望の眼差しで見ています。

The Fun of Programming って読んだ方いらっしゃいますでしょうか。


55:デフォルトの名無しさん
08/05/19 23:25:55
今日先輩にHaskellできると
彼女ができると聞いたのですが
みなさんは彼女いてますか?

56:デフォルトの名無しさん
08/05/19 23:39:55
>>55
55人ぐらいいるよ。

57:デフォルトの名無しさん
08/05/20 03:13:47
>>16
そんな教科書ばっか読んでなにがしたいの?

>>20
Haskellで書かれたアプリのコード読め。

58:デフォルトの名無しさん
08/05/20 22:55:17
Monagiusは勉強になる。

59:デフォルトの名無しさん
08/05/20 23:03:23
monadiusはもはや古いぞ。
今はもっと洗練されてる。

60:デフォルトの名無しさん
08/05/21 00:08:32
Little Haskeller読んで学習中。日本語版もホスイ

61:デフォルトの名無しさん
08/05/21 01:40:02
>>60
それってリトル隙間の姉妹本?

62:デフォルトの名無しさん
08/05/21 02:51:30
mod_haskell.soまだー?

63:デフォルトの名無しさん
08/05/21 03:51:48
>>62
まってないで作って公開しろ

64:デフォルトの名無しさん
08/05/21 23:00:47
>>59
今って例えばどれ?

65:デフォルトの名無しさん
08/05/22 03:04:27
URLリンク(www.geocities.jp)
古いというか、力技で作ったって感じ。
>>59はFRPを念頭においてるんだろうけど、
FragのObjectBehaviorなんかが洗練されてるのかは微妙。

66:デフォルトの名無しさん
08/05/22 19:37:06
質問です。

0〜10までの整数を定義した型というのは宣言できますか?

67:デフォルトの名無しさん
08/05/23 01:04:34
>>27
数学基礎論がまるで分からないんだね。

68:初心者修業中
08/05/23 02:23:32
>>66
data Hoge = Hoge0|Hoge1|Hoge2|Hoge3|…|Hoge10

これじゃ駄目?

69:デフォルトの名無しさん
08/05/23 07:10:08
数学できない奴くるな

70:デフォルトの名無しさん
08/05/23 13:34:41
haskell関係の文書(特に論文)を読みたくてhaskell.orgをあさってるんだけど
沢山あるからどれを読もうか迷ってしまう
このスレ的に、コレは読んでおいて損は無い!って奴あったら教えてくらはい
今のとこ読んだのはImperative functional programmingとLazy vs Strictと
Haskell vs. Ada vs. C++ vs. Awk vs. ...

71:デフォルトの名無しさん
08/05/23 13:47:07
Tackling the awkward squad

72:デフォルトの名無しさん
08/05/23 13:49:13
もうここで紹介される論文はすべて読んだんだよなぁ。
2chは時代遅れ情報しか出てこねーな。noobどもしかいねぇ。

73:デフォルトの名無しさん
08/05/23 13:53:08
2chの情報に価値がないと思うなら立ち去ればいいじゃないか!

74:デフォルトの名無しさん
08/05/23 14:18:52
>>71
落として読んでみるよー
他にもあったら是非教えてクレクレ
>>72
玄人さん面白かった論文教えて

75:デフォルトの名無しさん
08/05/23 14:36:10
>>69
そんな事を言う奴が来るな!
数学なんぞできんでもプログラムはできる!!

76:デフォルトの名無しさん
08/05/23 14:49:15
最初のうちはな
手続き型にどっぷり浸かった後で関数型言語を触って嵌ってしまったやつは
やつは皆計算機科学の世界に飛び込み二度と帰ってこなくなっちまうものなのさ

「コード書いてるより数式弄くってるほうが楽しいおwwww」
俺の同僚の最後の言葉さ・・・

77:デフォルトの名無しさん
08/05/23 16:03:56
だからオブジェクト指向が生き残るのですね

78:デフォルトの名無しさん
08/05/23 18:02:35
最近、自作のソースをarrowで設計段階からやり直そうとしているんだけど、
いまいちメリットが無いんだよなぁ。
前のコードの方が短かったし、arrowにしたせいで複雑になってしまうことも多々ある。
arrowのメリットを具体的に教えてくださいよ。
論文読んでみてもarrowのうまみが伝わってこないんだよね。

79:デフォルトの名無しさん
08/05/23 18:31:30
難読化

80:デフォルトの名無しさん
08/05/23 19:12:20
どんなものが分かりやすいかなんて人それぞれだし
arrowを使ったほうが分かりやすいって感じる人も少しはいるでしょうから
そういう人が勝手に使ってればそれでいいんでしょう

81:36 ◆K0BqlCB3.k
08/05/23 19:20:21
arrowを使ったプログラミングでは設計段階で図式化しやすいところにうまみがあるのかな?

82:36 ◆K0BqlCB3.k
08/05/23 19:21:01
ミスってコテハンつけちゃったぜ

83:デフォルトの名無しさん
08/05/23 19:39:51
>>82
warrockに帰れwww

84:デフォルトの名無しさん
08/05/23 19:58:07
>>78
(モナドと比較した場合)arrowの旨みって、モナドではないがarrowである型があるっていう一点じゃないの?
そういう型を扱うときはarrowの枠組みが便利というだけ

85:36 ◆K0BqlCB3.k
08/05/23 20:07:01
っていうかさ、俺は(\x -> (x, x))とかして処理を分けるのをいちいち書くのがめんどくさいときにarrow使うぜ

86:デフォルトの名無しさん
08/05/23 20:12:53
>>85
確かにそれは慣れれば便利かもな
でも、Arrow (->)という特定のインスタンスを使ってるだけなら、
>>78が言ってるようなArrowの旨味とは別の話な気がする

87:デフォルトの名無しさん
08/05/23 23:35:21
>>71
ちょwwBeautiful Codeって本みながら、たまたまスレ覗いたら、
本の中でソレ紹介されてたぞww

88:デフォルトの名無しさん
08/05/24 00:10:42
arrowって今のところ
解析関係かデバッグ関係
形式証明以外使えそうな分野
無い


89:デフォルトの名無しさん
08/05/24 04:49:01
分かってねーな

90:デフォルトの名無しさん
08/05/24 04:59:31
分かってねーなじゃわからないっす。

91:デフォルトの名無しさん
08/05/24 22:25:11
>>76
関数型が好きな理由は、所謂プログラミングの面白さがあるからではないな。

92:デフォルトの名無しさん
08/05/25 00:01:55
do { ... } は「アクションっていう値」という認識でいいの?

93:初心者修業中
08/05/25 00:18:03
>>92
do構文はbind演算子で結合された式を
手続型言語っぽく見せる糖衣構文と認識してますが。

94:デフォルトの名無しさん
08/05/25 01:33:41
>>92
do{...}が値を持つ単なる式であるか、という質問ならそのとおり
>>93が言うようにdo式は構文糖で、bind演算子(>>=)の略記
do式の値が(広い意味で)アクションか、という質問ならそのとおり
具体的には、IOモナドに関するdo式なら値はIOアクション、リストモナドならリスト、という具合

95:92
08/05/25 01:35:15
>>94
そういう意図の質問でした。ありがとう。

96:初心者修業中
08/05/25 02:31:03
>>94

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

Maybeも(広い意味で)アクションなのでしょうか?


97:デフォルトの名無しさん
08/05/25 03:08:50
>>96
そういうつもりで書いた
一般的でない用語法だったらすまん

98:デフォルトの名無しさん
08/05/25 03:28:30
Just x : なにもしないでxを返すアクション
Nothing : 計算を即座に終了させるアクション

99:デフォルトの名無しさん
08/05/25 07:33:24
f x: xにfを適用するアクション
1 + 2: 1と2を加えるアクション

100:デフォルトの名無しさん
08/05/25 09:42:48
理系の方々に伺いたいんですけど、Haskellは数学で蓄積された
知識をダイレクトにコード化が可能だと感じますか?

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

そういう点で、Haskellはそのままとは言いませんが書きやすいの
かなぁと。だけど、僕の知人で理系の人たちはC言語使う場合が
多いようです。最大の理由はスピードだそうですが、手間を考えると
早い計算機使ってHaskellで書いた方がいい、という考えの人も
いるんでしょうか。

101:デフォルトの名無しさん
08/05/25 10:41:40
ダイレクト云々よりも
LINPACKが使えるかどうか
それが問題だ


102:デフォルトの名無しさん
08/05/25 10:49:58
>>99
関数とアクションは同じものなの?

103:デフォルトの名無しさん
08/05/25 10:55:25
>>102
別のものだよ
>>99はネタ(か、たちの悪い誤解)だから真に受けんな

104:デフォルトの名無しさん
08/05/25 11:19:31
LINPACKとか言ってるおっさん
氏ねよw

105:デフォルトの名無しさん
08/05/25 11:24:30
>>100
0か1かみたいな考え方は辞めた方がいいかと。
工学の人は合理的、合目的的に考えるから、適材適所でやります。

速い計算機に、さらに速いソフトウェアがあれば、より計算を回せます。
計算機が速いから、ソフトウェアは遅くていいなんてやり方じゃ、
ライバルに負けてしまいます。遊びならそれでもいいけど。

106:デフォルトの名無しさん
08/05/25 11:39:54
>>100

107:デフォルトの名無しさん
08/05/25 12:36:24
「アクション」ていうのはIOモナドだけじゃねえの?
Maybeとかでも「アクション」ていうの?

108:デフォルトの名無しさん
08/05/25 12:43:09
少なくともStateとかSTMモナドではアクションって言うよ

109:デフォルトの名無しさん
08/05/25 12:43:17
自分もActionというのはIOだけを指しているのだと思ってました。要するに
関数の外の世界に対して、関数の動きが影響を与えたり、逆の現象が発生
するのがActionであり、IO型であると。

IOがモナドなのは、モナド則に当てはまるから、ってだけではないでしょうか?

110:デフォルトの名無しさん
08/05/25 13:21:38
モナド則に当てはまらないものをモナドと言うわけないでしょ。

111:デフォルトの名無しさん
08/05/25 13:24:07
>>105
そうそう、その時点その時点でのベストを尽くします。そして、過去の仕事に対するリスペクトも忘れません。

112:デフォルトの名無しさん
08/05/25 15:24:57
質問です

たとえば
data Hoge = Hoge { x1 :: Word32, x2 :: Word32, x3 :: Word16, x4 :: Word16}
のようなHogeを[Word8]と相互変換する便利な方法ってないでしょうか?

113:デフォルトの名無しさん
08/05/25 15:29:12
使ったことないけどSerTHとか?

114:デフォルトの名無しさん
08/05/25 15:33:25
>>113
へえ・・・ 何となくおもしろそう
ドキュメントとか読んでみます

115:デフォルトの名無しさん
08/05/25 15:58:20
SerTH見てみましたけれど、どうやら私の用向きとは違うようですね。

116:デフォルトの名無しさん
08/05/25 16:02:02
Template Haskellの方もちょっと見てみます

117:デフォルトの名無しさん
08/05/26 00:05:41
計算理論の基礎
計算機プログラムの構造と解釈

ってどっち買ったらいいの?
なんか最近数学の基礎たりねー

118:デフォルトの名無しさん
08/05/26 00:17:22
ちなみに計算理論の基礎が
つい先日第2版が出たので聞いてみた
私事だけど金がないので優先度が欲しい

119:デフォルトの名無しさん
08/05/26 07:36:44
後者は原著がネット上で無料で読めるから前者

120:デフォルトの名無しさん
08/05/26 09:26:17
というか全然違う傾向のほんのどっちがいいか聞かれても…
しかもHaskellには関係ない
推薦図書スレは別にあるよ


121:デフォルトの名無しさん
08/05/26 14:08:03
こっちでいいかと
スレリンク(informatics板)

122:36 ◆K0BqlCB3.k
08/05/26 15:31:05
全く調べずに聞くが、concurrent arrowなんてのは無いの?
arrow使ってていつも思うんだが、並列処理に向いてなくない?
FPGAとかのHDL記述とかに応用したりしてる人いないの?

123:デフォルトの名無しさん
08/05/26 22:01:15
>>117
若いうちに読んどいた方がいいのは計算理論の基礎 の方だろ。
計算機プログラムの構造と解釈は仕事で必要になってからで十分。

124:デフォルトの名無しさん
08/05/26 22:17:09
>>123
独学でやってしまった奴は
次何すればいいの?
とりあえず今自習でλの数学側の
側面勉強してみているが
何の役に立つかわからん

125:デフォルトの名無しさん
08/05/26 22:24:27
絵を描いて学ぶ・プログラマのためのラムダ計算
URLリンク(d.hatena.ne.jp)

126:デフォルトの名無しさん
08/05/26 22:27:23
僕が「ラムダ計算は知っておいたほうがいい」と思う理由は、形式的計算体系としての“純粋ラムダ計算”が理論的に重要だから、というだけではありません。
むしろ、次に述べるようなことがより大きな動機となります。
まず、関数を表現する方法としてのラムダ記法(lambda notation)に慣れて、紙と鉛筆によるインフォーマルなラムダ計算が出来ると、
けっこうそれを使える場面が多いのです。例えば、「JavaScriptによるテンプレート・モナド、すっげー簡単!」の最後で、モナド法則を示すために、
インフォーマルなラムダ計算を使っています。
ある種の計算的実体(例:クロージャ)や計算手法(例:継続ベースの計算)の説明にもラムダ式がよく使われます。
式言語(EL; expression language)に対する処理系(パーザーやエバリュエータ)を作る場合なども、ラムダ計算が良いヒントになるでしょう。
もちろんラムダ計算は、既存の関数型言語を理解する基盤となります。あるいは、新しいプログラミング言語を設計する際にもラムダ計算が規範になるかも知れません。

127:デフォルトの名無しさん
08/05/26 22:45:04
そもそも計算とはいったいなんなんだ?


128:デフォルトの名無しさん
08/05/26 23:36:50
後者関数ってなんだぉ?

129:デフォルトの名無しさん
08/05/27 00:14:01
やっぱ手書きしねーと理解できねーよw


130:デフォルトの名無しさん
08/05/27 07:23:35
data type Nat = O | S Nat
という定義で自然数(0以上の整数)が表現できる。(ペアノの公理を満たす)
このとき S のことを後者関数(successor function)と呼ぶ。

131:デフォルトの名無しさん
08/05/27 11:39:43
ここで
定義に再帰を使っていいんですか?
とか聞くとYコンビネータとか出てきちゃうんだろうか

132:デフォルトの名無しさん
08/05/27 16:49:17
質問です

yampaっていったい何ですか?
ごく簡単に馬鹿でもわかるように概要を説明してください

133:デフォルトの名無しさん
08/05/27 19:16:35
>>132
URLリンク(d.hatena.ne.jp)
なんかどうよ。

134:デフォルトの名無しさん
08/05/27 20:06:04
>>132
URLリンク(ll.jus.or.jp)
5ページ目
Haskell による Arrowised Functional Reactive
Programming という実装


135:デフォルトの名無しさん
08/05/27 22:54:50
Yampaってコンパみたいなもん?

136:デフォルトの名無しさん
08/05/28 07:20:03
>>127N.D.Jones, Computability and Complexity
その他良本情報はこちら
URLリンク(www.kurims.kyoto-u.ac.jp)


137:デフォルトの名無しさん
08/05/31 11:55:19
「The Haskell School of Expression」で使われているコードの
ファイルってどこかに落ちてませんかね。

138:デフォルトの名無しさん
08/05/31 13:59:28
>>137
URLリンク(www.haskell.org)

139:デフォルトの名無しさん
08/05/31 14:22:28
>>138
あ、これってグラフィックライブラリだけじゃなくて、本のコードも
入ってるのか。勘違いしてた。ありがとう。

140:デフォルトの名無しさん
08/05/31 20:44:19
comb :: Maybe a -> (a -> Maybe b) -> Maybe b

このときの

Maybe a -> (a -> Maybe b) ここまでが入力だよね?
2項目の引数が関数になっているって解釈でいいんだよね?

141:デフォルトの名無しさん
08/05/31 21:04:28
うん

142:デフォルトの名無しさん
08/05/31 21:41:20
違うだろw

入力 : Maybe a
出力 : (a -> Maybe b) -> Maybe b

143:デフォルトの名無しさん
08/05/31 21:51:45
()でくくるとどうなるのw?

144:デフォルトの名無しさん
08/05/31 21:52:57
>>142
同じことじゃねーか
関数を返す関数と二引数の関数を同一視するのはHaskellでは普通の習慣

145:デフォルトの名無しさん
08/05/31 22:22:38
>>143
a -> Maybe b
っていう関数を引数にとるっていうことだよ

146:初心者修業中
08/05/31 22:30:19
>>140
Maybe a -> (a -> Maybe b) の2つを入力とする事もできるし、
Maybe a だけを入力とする事もできる。

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

…と認識しています。


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

Haskellはグラフ簡約によって1度に1つのTermを解釈していくだけ
なので、最終的な結果は高々1つになるはずだと思っていたのですが
どうやら違うようで混乱してきました。困った、不勉強だ困った


148:デフォルトの名無しさん
08/05/31 22:38:00
>>143
右結合の二項演算子?である「->」の結合順序をデフォルトから変更している。

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

A -> (B -> C) -> D
は、
A -> ((B -> C) -> D)
と解釈される。

149:デフォルトの名無しさん
08/05/31 22:39:34
>>147
>どうやら上の人曰く間違っているようで
間違ってないよ

150:デフォルトの名無しさん
08/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型の値を返す関数の「型」
という出発点に戻るべきかな。

151:デフォルトの名無しさん
08/05/31 22:56:33
>>142が突っ込んでるのは

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

の部分。

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

こっちは合ってる。

152:デフォルトの名無しさん
08/05/31 23:54:09
カリー化とは何か?を書いた方がいいんではないでしょうか。

↓ではお願いします。

153:デフォルトの名無しさん
08/05/31 23:58:34
この関数適用は出来損ないだ。食べられないよ。

154:初心者修業中
08/06/01 01:08:22
カリー化とは、
複数の引数を持つ関数を
引数一つの関数の組み合せとする事。

…と認識しています。

155:デフォルトの名無しさん
08/06/01 01:08:36
カリー化という言葉を見ると頭の中で
「カリンカカリンカ カリンカマヤ」という歌が繰り返されて止まらなくなる。

156:デフォルトの名無しさん
08/06/01 01:54:38
おれもそうりかいしてる。<154
でも、カリー化ときいてターメリックをぶっかけてるイメージしかないw

157:デフォルトの名無しさん
08/06/01 09:01:04
ガラムマサラとかも入れた方がいいのでは?

158:デフォルトの名無しさん
08/06/01 10:27:15
エバラ化、桃屋化

159:デフォルトの名無しさん
08/06/01 10:28:14
味の素化

160:デフォルトの名無しさん
08/06/01 10:59:26
>>140
  A -> (B -> C)
というふうに切り出してしまったけど、これは本来の
  A → ((B → C) → D)
という結合関係を無視してる(「A -> (B -> C)」という型を扱うみたいに書いている)。
ってのが>>142でしょ。

カリー化の影響として、「複数の引数をとる」
  (A × (B → C)) → D
ことと、「関数を返す」ことの、どちらに主眼があるかが不明瞭になるってのがあると思うね。

161:デフォルトの名無しさん
08/06/01 11:24:29
>>151>>160
その理屈は分かるんだが、カリー化を理解してるのか怪しい初心者に対して
混乱させるようなことを言うのは不親切だと思う
Maybe aと(a -> Maybe b)の二つが引数になっているという理解で正しい、と教えれば十分じゃないか

162:デフォルトの名無しさん
08/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))


163:デフォルトの名無しさん
08/06/01 11:48:09
> Maybe a -> (a -> Maybe b) ここまでが入力だよね?

「ここまでが引数リストに対応する部分だよね?」と読むと○
「ここまでが引数の型だよね?」と読むと× ← ちょっと窮屈な解釈かも、みたいな空気

164:デフォルトの名無しさん
08/06/01 15:19:49
> Maybe a -> (a -> Maybe b) -> ここまでが入力だよね?

と書けばおk

165:デフォルトの名無しさん
08/06/01 17:10:16
なるほどw

166:デフォルトの名無しさん
08/06/01 23:06:52
複数引数の邪悪な関数をこらしめるのがカリー化です。

167:デフォルトの名無しさん
08/06/01 23:33:45
それだけならタプルで渡せばいいだけじゃそ

168:デフォルトの名無しさん
08/06/01 23:44:14

=>

これがよくわからん


169:デフォルトの名無しさん
08/06/01 23:47:32
<コ:彡

170:デフォルトの名無しさん
08/06/02 00:31:27
兄者…

171:初心者修業中
08/06/02 01:36:10
>>168
:は、リストの先頭に要素を結合する演算子

=>の左辺(文脈)は、
多相的なデータを静的型チェックするために
コンパイラに与える条件


…と認識しています。

172:OCamler
08/06/03 22:55:07
だれかもうちょっと正しいコメントを付けてやってください。お願いします。



173:デフォルトの名無しさん
08/06/04 01:51:13
[1, 2, 3] ← ふつうの見やすい表記(ただし、本来のデータ構造が見えない)
1 : [2, 3]
1 : 2 : [3]
1 : 2 : 3 : [] ← 本来のデータ構築子 (:)(cons)、[](nil)で書く(ただし、いまいちリストに見えない)
1 : (2 : (3 : [])) ← 右結合性にたよらないで書く
(:) 1 ((:) 2 ((:) 3 [])) ← 演算子としての表記法をやめる(S式マゾ以外には読みにくい)

174:初心者修業中
08/06/04 01:51:20
お願いします m(_ _)m

175:デフォルトの名無しさん
08/06/04 03:18:52
Haskell実用経験皆無の俺が来ましたよ

>>168
4.1 Overview of Types and Classes
> but the type system has been extended with type classes (or just classes)
> that provide a structured way to introduce overloaded functions.

型クラスの存在意義がわかるかどうかだと思う。

整数の足し算と有理数の足し算って、ふつう同じ記号を使うけど、
計算の内容は違う(多重定義、オーバーロードされている)でしょ。
でも、共通の性質を考えたいときもある。
そのとき、ただ「共通の演算記号+を使っているから同類とみなす」では話にならないから、

twice :: a -> a
twice x = x + x -- 2倍したいけど、+の型などがコンパイル時に不明

+を「Numという型クラスの特徴」として整理して、整数や有理数はその特徴を共有している、とみなすと。

twice :: Num a => a -> a -- 「型aはクラスNumに属する(Numのインスタンスである)」という前提をする
twice x = x + x -- と、演算子+の存在と型が保証される

そんな感じ?(ごめん、確認してない)

176:デフォルトの名無しさん
08/06/04 07:01:52
改めて見るとオーバーロードの解釈が破綻してるなw
すまぬ

177:デフォルトの名無しさん
08/06/05 00:09:02
=>
C++のテンプレートの特殊化みたいなものか
演算子は定義されているけど特定の型じゃないと
処理できない場合、特定のの変数を特殊化すること
あるけど

178:初心者修業中
08/06/05 00:54:30
>>177
日本語でお願いしますm(_ _)m

179:デフォルトの名無しさん
08/06/05 08:24:10
Haskellian ももうブランドではなくなりましたね…
メジャーになった証か


180:デフォルトの名無しさん
08/06/05 08:41:12
=> の意味は総称型に制限を与える、じゃだめなのかなぁ。

質問、というより興味本位のアンケート。
あなたが思うhaskellの面白いところってどこですか?

181:デフォルトの名無しさん
08/06/05 09:05:56
アホな質問するスレがあるところ

182:デフォルトの名無しさん
08/06/05 16:59:32
堅い言語なのに簡潔に書けるようになってるところが面白いと思うし、すごく好きだ
記号を多用してたり、インデントを使ってたり

183:デフォルトの名無しさん
08/06/05 18:54:01
「haskell使ってる」と言うと、みんなに尊敬して貰えること

184:デフォルトの名無しさん
08/06/05 19:19:05
>>180
高速化を考え出すと、すごくたいへんなところ。

185:デフォルトの名無しさん
08/06/05 21:02:04
[(x,y) | x + y = 10]

186:デフォルトの名無しさん
08/06/05 21:59:49
>>183
このスレ見てたらそう思えんわな、、、


187:デフォルトの名無しさん
08/06/05 22:55:55
知らない人は知らないし、知ってる人はわかるもんな
しかしいい言語だ

188:デフォルトの名無しさん
08/06/05 23:02:27
汎関数系の言語はC++もそうだが、
かなり野心的な言語設計になるね。
クラス囲い込み度が低いからだろうか。

189:デフォルトの名無しさん
08/06/05 23:56:07
>>185
そんなのできたの!?と思って ghci で試したらできなかった。
ちょっと悲しくなった。

190:デフォルトの名無しさん
08/06/06 00:00:22
インデントがよくわからなくて
エラーでていらつく
なんとかならんのかね?この糞言語
インデント制約糞なら最初からなんか
そういう機能入れろよなぁ

あーあー世界で最悪の糞言語だね
インデントのせいだけで

191:デフォルトの名無しさん
08/06/06 00:12:41
>>190
そういう説もあります。
そうでないという説もあります。

192:デフォルトの名無しさん
08/06/06 00:29:14
インデントがいやなら { } と ; で全部区切ればいいじゃん
一緒だよ

193:デフォルトの名無しさん
08/06/06 00:37:44
traceの使い方qsortのサンプル使って
教えてくれませんか?

qsort _ [] = [] (1)
qsort f (x:xs) = before ++ (x : after) (2)
where before = qsort f (filter (not . (f x)) xs) (3)
after = qsort f (filter (f x) xs) (4)


どこにいれればいいのやらw

194:デフォルトの名無しさん
08/06/06 03:41:00
それを見つけるのにもtraceが役立つのではないか

195:初心者修業中
08/06/06 05:35:07
>>193
私はまだtraceに手を出すつもりはありませんが、
ググってみました。

参考になるでしょうか…?

第15回 Haskellでのデバッグのコツをつかむ
URLリンク(itpro.nikkeibp.co.jp)
import Debug.Trace
quicksort[] = []
quicksort(x:xs) =
 trace ("x." ++ show x) $
 trace ("x." ++ show x ++ " > y." ++ show losort) $
 trace ("x." ++ show x ++ " <= y." ++ show hisort) $
 losort ++ [x] ++ hisort
   where
   losort = quicksort [y|y <- xs, y < x]
   hisort = quicksort [y|y <- xs, y >= x]

Main> quicksort [3,2..1]
x.3
x.2
x.1
x.1 > y.[]
x.1 <= y.[]
x.2 > y.[1]
x.2 <= y.[]
x.3 > y.[1,2]
x.3 <= y.[]
[1,2,3]

196:デフォルトの名無しさん
08/06/06 07:41:25
[(x,y) | x <- [1..], y <- [1..], x+y = 10]

197:初心者修業中
08/06/06 08:06:28
>>196
これ、やってみたけど止まりませんね…。

*Main> take 10 [(x,y)|x<-[0..],y<-[0..],(x+y)==10]
[(0,10)

x=0 のままyの無限リストを検索してるから当たり前ですけど…

*Main> take 10 [(x,y)|x<-[0..],y<-[0..]]
[(0,0),(0,1),(0,2),(0,3),(0,4),(0,5),(0,6),(0,7),(0,8),(0,9)]

↓みたいなリストを返す簡単な方法ありますかね…?
[(0,0),(1,0),(0,1),(2,0),(1,1),(0,2).....]



198:初心者修業中
08/06/06 08:42:12
こんなもんかな…

tlist::[(Int,Int)]
tlist = concatMap (\n ->f n) [0..]
 where f = \n->take (n+1) $ iterate (\(x,y) ->(x-1,y+1)) (n,0)

*Main> take 10 tlist
[(0,0),(1,0),(0,1),(2,0),(1,1),(0,2),(3,0),(2,1),(1,2),(0,3)]

*Main> take 10 [(x,y)| (x,y)<-tlist, (x+y)==10]
[(10,0),(9,1),(8,2),(7,3),(6,4),(5,5),(4,6),(3,7),(2,8),(1,9)]

199:デフォルトの名無しさん
08/06/06 08:43:25
つまらない答えだが

[(x,y) | k <- [0..], x <- [0..k], y <- [0..k], x + y == k]


200:デフォルトの名無しさん
08/06/06 08:52:37
つまらないのならこれが一番
[(x, 10-x) | x <- [0..10]]

201:デフォルトの名無しさん
08/06/06 08:54:12
>>199
間違ってるやん!

202:デフォルトの名無しさん
08/06/06 09:51:55
[(a,b) | x <- [0..], y <- [0..x], x + y == 10, (a,b) <- [(x,y), (y,x)]]
こんなんできたっけ

203:デフォルトの名無しさん
08/06/06 09:52:48
なんだ(a,b)って t <- [(x,y), (y,x)]

204:デフォルトの名無しさん
08/06/06 10:16:24
>>190
Pythonに見られるインデントによる制御構造の是非
スレリンク(tech板)l50

205:初心者修業中
08/06/06 14:27:09
>>202-203

なるほど、そういう事もできるのですね。

*Main> take 12 [t | x <- [0..], y <- [0..x], (x+y)==10, t<-[(x,y),(y,x)]]
[(5,5),(5,5),(6,4),(4,6),(7,3),(3,7),(8,2),(2,8),(9,1),(1,9),(10,0),(0,10)]

リストモナドの>>=はconcatMapでしたもんね。
勉強になります。

(5,5),(5,5)がだぶってるのが、おしいですね。

206:デフォルトの名無しさん
08/06/06 15:16:52
GHC 6.8.3 まだー?

207:デフォルトの名無しさん
08/06/06 18:05:51
>>206
作って公開してくれ。

208:デフォルトの名無しさん
08/06/07 00:31:44
無明関数って何がうれしいの?

209:デフォルトの名無しさん
08/06/07 00:52:24
いちいち関数の名前考えなくても良い
名前をつけるまでもない単純な関数を作る時に便利

210:デフォルトの名無しさん
08/06/07 01:08:37
名前を付けることは名前空間を汚染すると言うこと
名前よりも式そのもののほうが理解しやすい場合もある

211:デフォルトの名無しさん
08/06/07 01:24:35
getChar >>= \a -> getChar >>= \b -> putChar b >> putChar a
こういうのに名前つけるのはいやだな

212:デフォルトの名無しさん
08/06/07 02:04:23
>>208
そういう話題は関数型言語スレのほうが向いている。
関数型言語一般について語れるよ。

213:デフォルトの名無しさん
08/06/07 02:12:55
>>208
どんなバックグラウンドをもってる?関数型言語についての経験は?
手続き型の国の人ならば、わかりにくいところやね。
関数を変数でもたすってのは関数型では日常茶飯事なんですわ。
そこに便利さのヒントがアルよ。

214:デフォルトの名無しさん
08/06/07 07:57:49
map (\(a, b) -> a+b) [(1,1), (2, 3) ..]

215:デフォルトの名無しさん
08/06/07 10:56:31
>>213
手続きの国からワープしてきたのですが
関数を変数にするならポインタ渡せばよくないですか?

そうすれば、定義しても渡せますよね?

216:デフォルトの名無しさん
08/06/07 11:20:46
名前があってもなくてもポインタ渡すのです

関数オブジェクトは、メソッドがひとつしかないクラスのインスタンス、に似ています
インスタンスに名前がついているとは限らないのです

217:デフォルトの名無しさん
08/06/07 11:33:06
>>216
よくわからないぉ
もう少し詳しく説明してぉ?

218:デフォルトの名無しさん
08/06/07 11:43:32
無明関数…悟りでも得たいのか?


219:デフォルトの名無しさん
08/06/07 11:46:43
>>218
間違えただけだぉ気にしないで

220:デフォルトの名無しさん
08/06/07 11:47:44
>>218
悟りは得るものではなく開くものです。

221:デフォルトの名無しさん
08/06/07 12:06:14
名前を考えるのが面倒くさい
再利用しない
定義している箇所を探すのが面倒くさい
関数内部の処理が簡潔

のときは無名関数使いたくならないか?

222:デフォルトの名無しさん
08/06/07 12:14:34
つーか、関数本体そのものずばりを一覧できる状態で渡しているのにわざわざ名前をつける必要があるのだろうか

223:デフォルトの名無しさん
08/06/07 12:28:02
カリー化
(new Satori(x)).open(y)

224:デフォルトの名無しさん
08/06/07 12:43:21
無名関数で再帰するにはどうすればいいですか
たとえば、
f n = if n == 1 then 1 else n * f (n-1)
はどのように書けばいいですか?

225:デフォルトの名無しさん
08/06/07 12:46:45
fix (\f n -> if n == 1 then 1 else n * f (n-1))
むみょーん。Haskellian じゃないから fix があるかどうかシラネ



次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

5212日前に更新/225 KB
担当:undef