12/10/17 08:08:28.97
haskell.org
URLリンク(www.haskell.org)
日本語サイト
URLリンク(www.sampou.org)
URLリンク(www.shido.info)
過去ログ
関数型プログラミング言語Haskell
Part1 URLリンク(pc.2ch.net)
Part2 スレリンク(tech板)
Part3 スレリンク(tech板)
Part4 スレリンク(tech板)
Part5 スレリンク(tech板)
Part6 スレリンク(tech板)
Part7 スレリンク(tech板)
Part8 スレリンク(tech板)
Part9 スレリンク(tech板)
Part10 スレリンク(tech板)
Part11 スレリンク(tech板)
Part12 スレリンク(tech板)
Part13 スレリンク(tech板)
Part14 スレリンク(tech板)
Part15 スレリンク(tech板)
Part16 スレリンク(tech板)
Part17 スレリンク(tech板)
Part18 スレリンク(tech板)
Part19 スレリンク(tech板)
2:デフォルトの名無しさん
12/10/17 08:11:20.84
関連書籍
・Introduction to Functional Programming Using Haskell (2nd ed.)
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リンク(www.amazon.co.jp)
・ふつうのHaskellプログラミング
URLリンク(item.rakuten.co.jp)
・Programming in Haskell
URLリンク(www.amazon.co.jp)
・Real World Haskell
URLリンク(www.amazon.co.jp)
・関数プログラミングの楽しみ
URLリンク(www.amazon.co.jp)
・すごいHaskellたのしく学ぼう!
URLリンク(www.amazon.co.jp)
3:デフォルトの名無しさん
12/10/17 08:14:16.68
関連リンク
・GHC Wiki
URLリンク(hackage.haskell.org)
・A History of Haskell
URLリンク(research.microsoft.com)
・関数型関連の用語集
URLリンク(sky.zero.ad.jp)
・本物のプログラマはHaskellを使う
URLリンク(itpro.nikkeibp.co.jp)
・Haskell API search Engine
URLリンク(www.haskell.org)
【簡単な使い方】
1.検索バーに関数名を入れて検索
例 map
2.検索バーに型名を入れて検索
例 (a -> b) -> [a] -> [b]
・Real World Haskell
URLリンク(book.realworldhaskell.org)
・Learn You a Haskell for Great Good!
URLリンク(learnyouahaskell.com)
4:デフォルトの名無しさん
12/10/17 08:32:15.59
おつ
5:デフォルトの名無しさん
12/10/17 09:31:32.10
前スレの流れで一言。
関数型の考え方はExcelのおかげで充分社会に浸透していると思う。
Excelシートを使って統計や簡単な計算が出来る人は大勢いるが、同じことを
同じような時間で手続き型言語で出来る人が同程度いるとは思えない。
よって、前スレの>>988に同意
6:デフォルトの名無しさん
12/10/17 09:54:00.21
>>5
>>988には同意だが、年寄り向きではないね。記号を使い過ぎで忘れてしまう。
Smalltalk や Prolog とはちょっと違う。
7:デフォルトの名無しさん
12/10/17 11:34:17.99
■ C
for( const char *s="12345"; *s; ++s ) if( '2'<*s&&*s<'5' ) printf( "%d", (*s-'0')*2 );
■ JavaScript
console.log([1,2,3,4,5].filter(function (i){ return i > 2 && i < 5 ; }).map(function(i){ return 2 * i; }));
■ Python
print(map(lambda x: x*2, filter(lambda x: x>2 and x<5, [1,2,3,4,5])))
■ Ruby
puts [1,2,3,4,5].select{|i| i > 2 and i < 5}.map{|i| i*2}
■ C#
new{}{ 1,2,3,4,5 }.Where(x => 2 < x && x < 5).Select(x => x*2);
■ Common Lisp
(print (loop for x in '(1 2 3 4 5) if (< 2 x 5) collect (* x 2)))
■ Haskell
print [x*2| x <-[1,2,3,4,5], x > 2, x < 5]
■ Perl
print map {$_*$_} grep {2<$_ and $_<5} 1..5;
■ Mathematica
{1,2,3,4,5}~Select~(2<#<5&) 2
■ MATLAB
x=[1 2 3 4 5]; x(2<x&x<5).*2
■ Scheme
(print (list-ec (: x 1 6) (if (< 2 x)) (if (< x 5)) (* x 2)))
■ Clojure
(for [x (range 1 6) :when (and (> x 2) (< x 5))] (* 2 x))
8:デフォルトの名無しさん
12/10/17 11:36:23.05
てか、プログラミング学ぶときって、そんなに学校の勉強や日常生活のアナロジーで考えるかなあ
たしかにそういう入門書は多いけどさ
9:デフォルトの名無しさん
12/10/17 13:03:44.79
それより学校の国語はふつうに宣言的だし日常で使う言葉も宣言的
宣言的な考え方は認識や言葉の基本。身近すぎて>>990が気づいてないだけでは
10:デフォルトの名無しさん
12/10/17 18:04:45.34
宣言的、の意味を理解してないのかも
11:デフォルトの名無しさん
12/10/17 19:13:00.41
c#だと
Enumrator.Range(1,5).Where(x => 2 < x && x < 5).Select(x => x*2);
だよ。
1から5までぐらいだったら文字数増えちゃうけどね。
12:デフォルトの名無しさん
12/10/17 20:39:30.53
>>8
アナロジーで考えるという事ではなく、染みついた思考法・問題解決法
13:デフォルトの名無しさん
12/10/17 21:09:16.38
>>9
宣言的の意味が違う。
出くわした問題や課題を解決しようとする時に、
素直に頭に思い浮かぶ解決方法としての宣言的な考え方の話。
問題や周辺環境を宣言的に表現して解を導く子どもはあまりいない。
たいていの子は問題解決への(直接の)手続き・手順を考える。
14:デフォルトの名無しさん
12/10/17 22:58:27.86
新スレおめでとうございます:(;゙゚'ω゚'):
15:デフォルトの名無しさん
12/10/18 00:05:08.05
>>13
えーそんなことないでしょ。推論は宣言的な方法で問題解決してるじゃない
解決方法としての宣言的な考え方が日常的でないなんていうのはおかしい
16:デフォルトの名無しさん
12/10/18 00:56:42.35
後出しの独自定義の相手すんなよ
「関数型言語は自然な人間の思考に反する」とか言うために
子供がどう考えるかとか話を拡げて泥沼化したいだけだろ
変な脳科学みたいに
17:デフォルトの名無しさん
12/10/18 04:28:28.67
茂木は今関係ないだろ!
18:デフォルトの名無しさん
12/10/18 04:31:04.26
宣言的ってMakefileのトップレベルの部分書くときみたいなのですか?
19:デフォルトの名無しさん
12/10/18 07:53:24.86
>>16
「関数型言語は自然な人間の思考に反する」と言ったことは一度もない。
人間の思考は柔軟なので、訓練すれば誰でも色々な考え方が自然にできるようになる。
先のは問題や課題を解決しようとする時、かつ、子どもの話だ。
子どもは思考をする訓練をまだそれほど受けない。
大人に向けて成長していくうちに、授業や生活の中で自然に
宣言的な考え方をする訓練を徐々に受ける。
(教師側も宣言的な考え方を学ばせようと意図しているわけではない)
社会人になる頃には、たいていは宣言的な考え方も、
手続き的な考え方もやろうと思えば普通にできるようになってる。
しかし、意識してやっているわけではないので、
そのままでは Haskell でプログラムするのにたいして役には立たない。
問題や環境を意識して宣言的にとらえたり翻訳する練習を重ねないと、
プログラムは難しい。
ただ、考え方自体はすでに慣れているので、
宣言的な記述を見たときにそれを解釈するのはそれほど苦ではない。
また、そのために、問題を宣言的にとらえるのも、
ある問題で合点がいけば他の問題もスルスルと合点がいく事も起こり得る。
Haskell を初めた頃は難しかったが、
ある日突然視界が開けたという経験をする人が多いのは、
そのことも少なからず関係しているのではないかと私は思う。
20:デフォルトの名無しさん
12/10/18 08:30:28.87
>>19
あなたが>>990なら、言っていることがずいぶん変わってるが。
21:デフォルトの名無しさん
12/10/18 10:17:49.42
Haskell である日突然視界が開けるようになるためには型システムを理解しないとね。
宣言的とか関係ないんじゃね?
22:デフォルトの名無しさん
12/10/18 12:43:21.69
>>21
型システムを理解しないとね、は自分も経験してるから簡単に同意できる。
宣言的とか関係ないんじゃね? は、根拠を示してくれ。
関係ないと感じた経験がないから、じゃね?と言われても
このままでは同意も反対もできん。
23:デフォルトの名無しさん
12/10/18 12:53:49.19
>>20
指摘はもっともだ。
>>990
> 静的な、宣言的な考え方なんて、手続き的な考え方に比べれば、
> 学校教育の現場でほとんど出くわすことはないだろう。
> たとえ出くわしても、意識しなければ素通りしていくだけで、身にならない。
これは言い過ぎた。
出くわすし、成長と供に授業の中でそれとなく訓練を受けてはいる。
しかし、いかんせん、そうだとは意識していないのだから、
そのままでは Haskell のプログラムをする事に関してはたいして役に立たない。
宣言的な考え方に触れた時にそれを理解できる体勢にはなるが、
そういう考え方を自分から進んでするまでには至らないだろう。
そして、自分から進んで宣言的に考える事に慣れなければ、
Haskell でのプログラムが C や Java より簡単とは思えないのではないだろうか。
自分で宣言的に考える事ができなければ
Haskell のプログラムはいつまで経ってもしっくりこないと思う。
24:デフォルトの名無しさん
12/10/18 14:21:05.06
三行以内にまとめろ
25:デフォルトの名無しさん
12/10/18 15:47:09.90
諸君、議論したまえ
26:デフォルトの名無しさん
12/10/18 16:01:15.25
>>24
今回の件では3行以内でレスするのは今の私には無理だ。
どうしても3行以内にしてほしいのなら、
もうレスをやめざるを得ない。
27:デフォルトの名無しさん
12/10/18 18:24:22.89
>>25
議題なに?
28:デフォルトの名無しさん
12/10/18 20:14:57.13
本日の議題: 「宣言的」とはどういう意味か
29:デフォルトの名無しさん
12/10/18 21:08:07.74
>>26
3行とか関係なしに、もうレスやめていいよ
30:デフォルトの名無しさん
12/10/18 21:39:11.88
>>29
了解した
31:デフォルトの名無しさん
12/10/18 21:49:12.21
やると言ったらやるのが宣言的
できるならやる、できないならやらない、は宣言的ではない
何ができるかよりも何をするべきかを重視する
32:デフォルトの名無しさん
12/10/18 21:57:13.27
たとえば連立方程式の解を求めよ、という問題に対して
どう解くのが宣言的なのよ?
33:デフォルトの名無しさん
12/10/18 22:04:42.11
>>32
宣言的には解けない
34:デフォルトの名無しさん
12/10/18 22:30:06.88
とにかく解いたと仮定する
矛盾するまで仮定するのをやめない
35:デフォルトの名無しさん
12/10/19 00:17:07.81
こういうのは宣言的っぽいと思うんだが、どう?
囲碁を例に極簡単に示すと
iterateF :: a -> [a -> a] -> [a]
iterateF = scanl (flip ($))
-- ゲームの進行状態とは、初期状態から交互に着手したものである
progressStatuses = iterateF initialStatus (cycle [blackMove, whiteMove])
-- 終局状態とは、ゲームの進行中に投了するか、着手できなくなるか、千日手になった時である
eventualStatus = find (isResigned || isFinished || isRepeated) progressStatuses
ほぼ自己説明的だから本当はコメントなんて要らんと思うが一応書いておいた。
***Status 系は今の盤の状態の他に、一つ前の盤の状態とか、
終局理由の情報も含まれてる代数データ型。
あと、ユーザー入力はどうすんの? とかいう話はとりあえず無し。
36:デフォルトの名無しさん
12/10/19 02:43:31.15
囲碁では千日手は簡単に作れる
これは宣言じゃなくて発見
37:デフォルトの名無しさん
12/10/19 05:07:03.70
…?
38:デフォルトの名無しさん
12/10/19 07:49:38.95
もしかしたら最新の GHC では取り除かれているかも知れませんが、
下記のようにパターンの中で簡単な計算をするのは
どういう名前の言語拡張でしたっけ?
f :: Int -> Int -> Int
f (n + 1) x = ・・・
39:デフォルトの名無しさん
12/10/19 08:05:08.19
宣言:その分野のプロでも知らない用語を定義する
発見:定義しなくてもそのうちわかる
40:デフォルトの名無しさん
12/10/19 08:43:31.84
>>34
つまり、アルゴリズムというものは、宣言的ではあり得ない?
41:デフォルトの名無しさん
12/10/19 10:07:40.36
例えば、宣言してもしなくてもアルゴリズムが存在する場合
それは宣言とは全く関係ないから宣言的ではない
黙っていても存在感があるものは宣言的ではない
言い続けなければ消えてしまいそうなものは宣言的
42:デフォルトの名無しさん
12/10/19 12:51:29.73
ワロタww
43:デフォルトの名無しさん
12/10/19 16:01:54.12
Haskellで実用的なもの作ってみろよ
ほかの言語でもできるから
44:デフォルトの名無しさん
12/10/19 16:09:48.32
>>40
「アルゴリズムとはチューリングマシンの計算表のことだと考えよう!」
45:デフォルトの名無しさん
12/10/19 18:14:26.77
宣言的っていうのやめて静的っていえばいいんじゃね
現に宣言的型とはいわないだろ 静的型だろ
46:デフォルトの名無しさん
12/10/19 18:50:18.22
終動負荷的な静的筋力トレーニング
47:デフォルトの名無しさん
12/10/19 19:02:30.34
今ここで議論の真似事をしている間だけの限定でいいから、
宣言的という言葉の意味をはっきり定義してくれ
じゃないとまじめな議論にならんだろ
48:デフォルトの名無しさん
12/10/19 19:32:35.75
A とは B のことだ。
というような文言の羅列になるのが宣言的なのでは。
49:デフォルトの名無しさん
12/10/19 20:21:24.49
オブジェクトなどの羅列ではなく文言の羅列なのか
50:デフォルトの名無しさん
12/10/19 20:25:54.43
>>49
この文脈で言うオブジェクトってなにを指す?
51:デフォルトの名無しさん
12/10/19 20:46:27.43
>>50
メモリ領域などを抽象化したものかな
52:デフォルトの名無しさん
12/10/19 20:49:32.89
メモリ領域などを抽象化ものの羅列って、意味が分からん
ちなみに、Haskell の変数は特定のメモリ領域に付けられたラベル(名前)じゃないよね
53:デフォルトの名無しさん
12/10/19 21:02:41.02
>第1の定義によれば、ある出力を得るにあたってそれを作成する方法ではなく、出力の性質を記述することを「宣言型」と称する。
>別の定義では、純粋関数型言語/論理プログラミング言語/制約プログラミング言語で書かれたプログラムを「宣言型」と称する。
54:デフォルトの名無しさん
12/10/19 21:04:29.55
>>52
そうだよね
特定したくないから抽象化したんだよね
55:デフォルトの名無しさん
12/10/19 21:10:43.86
>>54
特定したくないから抽象化したって、何か勘違いしてないか?
Haskell の変数は、値が格納されたメモリ領域に付けられたラベルではなく、
「値に付けられたラベル」だぞ。
let a = 17
というのは、17 という値の別名が a ということだ
56:デフォルトの名無しさん
12/10/19 21:17:19.21
>>53
これはPrologの簡単なプログラムですが、
URLリンク(nojiriko.asia)
A とは B のことだ。ではなく例えば、
1888とアテネは夏期オリンピック関係にある。
という文言に相当するものの羅列と見做すことができる。
これも全体として宣言的と言える。
57:デフォルトの名無しさん
12/10/19 21:19:42.83
>>55
特定の値ではなく抽象的な値にラベルをつけるよ
まだ値がわからない段階でもラベルをつける
58:デフォルトの名無しさん
12/10/19 21:21:39.22
おー、ごめん。
夏期オリンピック(1996,アテネ).
1988ではなくて、1996だった。さっきjavaの宿題スレにも
同じテーマのことを書き込んでその時点から勘違いをしていた。
59:58
12/10/19 21:23:52.62
さらに間違い。1996年ではなくて、1896年です。すみません。
60:デフォルトの名無しさん
12/10/19 21:32:04.79
>>52 は「変数は特定のメモリ領域に付けられたラベルではない」と言ってる
>>54 は「そうだよね}と同意し「特定したくないから抽象化したんだよね」と言ってる
>>54 の言う「特定したくない」というのは、メモリ領域を特定したくないから、
と読み取れないか?
61:デフォルトの名無しさん
12/10/19 21:39:35.17
もっとオリンピックに詳しい人に聞けばいいのに
プログラマーがオリンピックを宣言するのはなぜなのか
62:デフォルトの名無しさん
12/10/19 22:01:43.64
>>61 この問題の解答の一部を切り取っただけだから。
URLリンク(nojiriko.asia)
63:デフォルトの名無しさん
12/10/20 01:33:24.66
RWH 読んでて型構成子って何かと思ったら、型コンストラクタかよ。
64:デフォルトの名無しさん
12/10/20 08:13:40.39
>>38
n+kパターンはHaskell98の仕様にあったが、Haskell2010で取り除かれた。
GHCのフラグには (No)NPlusKPatterns がそれかね。
65:デフォルトの名無しさん
12/10/20 21:28:24.10
GHC 7.6.1 を使っています。
Graphics.UI.GLUT モジュールをインポートしたファイルを
ghci 上でロードするまではできました。
しかし、そのモジュール内の関数を評価しようとすると、
下記のエラーメッセージが出力されます(改行は適当に入れました)。
Loading package OpenGLRaw-1.2.0.0 ... linking ... <interactive>:
C:\Users\***\AppData\Roaming\cabal\OpenGLRaw-1.2.0.0\ghc-7.6.1\HSOpenGLRaw-1.2.0.0.o:
unknown symbol `__imp_wglGetProcAddress'
ghc.exe: unable to load package `OpenGLRaw-1.2.0.0'
ネット上で調べてみました。
同じような環境で同じエラーが出た方の書き込みがいくつかありましたが、
私が見た限りでは、解決策、あるいは解決に繋がるような情報はありませんでした。
このようなエラーに関して何か心当たりはないでしょうか。
ちなみに、ghc でのコンパイルは問題なく行われ、実行ファイルも起動できます。
ghci 上でのみ問題が起きます。
[環境]
Windows7 64bit
GHC 7.6.1
GLUT-2.3.0.0 パッケージ(他の依存パッケージも cabal で自動インストール)
glut-3.7.6-bin_x64(GLUT 本体)
[コマンド]
ghci -lglut32
66:デフォルトの名無しさん
12/10/20 23:57:24.35
単相性制限はその後どうなりましたか?
望まれない子の将来が気になります
67:デフォルトの名無しさん
12/10/21 00:16:08.21
>>64
ありがとうございます。
68:デフォルトの名無しさん
12/10/21 00:58:21.17
RWH、Maybe の箇所、唐突に Just 使って、しかも結局 Just の説明皆無かよ。
69:デフォルトの名無しさん
12/10/21 03:29:09.78
RWHって文章の構成悪いよね
説明なしにいきなり初出の単語が出てくるし話はあっちこっちに逸れまくり
Haskellとかコンピュータとかの枠に限らず一般的な書籍としてかなり悪いほうだと思う
70:デフォルトの名無しさん
12/10/21 09:04:40.35
でも他の書籍やネットで基礎をしっかり学んでおけば、
それほど苦にならないと思うが
71:デフォルトの名無しさん
12/10/21 10:15:13.08
これから学ぶ範囲の知識について他で学習しておかないと理解に苦しむような本だったら
学習のための本としての役割を果たしていないと思うけどね
72:デフォルトの名無しさん
12/10/21 10:44:10.30
「理解に苦しむ」って、今回の件ってそれほど大げさなことかな。
あれ? 何だろ? って思ったら、まずは調べてみればいいいじゃん。
Just なんてその本にしか載っていない特別に物でもないんだし。
他の本でもそういうの色々あるよ。
とくに説明もなく新しい単語や概念が出てくるのなんてしょっちゅうだ。
そんなところでいちいち躓いて憤ってたらきりがないよ。
それに改善点を指摘するなら、ここにじゃなくて、出版社や著者にでしょ。
73:デフォルトの名無しさん
12/10/21 11:07:04.27
Haskellを本格的に使いこなそうと思ったらRWHのレベルまでは知っておく必要があるからね
他の入門書はとりあえずHaskellを知る程度のものでしかない
RWHに代わるものが現れるまではとりあえず必要なものだ
74:デフォルトの名無しさん
12/10/21 16:13:17.47
GHC 7.6.1 って、もしかして32bitアプリは作れない?
75: [―{}@{}@{}-] デフォルトの名無しさん
12/10/21 16:58:14.86
>>66
何も変わってないよ。Haskell2010に入ってる
ただしGHC 7.8からghciではデフォルトで外されることになった
URLリンク(hackage.haskell.org)
76:デフォルトの名無しさん
12/10/23 18:13:04.53
>>75
遂に白河の清きに魚の住み兼ねて
元の濁りの田沼に戻るのですね!
77:デフォルトの名無しさん
12/10/23 18:37:19.71
MonomorphismRestrictionのどのへんに白河の清き要素があるのか気になる
78:デフォルトの名無しさん
12/10/24 04:47:19.04
どなたか! この中にMonomorphismRestrictionを擁護してくださる方はいらっしゃいませんか!?
79:デフォルトの名無しさん
12/10/24 18:37:32.62
型システムわからん
良かれと思って型宣言したらコンパイル通らなくなる
rigid type variable bound by 云々言い出して
俺の善意を踏みにじりやがる
80:デフォルトの名無しさん
12/10/24 19:00:08.28
>>79
どんなコードでそのエラーが出た?
そのエラーには「Could not deduce ~」というのもあった?
ちなみに型は、元々コンパイルが通っていたコードに
良かれと思って後から書き加えるものではないよ。
テスト駆動がまずテストを書くのと同じように、まず型を書くんだよ。
それから本体を「型に合わせて」書くんだ。
81:デフォルトの名無しさん
12/10/24 19:10:04.15
>>79
もしかしてローカル変数に多相型の宣言付けてエラーもらってる?
それなら、ローカル変数の型宣言の中では、外の型変数を(ScopedTypeVariable拡張なしでは)
使えないということを覚えておけばいいよ
82:デフォルトの名無しさん
12/10/24 19:12:00.93
>>80
>テスト駆動がまずテストを書くのと同じように、まず型を書くんだよ。
そんなの場合によるだろ。糞どうでもいい
83:デフォルトの名無しさん
12/10/24 19:14:58.53
>>82
どのような場合に先の型を書き、
どのような場合に後に型を書くと良いのでしょうか?
何か簡単な事例を挙げていただけると助かります。
84:デフォルトの名無しさん
12/10/24 19:17:54.50
どんな場合によるのか興味ある
85:デフォルトの名無しさん
12/10/24 19:25:28.55
じゃあ俺も興味ある
86:デフォルトの名無しさん
12/10/24 19:26:10.20
me too
87:デフォルトの名無しさん
12/10/24 19:38:04.48
母さんビール
88:デフォルトの名無しさん
12/10/24 19:52:22.72
>>87 ← 意味判らない
89:デフォルトの名無しさん
12/10/24 19:59:05.00
haskellには(式以外の)文がない・・・って嘘じゃね?
90:デフォルトの名無しさん
12/10/24 20:09:30.95
>>89
そう思う根拠は?
91:デフォルトの名無しさん
12/10/24 20:40:10.35
>>87
そう思う根拠は?
92:デフォルトの名無しさん
12/10/24 20:45:05.32
ifも式、letも式。ではwhereは式?
93:デフォルトの名無しさん
12/10/24 20:53:26.27
そもそも式以外の文がないってどこ情報よー
94:デフォルトの名無しさん
12/10/24 20:57:36.06
>>83
ただちに書かなくていいことは後で書く
テスト駆動も、制約に合わせて書くというより
関係ないコードを書かないことで間違いを減らしている気がする
95:デフォルトの名無しさん
12/10/24 21:04:30.70
>>83
好きにすればいいと思うけど、俺の基準を挙げるなら、
トップレベルの定義は先に思い付いた方から書く
・普通は型の方が簡単なので型から書くことが多い
-- | 標準正規分布に従う乱数を生成する
randomNormal :: StdGen -> (Double, StdGen)
・定義が頭にあるのに型がすぐに思い付かないor面倒なら定義から
forceTell x = rnf x `seq` tell x
forceTell :: (MonadWriter w m, NFData w) => w -> m ()
ローカル変数は定義から書く。型は必要なときだけ後から書く
96:デフォルトの名無しさん
12/10/24 21:06:43.98
>>92
そもそも、「式」とは何?
それをはっきり定義しないと、where が式なのかどうか判断できないだろ
97:デフォルトの名無しさん
12/10/24 21:10:37.15
Haskell Reportの言葉遣いに従うなら簡単
・whereは式じゃない。宣言やcase選択肢の一部
・Haskellに「文」は存在する。do式の中に並んでいるのがそれ
98:デフォルトの名無しさん
12/10/24 21:14:38.02
俺はグローバルでもローカルでも型から先に考えるな。
書くかどうかは気分(ローカルで型推論がうまく働かなきゃ書く)。
>>80 の型から先に書くというのは、そういう意味で俺は無意識に拡大解釈したけど、
例に出したテスト駆動の方は実際に書かなきゃ意味ないなぁ、どうなんだろ。
(テスト駆動の方も、コードの内容よりテストから先に「考える」と言えばそうだろうが)
99:デフォルトの名無しさん
12/10/24 22:07:48.31
where は節
SQLなら
100:デフォルトの名無しさん
12/10/24 23:39:27.46
tail は確かに List にも Vector にもあるから Ambiguous かも知らんけどさ
渡してるのが Vector なんだから Vector の方の tail だって推測してくれても良いんじゃないの?
分からず屋!
101:デフォルトの名無しさん
12/10/26 07:50:23.40
実行時間計測用コマンド作ってみた
良かったら使ってください
(ネットで都合良く使えそうな関数見つけて、Cで良いのに意地になって作っちゃった)
import Data.Time
import System.Process
import System.Environment
import System.IO
main = getCurrentTime >>=
(\start -> getArgs >>=
(\commands ->
runInteractiveProcess (head commands) (tail commands) Nothing Nothing >>=
(\(_,stdout,_,_) -> hGetContents stdout >>= putStrLn >>
getCurrentTime >>=
(\end -> print $ diffUTCTime end start))))
102:デフォルトの名無しさん
12/10/26 16:32:06.34
日記
103:デフォルトの名無しさん
12/10/26 18:12:19.85
>>100
その機能をうまく(型推論の便利さをあまり犠牲にしないで)実装できたらすごい
俺は尊敬するし、論文も書ける
104:デフォルトの名無しさん
12/10/26 18:48:34.11
MSがはやく Visual Haskel/CLI 出してくれればいいのに
105:デフォルトの名無しさん
12/10/26 18:55:32.06
関数型はF#とpythonが既にあるからねぇ。
106:デフォルトの名無しさん
12/10/27 00:05:49.70
MSRにGHCメイン開発者いるけど学者としての活躍が使命でMS製品に反映させなくていい人たちだったとおもうので、
IronPythonみたいに外部か開発部署に物好きがいないとむずかしいかもね。
どちらかというとF#の人たちがどういうポジションなのか気になる。
107:デフォルトの名無しさん
12/10/27 08:22:56.10
これ、買いですか?
関数プログラミング入門 Haskellで学ぶ原理と技法|Ohmsha
URLリンク(ssl.ohmsha.co.jp)
108:デフォルトの名無しさん
12/10/27 15:32:25.90
>>103
どうしてだよ!
手続き型言語によくあるオーバーロードだろ
できないのかよ!
109:デフォルトの名無しさん
12/10/27 15:51:33.66
>>107
特徴
・コンピュータサイエンスっぽいノリ。関数型プログラミングを
数学の一分野として位置づけて証明をつけたりするような議論がある。
副題に「原理と技法」とあるのは適切だと思う。Haskellってリスト内包表記で
無限リストがあっさり扱えたりする反面、自分が書いたコードが本当に効率が良いのか
わかりにくいところがある。この本では、コードの効率を手で分析してみせてる箇所があり、
そのような議論を丁寧に追って自らの血肉にできれば有益だと思われる。
・モナドの説明は想像していたよりあっさりしていた。
コンピュータサイエンス寄りの本とは言え、突如領域理論や圏論で読者を打ちのめす心配は一切ない。
・Haskellという言語自体の入門書にもなっているが、この本をHaskell入門書として紹介するのは
SICPをScheme入門書として紹介するのと同じぐらいには間違っていると思う。
・すでに訳出されている fun of programming (関数プログラミングの楽しみ) はこのBirdの本の
「続編」という位置づけであり、その本の中でIFPHでは~のような言及がしばしばあるので
「関数プログラミングの楽しみ」を楽しむためにはこの本も持っていたほうが良い。
まとめ
「関数プログラミング入門 Haskellで学ぶ原理と技法」はHaskellをとりあえず使ってみたいという
人には向かない。そのような向きには「すごいHaskell~」を勧める。この本は、ある程度Haskellで
自分が書きたい関数を書けるようになり、効率の問題に直面しはじめた人にこそ向いていると思う。
どのようにデータ構造を工夫し、アルゴリズムを解析し、改良するかについての実例が載っており、
これらの技法を身につければ --- 簡単ではないだろうが --- より整然とした、そして効率の良い
Haskellコーディングができるようになるだろう。
110:デフォルトの名無しさん
12/10/27 17:00:48.36
自分もその本、気になってた。くわしい解説ありがとう!
「関数プログラミングの楽しみ」の前に読むといいのか、なるほど
111:デフォルトの名無しさん
12/10/27 17:04:25.82
以前原著買おうとしたけどいいお値段しててやめちゃったな
オーム社さんいい仕事してくれるぜまったく
112:デフォルトの名無しさん
12/10/27 17:07:22.18
大武者
113:デフォルトの名無しさん
12/10/27 17:11:44.56
pdfで出してくれー
114:デフォルトの名無しさん
12/10/27 17:28:23.24
URLリンク(tanakh.jp)
すごい本のPRスライドがあった。
115:デフォルトの名無しさん
12/10/27 17:32:35.34
みんなhaskellでなにかいてるの?
116:デフォルトの名無しさん
12/10/27 17:49:22.15
続編を買って読んでいて、前編を欲してる人に是非おすすめ、という感じか
117:デフォルトの名無しさん
12/10/27 18:24:16.32
なんせ「関数プログラミングの楽しみ」ではモナドの話はIFPHの11章を見てもらうことにしてここではArrowの説明するぜ!
というノリだからね。
続編というか、IFPHを前提というかそういう感じかな。
118:デフォルトの名無しさん
12/10/27 18:31:34.04
こういう本ってすぐ絶版になったりするから
すぐ読まないにしても確保しといたほうが良さそうだな
119:デフォルトの名無しさん
12/10/27 20:24:43.91
>>118
そsそうなの!?
関数プログラミングの楽しみとセットですぐ買おうかな
120:デフォルトの名無しさん
12/10/27 20:53:45.01
ghc 7.6.1 で foreign import stdcall 使うと警告が出る。
the 'stdcall' calling convention is unsupported on this platform,
treating as ccall
これはどういう事?
ccall が実際にどういう規約なのかよく分からんけど、
もし ccall == cdecl なら、ccall /= stdcall だよね。
121:デフォルトの名無しさん
12/10/27 21:00:58.85
>>107って目次を見ると、どっかで読んだような話ばっかだよな
もうこの手の本はお腹いっぱいだわ
122:デフォルトの名無しさん
12/10/27 22:57:24.33
>>120
これじゃね
> When compiling for the x64 architecture in a Windows context (whether using
> Microsoft or non-Microsoft tools), there is only one calling convention ? the
> one described here, so that stdcall, thiscall, cdecl, fastcall, etc., are now all one and the same.
URLリンク(en.wikipedia.org)
123:デフォルトの名無しさん
12/10/27 23:35:53.71
>>122
なるほど。
x64 & Windows では呼び出し規約は1種類に統一されたのか。
外部ライブラリを呼ぶ時も、呼び出し規約は何だろうと
ヘッダファイルを調べたりする必要がなくなるわけだ。
こりゃ便利。
ありがと。
124:デフォルトの名無しさん
12/10/28 09:29:26.53
>>109
㌧
すごく参考になった。
125:デフォルトの名無しさん
12/10/28 10:06:10.47
IFPHは完全にコンピュータサイエンスの本だから、プログラミングの本だと思って買うとがっかりするぞ
126:デフォルトの名無しさん
12/10/28 10:17:23.02
SICPをScheme入門書として紹介するのと同じぐらい~って表現がぴったりだな
127:デフォルトの名無しさん
12/10/29 03:17:32.09
Vectorの変更不可の方は
sliceなんかするとC++でいうところの参照のベクタになるってことでいいすか?
中身のコピーはしないんですよね?
128:デフォルトの名無しさん
12/10/29 07:28:07.96
>>127
vector パッケージのドキュメントには、
Data.Vector.slice の項に次のように書かれています。
O(1) Yield a slice of the vector without copying it.
The vector must contain at least i+n elements.
もしコピーされているようなら、それはバグですね。
129:Perl忍者 ◆M5ZWRnXOj6
12/10/29 09:47:53.39
URLリンク(pbh.jp)
↑
これ解けないやつは真骨頂にクズ
ハッカーをを名乗る価値無し
海外からNinjaレベルと言われるほどの者なら簡単に解くことができる
解いてみてみ?
合ってるか確認してやるから
SHA-1とか総当りとかほざいてるようじゃ脳味噌足りてないよ
ホワイトハット気取りのお前らクズじゃJarlsbergすら解けないんだろうな
130:デフォルトの名無しさん
12/10/29 12:36:11.29
>>128
ですおね^^
131:デフォルトの名無しさん
12/10/30 11:10:57.70
政治学習
132:デフォルトの名無しさん
12/10/31 21:36:04.82
噂の『関数プログラミング入門』を買った
カバーデザインがポップでありながら品があって良い
組版もプログラミングHaskellと同じものなのですっきりしていて気が散らない
Haskellのコードに使われる等幅フォントが縦長窮屈でなく読みやすい
製本は流行りのlay-flatタイプの綴じ込みでこのへんもぬかりない
なかみはむつかしくてよくわからなかった
133:デフォルトの名無しさん
12/10/31 22:45:09.39
>>132
> なかみはむつかしくてよくわからなかった
一番感じなところだが・・・
134:デフォルトの名無しさん
12/10/31 22:46:57.40
肝心なところ
135:デフォルトの名無しさん
12/10/31 22:58:59.04
カバーデザインが非常に洗練されている「関数プログラミングの楽しみ」の前編に相当するとのことなので、
やはりデザインはいいんだな
136:デフォルトの名無しさん
12/10/31 23:54:48.87
この本開きやすいよな
フルフラット製本って言うらしいけど
137:デフォルトの名無しさん
12/11/01 05:42:51.18
フルスロットル製本に空目した
138:デフォルトの名無しさん
12/11/02 02:24:17.75
RWHより簡単かどうかだけ知りたい
139:デフォルトの名無しさん
12/11/02 12:11:09.02
諸君、議論がお留守だ
140:デフォルトの名無しさん
12/11/02 13:45:46.44
>>7
ほんとにjsやpythonってそんなひどいん?
141:デフォルトの名無しさん
12/11/02 14:04:31.23
>>7
■Objective-C
for (id num in @[@1,@2,@3,@4,@5]) printf("%d\n", [num intValue]);
または
for (id num in @[@1,@2,@3,@4,@5]) NSLog(@"%@", num);
142:デフォルトの名無しさん
12/11/02 14:17:55.79
Pythonでリスト内包表記使ってないのは不公平だな
■Python
[x*2 for x in range(1,6) if 2<x<5]
143:デフォルトの名無しさん
12/11/02 15:31:54.92
>>7て一番酷いのはHaskellだろ
こんな阿呆なコード書くやつ居ないよ
144:デフォルトの名無しさん
12/11/02 15:33:46.22
畜生、Vectorにnub無いのかよ
145:デフォルトの名無しさん
12/11/02 19:20:30.90
nub って何?
146:デフォルトの名無しさん
12/11/02 19:20:48.30
>>7って [1, 2, 3, 4, 5] みたいなリストを用意するのがルールじゃないの?
range とか 1..5 はだめだろ
147:デフォルトの名無しさん
12/11/02 20:48:54.42
Conal Elliott のブログの写真って、最近変わった?
つい最近まで正面を見てなかったっけ
まぁ、どうでもいいが
この素敵なおっさん、いつになったらブログ更新するんだろ
148:デフォルトの名無しさん
12/11/03 00:05:40.15
>>138
RWHは泥臭く実例を追う実用主義。BirdのIFPHは、理論的な側面を強調している。
無限リストの挙動がなんでそーなるの的な数学的原理なんかはIFPHが優れてるし
画像を扱ってバーコードリーダー作るぜ⇒大量のボイラープレート⇒それモナドでまとめられるよ
なんて話はRWHの優れたところだ。
コンピュータサイエンス(数学寄り)の素養があるならIFPHが簡単だろうし
CとかPerlは実戦でつかえるけど理論には興味ないしそれでも関数型使ってみたいならRWHが向いてる。
149:デフォルトの名無しさん
12/11/03 00:11:37.14
モナド変換子を解説してる日本語書籍がRWHしか無くないかね?
現実的にHaskellを使いこなすにはモナド変換子の理解が必須だと思うのだけど
150:デフォルトの名無しさん
12/11/03 00:27:58.18
>>149
IFPHの10.4でモナド変換子の説明が載ってますぞ~
例外の複合、状態の複合を例として説明し、最後にそれらを応用してますぞ~
151:デフォルトの名無しさん
12/11/03 00:38:59.61
それならちょっとIFPH立ち読みしてくるかなあ
よさそうなら関数プログラミングの楽しみと一緒に買ってしまうか
関数プログラミングの楽しみの方は、いつかじっくり読みたいなとは思ってたんだ
152:デフォルトの名無しさん
12/11/03 00:48:45.35
丁度昨日IFPHと関数プログラミングの楽しみ併せて買ってきたわ
読みたい時に手に入らないとかありがちだからなー
153:デフォルトの名無しさん
12/11/03 04:55:02.03
>>145
リストの重複要素を省く
154:デフォルトの名無しさん
12/11/03 12:08:13.58
>>153
ありがと
155:デフォルトの名無しさん
12/11/03 18:50:29.18
モナドって、IO、継続、Stateなどの副作用系から、LISTや冪集合などの
数学系に至るまで、適用範囲がすごく幅広いのだが、これはどうしてだろうか?
これだけ幅広くても、モナドとは何かを言えるものだろうか?
156:デフォルトの名無しさん
12/11/03 18:53:32.65
またモンゴロイドが疑問を抱いてるようです
157:デフォルトの名無しさん
12/11/03 18:57:39.06
>>155
関数ほどは幅広くはないよ
でも関数とは何かを言えるものだろうかなんて誰も疑問に思わないな
158:デフォルトの名無しさん
12/11/03 19:22:34.41
>>157
関数。たしかにそうだけどね。
モナドは中途半端に幅広い、と言うとどうかな。
関数の場合は、モナドのような分類(IO、State、...)はしないよね。
しかもこの分類はアドホックな分類にも見えるし。
159:デフォルトの名無しさん
12/11/03 19:45:48.97
>146
>7のClojureはrange使ってるよ
160:デフォルトの名無しさん
12/11/03 19:51:21.33
>>155
Prologは副作用系と数学系を区別してなかったのだが
Haskellはいったん副作用系と数学系を対立させ、再び統一するためにモナドを発明した
161:デフォルトの名無しさん
12/11/03 20:43:47.80
>>160
うん。そのとき、たとえば、IO a とList a における IOとListには、
どちらも型構成子であるという共通性はあるが、それ以外の共通性は
感じ取れないんだ。さらにいうと、List aの方はaの自然な拡張だと
すんなり納得できるが、IO aの方は、aとIOの強引な組合せとしか
見えないんだ。
162:デフォルトの名無しさん
12/11/03 20:58:35.33
>>159
前スレのテンプレを見てもらえばわかるがrangeとか1..5とか使ってないのよ
だから元々そういう縛りがあったんだろう
163:デフォルトの名無しさん
12/11/03 21:01:56.52
あれはテンプレじゃなく前スレで勝手にぶっこまれただぞ
164:デフォルトの名無しさん
12/11/03 21:09:19.21
>>163
それは失敬
でもテンプレ化するならそれなりにルールを決めないとだめだよね
165:デフォルトの名無しさん
12/11/03 21:10:54.68
>>161
お前には感じ取れなくてもListとIOには共通性があって
その共通性に基づいてるのがモナドなんだな
166:デフォルトの名無しさん
12/11/03 21:11:34.99
え聞こえないとかありがちだからなー
167:デフォルトの名無しさん
12/11/03 21:15:23.85
「感じる」とはまた曖昧で主観的な・・・
168:デフォルトの名無しさん
12/11/03 21:28:01.97
>>165
>ListとIOには共通性があって
どういう共通性?
169:デフォルトの名無しさん
12/11/03 21:29:04.57
モナドとは、モナド則を満たすような(>>=)とreturnを定義できる型構築子のこと
逆に、ある型構築子に対してモナド則を満たすような(>>=)とreturnを定義できるならそれはモナド
170:デフォルトの名無しさん
12/11/03 21:35:43.05
IOとかListとかが実際に果たす役割はどうでもよくて、共通する構造によって表現可能ってことだから 関数よりむしろモナドのほうが広いとも言える
171:デフォルトの名無しさん
12/11/03 21:43:13.59
>>169
むしろ、IOとListとが同類にみえるようなモナド則は実はナンセンスなのじゃ
ないかという疑問なのだが?
>>170
さすがにそんなことはないだろう。
172:デフォルトの名無しさん
12/11/03 22:04:53.50
>>169
そのような性質を持つものにモナドという名前を与えた背景の方が興味あるな
173:デフォルトの名無しさん
12/11/03 22:05:36.02
>>171
モナド則なんてなくても、Prologでは副作用と非決定性は同類に見えていた
174:デフォルトの名無しさん
12/11/03 22:15:51.32
>>172
お察しの通り、モノイドとの類似性から
>>173
非決定性が副作用の一部というなら分かるが、同類というのは分からん。
Prologの何のことを言ってる?
175:デフォルトの名無しさん
12/11/03 22:22:16.53
非決定性と副作用を同類に扱う手法のひとつがモナドだよね?Prologには何かそれに代わる物がある?
176:デフォルトの名無しさん
12/11/03 22:23:16.60
>>171
ナンセンスとか言っても現実にリストとIOは同じモナドの概念でまとめられるので、
まとめられる以上それを別のものにする理由が無い
177:デフォルトの名無しさん
12/11/03 22:29:00.77
IOはRealWorldを状態に持つStateモナドのようなものだってことは理解してる?
178:デフォルトの名無しさん
12/11/03 22:36:14.23
Prolog:
非決定性は副作用の一部 (>>174)
Haskell:
非決定性はモナドの一部 + 副作用はモナドの一部
179:デフォルトの名無しさん
12/11/03 22:37:13.01
まとめられるから、というだけでモナドにまとめている訳でもなさそうだけどな
まとめられるのに、諸事情でまとまっていないものもあるし
180:デフォルトの名無しさん
12/11/03 22:40:44.12
でも、非決定性、状態、継続、例外、入出力等、
かなり多くのものがまとめられるからモナドを選んだんじゃないのかね?
181:デフォルトの名無しさん
12/11/03 22:49:35.35
色々やってるうちに便利なことに気付いたって印象だな
IOとか昔はモナドじゃなかったんでしょ
182:デフォルトの名無しさん
12/11/03 22:54:29.24
流体は非粘性(粘度効果は無視できる)、ポリトロープな状態方程式で記述される熱的な理想気体とし、断熱過程の下で作用する。
183:デフォルトの名無しさん
12/11/03 23:01:50.05
応用範囲が広くて便利なものを「ナンセンス」と言う意味が分からんな
独自の言葉の使い方をしてるならちゃんと最初に定義してくれ
184:デフォルトの名無しさん
12/11/04 00:05:52.82
>>155
Moggiの論文に説明があるよ。でもまあ確かに判ってる人が
判ってる人向けに書いてる感がある。
185:デフォルトの名無しさん
12/11/04 00:09:40.59
>>171
さすがにそんなことはないだろう、なんてことはないのだ。
恒等関手もモナドなのでモナドによって定まるKleisli圏の中に元の圏も
含まれている。形式的な話ではあるが。勿論モナドごとに一つのKleisli圏があり、異なる
モナドをつなぐためにはめんどうな事をしないといけないが
(この辺は自分もまだ未把握。モナドトランスファーが関係してるのかなぁ)
186:デフォルトの名無しさん
12/11/04 00:41:32.78
コアンダ効果を通常の翼の速度分布の説明に使うのは不適切であると
187:デフォルトの名無しさん
12/11/04 04:30:56.21
駄目だ! このスレ頭良い人達でいっぱいだ!
188:デフォルトの名無しさん
12/11/04 07:59:40.61
>>185
そういう言いかたなら、関数は射なのだから,やっぱりそんなことはないのだ。
189:デフォルトの名無しさん
12/11/04 09:31:56.97
>>188
射は関数とは限らないから、それは反論になってないよ(ただ185の議論が強引なのは確か)
190:デフォルトの名無しさん
12/11/04 09:59:30.19
プログラムとは関数では無くKleisli圏の射のことなので、
関数よりモナドの方が広いと言うのはある意味正しい
191:デフォルトの名無しさん
12/11/04 10:13:46.42
>>185
いまここではそもそもそのKleisli圏がどれだけ意味があるのかを聞かれているんじゃないかな
192:デフォルトの名無しさん
12/11/04 10:22:17.47
>>190
米田の補題より、関数=射。
190より、モナド⊂プログラム=Kleisli圏の射⊂射。
したがって、モナド⊂関数。
これでOK?
193:デフォルトの名無しさん
12/11/04 10:36:35.07
諸君、議論しているね
194:デフォルトの名無しさん
12/11/04 10:56:48.43
>>192
>米田の補題より、関数=射。
ちょっと意味が解らないんだけど、
米田の補題からどうやって関数=射(ここで言うイコールって何?)が導かれるのか説明してくれない?
195:デフォルトの名無しさん
12/11/04 13:53:18.43
むしろ、カルテジアン閉のような気がする
196:デフォルトの名無しさん
12/11/04 15:51:14.41
>>189
強引?
間違ってるっていうんだよw
197:デフォルトの名無しさん
12/11/04 16:08:25.97
Q. 何でIOと[]の共通部分をわざわざ括り出して名前を付けるの?
A. 便利だから
で済む話だろ
198:デフォルトの名無しさん
12/11/04 16:21:23.88
Moggiの論文読めば済む話なのに、何をごちゃごちゃ言ってるのんだよ
199:デフォルトの名無しさん
12/11/04 16:59:49.49
英語を読んだら死ぬという噂だし…
200:デフォルトの名無しさん
12/11/04 17:41:22.96
>>197
IOをモナドで扱うのが便利なのは分かるが、
リストまで同じようにモナドで扱うのが便利な理由がいまいち分からん
201:デフォルトの名無しさん
12/11/04 17:43:30.65
>>198
だからあMoggi論文が納得できないって言ってるんだろ
それはそれでありだな
202:デフォルトの名無しさん
12/11/04 17:43:44.71
>>200
内包表記便利じゃん
あれってモナドだからだよ
203:デフォルトの名無しさん
12/11/04 18:03:37.92
>>195
:(;゙゚'ω゚'):カルテジアンなの? カルテシアンだと思ってた
204:デフォルトの名無しさん
12/11/04 18:09:09.26
コードも書かずにモナドがどうやら大して理解もしてない圏論がどうやら、
実にHaskellerらしいスレですね
205:デフォルトの名無しさん
12/11/04 18:12:53.23
圏論を深く理解したHaskellerでもなさそうなあなた様が
このような場末に何の御用で
206:デフォルトの名無しさん
12/11/04 18:23:29.00
>>200
リストモナドは総当たり(深さ優先探索)するときに使う
問題によってはStateT s []がすごく便利
207:デフォルトの名無しさん
12/11/04 18:48:07.95
>>202
リスト以外で内包表記が役に立つ(適している)シーンが思い浮かばない
リストもモナドで括る利点が内包表記ができるってだけなら、
内包表記はリスト専用構文でもいいような気がするのだが
208:デフォルトの名無しさん
12/11/04 18:51:07.34
>>206
すまん、総当たり(深さ優先探索)する簡単な具体例は何か無いだろうか
(俺、ここでいう総当たりの意味がよく分かっていない)
リストがモナドになっていない他の言語と比較してみたい
209:デフォルトの名無しさん
12/11/04 18:57:56.15
つうかモナド内包表記っていつのまにか復活してたのか
210:デフォルトの名無しさん
12/11/04 19:07:30.55
Listモナドが何なのかもわかってなくて煽ってたのかこいつは
Listの各要素に関数を適用するmap程度のものだとか思ってたのか?
211:デフォルトの名無しさん
12/11/04 19:12:23.22
いろんな書き方が出来て楽しいのう
do { x <- xs; y <- ys; return $ x + y }
[x + y | x <- xs, y <- ys]
(+) <$> xs <*> ys
212:デフォルトの名無しさん
12/11/04 20:02:05.01
>>211
一番下の知的な書き方に憧れます
213:デフォルトの名無しさん
12/11/04 20:51:41.09
>>210
それ以外に効果的だと感じる内包表記の使い方を見たことがない
214:デフォルトの名無しさん
12/11/04 21:03:01.89
わかってるじゃないか
お前が見たことないだけだよ
215:デフォルトの名無しさん
12/11/04 21:12:11.35
>>211みたいなの見てるとリストの要素から別のひとつの要素作ってるだけだから、
あんま効果的に見えないんだな
リストモナドの場合、
要素からリストをつくる操作(リストが入れ子になるわけじゃないよ)とか
要素を排除する操作とか(途中ですべての要素が排除されたら処理は止まる)を混ぜることができて、
最終的に結果をひとつのリストとして得ることができる
216:デフォルトの名無しさん
12/11/04 21:13:48.86
総当りというかバックトラックの例だが。
nQueen :: Int -> [[(Int,Int)]]
nQueen n = nQueen_ 1 [[]]
where nQueen_ m ans
| m > n = ans
| otherwise = nQueen_ (m + 1) [(m, x) : xs |
xs <- ans,
x <- [1..n],
all (\ (i, j) -> x /= j && abs (m - i) /= abs (x - j)) xs]
217:デフォルトの名無しさん
12/11/04 21:14:33.43
4つの4で0..100を作るパズル
import Data.List
import Control.Monad
main = putStr $ unlines $ map (intercalate ", " . take 2 . fourFours) [0..100]
fourFours :: Int -> [String]
fourFours target = do
(val, str) <- msum $ map makeWith [[4,4,4,4], [44,4,4], [4,44,4], [4,4,44], [444,4], [4,444], [4444]]
guard $ val == fromIntegral target
return str
makeWith :: [Int] -> [(Rational, String)]
makeWith [x] = return (fromIntegral x, show x)
makeWith xs = do
(left@(_:_), right@(_:_)) <- zip (inits xs) (tails xs) -- xsを二つに分ける
leftVal <- makeWith left -- 左部分式を作る
rightVal <- makeWith right -- 右部分式を作る
combine leftVal rightVal -- 演算して組み合わせる
combine :: (Rational, String) -> (Rational, String) -> [(Rational, String)]
combine left right = do
op <- [add, sub, mul, div] -- 演算を選ぶ
op left right
where
add a b = return $ op2 (+) "+" a b
sub a b = return $ op2 (-) "-" a b
mul a b = return $ op2 (*) "*" a b
div a b = do
guard $ fst b /= 0
return $ op2 (/) "/" a b
op2 valOp strOp (v0, s0) (v1, s1) = (valOp v0 v1, "(" ++ s0 ++ ")" ++ strOp ++ "(" ++ s1 ++ ")")
218:デフォルトの名無しさん
12/11/04 21:24:26.05
君らがやってるのはトイプログラムとか頭の体操の類いだけじゃん
たとえばゲーム製作の**の部分での利用とか、
会計ソフト製作での**の部分での利用とか、
Webサービス製作での**の部分での利用とか
そういう実用的な部分での使い方はねーの?
219:デフォルトの名無しさん
12/11/04 21:26:14.32
いつからそんな話になったんだよww
220:デフォルトの名無しさん
12/11/04 21:30:31.40
jQueryなんかはListモナド的なものをうまく活用してるいい例かね
Listモナドのアルゴリズムはわりと広範囲に応用可能だと思う
状態モナド的なものと比べて
221:デフォルトの名無しさん
12/11/04 21:30:39.00
>>218
なんで総当たりの実演をするのにそんな分野依存の知識を要求する例が欲しいんだ?
リストモナドは総当たりが必要な時にはいつでも使える、ということさえ知ってれば
プログラマなら応用できるだろ
222:デフォルトの名無しさん
12/11/04 21:34:13.80
まあでもはっきり言えばリストモナドは実用上そこまで重要じゃないと思う
Maybeの方が10000倍大事
223:デフォルトの名無しさん
12/11/04 21:35:36.79
カードをプレイするためのコストが比較的複雑なTCGで、
手札のカードが場に出せるかどうかを判定するのにStateT a [] bを使ったような記憶はある
224:デフォルトの名無しさん
12/11/04 21:48:05.17
>>219
いや、だってさ
実用的なシーンではたいして使えない仕組みなんて、
あっても意味は無くないか?
何のためにプログラムしてるかと言えば、
アプリを作るためにしてる、というのが
まぁ一般の大半のプログラマの意見だと思うし
225:デフォルトの名無しさん
12/11/04 21:50:01.24
あと、俺の言う仕組みって、リスト以外のモナド内包表記のことね
226:デフォルトの名無しさん
12/11/04 21:55:28.18
>>224
いや、>>208に答えてリストモナドがどんな感じで動くかという話をしてるんであって、
リストモナドの存在意義を示すための例じゃないよ
227:デフォルトの名無しさん
12/11/04 21:56:42.71
>>225
お前は誰だよw文脈依存な書き込みするならコテつけろw
228:デフォルトの名無しさん
12/11/04 21:59:12.10
モナドの出番だな
229:デフォルトの名無しさん
12/11/04 22:18:45.82
>>226
だったらアンカーを適切に付けろ
こっちはモナドを勉強中なんだから何に対しての何の意見なのか全く分かんねーよ
で本題だが、すいませんでした、>>216 は参考になります
これから他の言語と比較して理解を深めようと思います
230:デフォルトの名無しさん
12/11/04 22:32:03.03
リストがモナドである意味が分からないのか、
内包表記がリスト以外のモナドで使える意味が分からないのか、
それとも他に難癖付けてるのか
レスが錯綜してて分からん
231:デフォルトの名無しさん
12/11/04 22:37:52.14
非リストのモナド内包表記の活用例というのは俺も見てみたい
実際使ったことがない
232:デフォルトの名無しさん
12/11/04 22:43:10.02
>>230
> リストがモナドである意味が分からないのか、
これはとても難しい問題だと直感したから、ひとまず置いておく。
> 内包表記がリスト以外のモナドで使える意味が分からないのか、
まずはこれを知りたい。
しかも、意味は難しいそうだから、まずは例を。
遊びにしか使えない例なら、そんなもので意味を探るのは無理だから、要らない。
233:デフォルトの名無しさん
12/11/04 23:02:36.40
>>222
>Maybeの方が10000倍大事
Maybeが?ほんまかいな
234:デフォルトの名無しさん
12/11/04 23:07:02.43
> ほんまかいな
メイビー(キリッ
235:デフォルトの名無しさん
12/11/04 23:09:02.03
センスNothing
236:デフォルトの名無しさん
12/11/04 23:17:29.69
好きな書き方で書けば良いよ
if y /= 0 then Just (x / y) else Nothing
do { guard (y /= 0); return (x / y) }
guard (y /= 0) >> return (x / y)
[x / y | y /= 0]
237:デフォルトの名無しさん
12/11/04 23:37:47.36
いろんなライブラリ内で Maybe が使われているのを見るが、
[x / y | y /= 0] のような書き方を見ないのは何故だ?
238:デフォルトの名無しさん
12/11/04 23:38:52.87
モナド内包表記が復活したのって最近でしょ?
239:デフォルトの名無しさん
12/11/04 23:43:08.50
可読性もありそう
240:デフォルトの名無しさん
12/11/04 23:50:31.34
そんなキモい書き方するのなんてゴルファー()ぐらいたろ
241:デフォルトの名無しさん
12/11/04 23:51:42.79
モナドのインターフェースを持ってるから、>>211みたいに
do形式や内包表記さらにはアプリカティブファンクターの式なんかの好きな書き方ができるんだよね
242:デフォルトの名無しさん
12/11/04 23:53:14.08
>238
復活といっても GHC の言語拡張ですよ。
if y /= 0 then Just (x / y) else Nothing
[x / y | y /= 0]
どちらがプログラムの意味を理解しやすいかは読み手の経験によるでしょうが、
私は前者の方を使いたいですね。
243:デフォルトの名無しさん
12/11/05 00:01:01.45
内包表記をリスト以外に使うのがキモいのなら
> 内包表記がリスト以外のモナドで使える意味が分からないのか
なんて訊くまでもないよね。
だって使えるかどうかに関わらずキモいから使わないんでしょ?
244:デフォルトの名無しさん
12/11/05 00:26:31.37
>>243
>>323
> 遊びにしか使えない例なら、そんなもので意味を探るのは無理だから、要らない。
[x / y | y /= 0] これが遊びでないと言うのなら、>>237 はどう説明する?
なぜ書籍ではこのような書き方が紹介されない?
俺は内包表記がリスト以外のモナドで使えるのは、意味なんて何も無いと思う。
最初は、モナドだとどんなものでも内包表記ができちゃう事を発見したから、
プログラマがなんか役立つ使い方をしてくれるだろうという安直な考えで、
リスト以外にも使えるモナド内包表記が作られたんじゃないかな。
設計者自身に明確な目的なんてきっと無いでしょ。
その後、たいして上手い使い方も無いまま復活した理由が不明だが。
245:デフォルトの名無しさん
12/11/05 00:43:08.53
結論ありきなら議論する意味なんて無いってだけだよ。
ていうか、書籍に書いてあるかどうかで判断したいなら
こんなとこで他人に聞く必要もないだろ?
246:デフォルトの名無しさん
12/11/05 00:49:09.20
>>244
なんでリストで内包表記が使えるのは意味があるの?
do構文があれば要らないよね?
247:デフォルトの名無しさん
12/11/05 00:49:49.28
>なぜ書籍ではこのような書き方が紹介されない?
そりゃ自分で書いてる通り、最近復活したからでしょ
そのうちリスト以外でもイディオムが生まれてくるよ
248:デフォルトの名無しさん
12/11/05 04:01:00.46
>>236
:(;゙゚'ω゚'):内包表記って[と]で括られてるからリスト専用だと思ってた……
今までは偽りの人生だった……
249:デフォルトの名無しさん
12/11/05 04:08:25.37
本に書いてあって現場で使われているものにしか興味ないなら
スレ間違えてるよな
250:デフォルトの名無しさん
12/11/05 04:19:05.02
エロゲの攻略法わかんなくてゲームの意義を問う
というかZIPでくれと言い出す奴
251:デフォルトの名無しさん
12/11/05 05:35:28.68
サワーグレープセオリー
252:デフォルトの名無しさん
12/11/05 06:23:16.95
ghciだと:set -XMonadComprehensionsでモナド内包表記が有効になるのか
これはなかなかおもしろいな
253:デフォルトの名無しさん
12/11/05 06:36:23.36
>>252
詳しい解説サンクス
それならPerl忍者が荒らすのも分かる気がする(´・ω・`)
254:デフォルトの名無しさん
12/11/05 07:21:11.08
>>249
じゃあ、本は無しにしようか。
現場に限ってもいいし、
何なら HackageDB に登録されているライブラリ内に限定してもいいが、
それでもスレ違いか?
プログラム言語において機能を実装するというのは、
使うことによってメリットがあると想定されるからだろう。
Haskell は実用もしっかりできる関数型言語を目指して生まれたのだから、
なおさらだ。
Haskell98 で言語仕様から消えたモナド内包表記が、
最近になってGHCの言語拡張として復活したのは、どういう意図があって?
モナド内包表記が欲しいと思っていた人たちは、
どういうシーンでそれが活用できると考えていたの?
その辺りが知りたい。
正直言って、>>236 の例では恩恵が実感できない。
「好きな書き方で書けば良い」という理由だけで復活したとも思えん。
それでは Perl みたいじゃないか。
255:デフォルトの名無しさん
12/11/05 07:28:03.96
内包表記なんて長いコードに使うもんじゃない
(長くなるならmapなりfilterなりdoなり使うべき)
だから短いコードだから内包表記で書く意義が
分からないってワケじゃないだろう
ってことは、こっちは>>254様が納得する理由をエスパーしてやらなきゃ
ダメってことなワケだが、なんでそんなことしてやる必要あるの?
256:デフォルトの名無しさん
12/11/05 07:28:37.24
>>254
>>247
257:デフォルトの名無しさん
12/11/05 07:49:04.08
>>254
URLリンク(hackage.haskell.org)
URLリンク(hackage.haskell.org)
258:デフォルトの名無しさん
12/11/05 12:01:23.74
サーセン
Data.Vectorで組んで動いたコードをData.Vector.Unboxedに切り替えようと思ったんすよ
そしたら急にVectorはファンクタじゃないからfmap使えないよ Probable fix 云々ってクレーム来たんすけど
どゆことっすか?ファンクタでしょ?
259:デフォルトの名無しさん
12/11/05 15:54:09.94
>>258
メッセージ全文うpらないのは甘え
260:デフォルトの名無しさん
12/11/05 19:08:43.11
>>257
ありがと。
前者は単にモナド内包表記と同等の do 表記をいくつか例示してるだけじゃん。
誤解を恐れずに言えば、モナド内包表記の操作的意味論っぽいものを示してるだけ。
ただ、そのページに論文「Bringing Back Monad Comprehensions」へのリンクがあった。
こっちはざっと見たところ「現実的な問題提起 --> モナド内包表記による解決」
という感じで語っているような気がするから、実用的なことが書かれていそうだ。
これからじっくり読んでみるよ。
後者の方はこの論文と同名なんだが、同じもの?
至る所に訂正の跡があるのだが、最新版ってことかな?
どちらにしても、「Bringing Back Monad Comprehensions」
こういう情報が欲しかったんだ。
261:デフォルトの名無しさん
12/11/05 19:12:58.71
>>258
unboxed vectorは関手じゃないよ(腹が立つのは分かる)
関手なら fmap :: (a -> b) -> Vector a -> Vector b
が定義できなきゃならんけど、unboxed vectorだとb=Integerとかにできない
(Unbox制約を満たさないといけないから)
262:デフォルトの名無しさん
12/11/05 19:21:08.08
最近流行ってる関手って、そもそも何?
263:デフォルトの名無しさん
12/11/05 19:24:41.98
URLリンク(www.haskell.org)
Haskellでいう関手はこれ
圏論の関手は他を当たってね!
264:デフォルトの名無しさん
12/11/05 19:29:59.09
>>261
マジすか
複雑な事情っすね
実践よりもHaskell型システムの理解に的を絞ったサイトないっすか?
265:デフォルトの名無しさん
12/11/05 19:30:38.26
>>262
map を関手の一つと考えると、関手から自然変換まで簡単に理解できる
簡単に理解できる = 毎日30分定義とにらめっこして1週間ぐらい悩むと分かる
266:デフォルトの名無しさん
12/11/05 19:41:26.25
>>263
Functor クラスが関手のことなら、なにも漢字で書かなくてもよくない?
unboxed vector は Functor クラスのインスタンスじゃないから、
と言う方がはるかに分かりやすいというか、ストレートだと思うんだが
と感じるのは私だけ?
267:デフォルトの名無しさん
12/11/05 19:44:20.77
知らんがな
268:デフォルトの名無しさん
12/11/05 19:52:07.99
>>266
定着してる訳語があるのに横文字や片仮名を使うのは宗教上の理由でできんのです、ごめんなさい
269:デフォルトの名無しさん
12/11/05 19:55:12.71
>>268
ギャグとしてはあまり面白くない
270:デフォルトの名無しさん
12/11/05 20:02:00.78
女だ! このスレに女が紛れ込んでるぞぉーっ!
魔女を焼き払えーっ!
271:デフォルトの名無しさん
12/11/05 20:04:44.17
一人称を私にすると賢そうに見えるの法則
272:デフォルトの名無しさん
12/11/05 20:14:25.77
ん?
Functor クラスそのものは関手なの?
Functor クラスがたまたま持つ性質(種数やfmap関数など)を持つものが関手なの?
たとえば Applicative なども関手?
Functor クラス自身とそのインスタンスのみが関手?
Functor クラスそのもののみが関手で、そのインスタンスは集合の要素みたいなもの?
わけが分からなくなった・・・
>>271
一人称「私」なんて誰でも使うから、賢そうに見える要素にならないでしょ
273:デフォルトの名無しさん
12/11/05 20:20:11.08
>>272
二番目が一番近いと思う
274:デフォルトの名無しさん
12/11/05 20:24:02.72
>>273
そうだとすると、>>268 の言う「定着してる訳語」っておかしくないか?
>>268 の言い方だと Functor の日本語訳が関手である、
と言っているように聞こえる
275:デフォルトの名無しさん
12/11/05 20:29:18.54
>>274
圏論でFunctorの訳語が関手だから、それ以外に訳しようがない
276:デフォルトの名無しさん
12/11/05 20:33:04.72
圏論でFunctorと、haskellのFunctorクラスは同じもの?
277:デフォルトの名無しさん
12/11/05 20:38:18.43
わかった
今後Haskellのファンクタの意味で関手といいたい場合
いわゆる関手
と書くことにしよう
278:デフォルトの名無しさん
12/11/05 20:39:30.80
>>276
HaskellのFunctorクラスのインスタンスはある種の(圏論的な意味の)関手(の対象部分)になってる
具体的にはHask圏からHask圏への関手
逆に、ある型構築子が(圏論的な意味の)関手になっていてもFunctorのインスタンスとは限らない
たとえば>>258のunboxed vectorがそう
279:デフォルトの名無しさん
12/11/05 20:48:17.32
>>278
じゃあ、HaskellのFunctorクラスを安易に関手と言うのは、
文脈によっては危険じゃないか?
どの文脈だと危険か正しく理解してる奴しか使えない訳語な感じがするが
280:デフォルトの名無しさん
12/11/05 20:53:08.78
>>279
もちろん混乱の原因になることはあるけど、
*Functorのインスタンスを関手と呼ぶ
のをその論法で禁止したら、
*Monadのインスタンスをモナドと呼ぶ
*Monoidのインスタンスをモノイドと呼ぶ
*Numのインスタンスを数値型と呼ぶ
あたりも言えなくなって不便じゃないか
281:デフォルトの名無しさん
12/11/05 20:53:32.47
単位元と結合律を保存する高階関数は関手
という理解は正しいでしょうか?
282:デフォルトの名無しさん
12/11/05 20:59:21.14
>>281
「恒等関数と関数結合を保存する高階関数」と言った方が良さそう
283:デフォルトの名無しさん
12/11/05 21:09:19.73
関手はFunctorではなくfmapじゃないのん?
284:デフォルトの名無しさん
12/11/05 21:12:51.87
>>280
なるほど、そう言われると、たしかに不便だな。
Haskell の話をしていると判りきっている時には
Monad のインスタンスはモナドと言いたい。
(個人的にはFunctorのインスタンスはファンクタと言いたいが)
でも、Haskell の話をしてるときに、いきなり圏論が姿を現し、
そのまま議論が進んでいくと、ややこしくならない?
そういうシーンをこのスレでよく見かける
285:デフォルトの名無しさん
12/11/05 22:05:15.91
271 名前:デフォルトの名無しさん[sage] 投稿日:2012/11/05(月) 20:04:44.17
一人称を私にすると賢そうに見えるの法則
賢くみられたいからHaskellやるという法則
286:デフォルトの名無しさん
12/11/05 22:11:23.06
賢く見られたいからHaskellって・・・
賢く見られたいんならMITで博士号取るだろ普通
287:デフォルトの名無しさん
12/11/05 22:47:19.80
>>286
ギャグとしてはあまりおもしろくない
288:デフォルトの名無しさん
12/11/05 22:51:06.92
>>287
一度目はいいけど、二度やると冷める
もう止めた方がいいと思うよ
289:デフォルトの名無しさん
12/11/05 23:09:11.87
GHC 7.6.1 の ghci 上で Conduit が動かない
ghci 上で Data.Conduit系モジュールがロード処理されると、
エラーが出る。
Loading package conduit-0.5.2.7 ... linking ... <interactive>: internal error: R
_X86_64_PC32: High bits are set in 7fefb411866 for _close
(GHC version 7.6.1 for x86_64_unknown_mingw32)
Please report this as a GHC bug: URLリンク(www.haskell.org)
これはバグ?
俺英語書けなくてバグ報告できないんだが、詰んだかな
290:289
12/11/05 23:10:49.65
あ、ちなみに ghc でコンパイルすれば問題なく実行できるから、詰んではないか
でも色々実験して勉強しようと思ってたんだが、ghci 使えないとなると、
かなり面倒になるなぁ・・・
291:デフォルトの名無しさん
12/11/05 23:12:17.93
>>281-283
関手とはある圏の対象と射をもう一つの圏(自己関手の場合は同じ圏)に移すものだから、
Functorのインスタンスとfmapセットで関手と言うのが一番近い
292:デフォルトの名無しさん
12/11/05 23:37:08.23
>>286=こいつ図星
こいつ>>285のレスに図星しすぎれレスしてやがる
だいたいのやつは必死に悔しくても反応したら負けっていう考え持ってるから食いつかない
こいつは食いついた正直者
293:デフォルトの名無しさん
12/11/05 23:41:21.48
>>290
たぶんWindows固有の問題
LinuxかMacを使うとか、Windowsなら仮想マシン上でLinux使えば、問題が出ない可能性が高い
この手の開発はUnix系メインでやっててWindowsはオマケのことが多いから、
細かいとこで目の行き届かない不具合があったりする
294:デフォルトの名無しさん
12/11/05 23:41:35.04
俺、Haskellぐらいしかまともに書ける言語ないんだが、
正直それはそれで非常に恥ずかしい思いをしている
295:デフォルトの名無しさん
12/11/05 23:41:49.81
○○をしたら負けとか偉いやつが言ったらすぐ真似をして
○○をしなくなるのが情弱
Matzみたいなのが「これから来る言語」 Haskellとか言ったら
すぐ真似して
Haskellしだすやつが情弱
>>286=こいつ最高に図星
296:デフォルトの名無しさん
12/11/05 23:44:42.21
Haskellの話しようぜ
297:289
12/11/05 23:45:16.42
>>293
ありがと
とりあえず勉強だけなら処理速度は要らないから、
vm player に linux 入れて、そっちでやってみるよ
298:デフォルトの名無しさん
12/11/06 00:53:45.21
実用度外視なんだから、偉いやつが言ったことをすぐ真似してHaskellやるのが正解
どうせネットで偉い人のマネする以上の教育課程が揃ってないんだから
299:デフォルトの名無しさん
12/11/06 07:18:02.31
教育してもらわなきゃプログラミングすら出来ないアホは
まったく向いてないからリアル土方に転向したほうが良いよ?
300:デフォルトの名無しさん
12/11/06 07:31:54.96
侮辱がただの賛意表明になっているような
元からそのつもりだったのか?
いや、そういう文体には見えないなあ
要するに>>299はアホなんだろう
301:デフォルトの名無しさん
12/11/06 07:33:11.89
え?まじで教育が必要なの?
大学でも別にプログラミングなんて独学だっただろ?
え?大学行ってないの?
302:デフォルトの名無しさん
12/11/06 07:34:45.38
俺が言いたいのは>>298と>>299って同じ主張じゃね?
ってこと
ほんとに大学行ってるの?
303:デフォルトの名無しさん
12/11/06 07:36:37.37
>>298は「教育環境揃ってない = 実用度外視」
と書いてるようにしか読めんのだが
教育されなきゃ実用的なプログラミングも出来ないアホは向いてないよ
304:デフォルトの名無しさん
12/11/06 07:41:52.94
話通じてないなあ・・・
自分の発言にあとから留保つけちゃってるし
まあ俺は>>298じゃないからいいんだけどさ
305:デフォルトの名無しさん
12/11/06 07:44:55.65
アホが偉い人のマネすべきってのはその通りだな
自分で考える脳みそ無いし
306:デフォルトの名無しさん
12/11/06 07:48:21.06
GHCはRuby以下の安定性
307:デフォルトの名無しさん
12/11/06 09:29:03.76
∧_∧
( ´Д`) <みなさーん、お茶が入りましたよ~
/ \
| l l | ..,. ., .,
| | | _|。.:_::゜。-.;.:゜。:.:;。
ヽ \_ .。'゚/ `。:、`;゜:;.::.。:.:。
/\_ン∩ソ\ ::..゜:: ゚。:.:.::.。.。:.
. / /`ー'ー'\ \ ゜: ::..゜:: ゚。:.:.:,。:.:.
〈 く / / ::..゜:: ゚。:.:.:,.:.:.:。:.:,
. \ L ./ / _::..゜:: ゚。:.:.:,.:.:,.:.:.:,
〉 ) ( .::旦旦旦旦旦旦旦旦旦旦旦旦旦旦旦旦旦旦.
(_,ノ .`ー'旦旦旦旦旦旦旦旦旦旦旦旦旦旦旦旦旦旦.
308:デフォルトの名無しさん
12/11/06 10:19:19.89
298 名前:デフォルトの名無しさん[sage] 投稿日:2012/11/06(火) 00:53:45.21
実用度外視なんだから、偉いやつが言ったことをすぐ真似してHaskellやるのが正解
どうせネットで偉い人のマネする以上の教育課程が揃ってないんだから
305 名前:デフォルトの名無しさん[sage] 投稿日:2012/11/06(火) 07:44:55.65
アホが偉い人のマネすべきってのはその通りだな
自分で考える脳みそ無いし
309:デフォルトの名無しさん
12/11/06 10:58:32.92
Matzってそれほど「偉いやつ」だっけ
310:デフォルトの名無しさん
12/11/06 14:23:00.82
Perl忍者最近見ないな
311:デフォルトの名無しさん
12/11/06 17:31:28.63
>>261
じゃあfmap的なことはどう実現したらいいんですか!?
312:デフォルトの名無しさん
12/11/06 18:24:59.42
>>311
Data.Vector.Unboxed.map
313:デフォルトの名無しさん
12/11/06 19:07:44.24
>>312
(////)
314:デフォルトの名無しさん
12/11/06 19:14:05.47
(////) ::
315:デフォルトの名無しさん
12/11/06 23:10:36.99
(////) :: Answer -> Shame
316:デフォルトの名無しさん
12/11/08 19:52:02.96
質問です。Writerモナドというものを知ったので、前から知りたかった
遅延評価される場合のたらいまわし関数の呼び出され回数というものが知りたくて以下のように書きました。
import Control.Monad.Writer
tak :: Int -> Int -> Int -> Writer (Sum Int) Int
tak x y z
| x <= y = do
tell(Sum 1)
return z
| otherwise = do
tell(Sum 1)
tak (fst(runWriter(tak (x - 1) y z)))
(fst(runWriter(tak (y - 1) z x)))
(fst(runWriter(tak (z - 1) x y)))
これで動くは動くんですが、引数を色々変えてもカウントが高々3でした。
少し考えてみて、再帰で呼んだ結果のカウントを捨ててるせいだろうというのは分かったのですが
改善策が思いつきません。上手い書き方があったら教えてもらえないでしょうか。
また、もしWriterでカウントするのが無理だとしたらどうするのが定石でしょうか?
317:デフォルトの名無しさん
12/11/08 20:03:07.81
入門書のリスト内包表記にガードが使えるという下りを読んで、凄い衝撃を受けた。
もしかしてHaskellって、Prologよりも抽象度が高いのかも。
実際にプログラムを作るまでになれば、泥臭いこともいろいろあるんだろうけど。
318:デフォルトの名無しさん
12/11/08 21:19:45.25
>>316
関数の評価回数を知りたいだけでしたら、プロファイリングすれば簡単にわかりますよ。
コンパイル時に3つのオプション "-rtsopts -prof -auto-all" を付けて、
実行ファイルの起動時にRTSオプション "+RTS -p" を付ければ、
*.prof ファイルができるんで、それを読めばいいです。
prof ファイルの一番下の表を見てください。
1列目に関数名(変数も関数)、2列目にモジュール名とあって、
4列目の "entries" の項目が評価回数です。
例えば z を返すバージョンの tak 関数を使って、
main :: IO
main = do
let z = tak 3 2 1
print z
を上記のようにコンパイルして実行してできた prof ファイルを見ると、
tak の評価回数は 5 と表記されています。
(実際に手計算で let z = tak 3 2 1 を簡約すると、
確かに5回 tak 関数が評価されていることが確認できます)
プロファイリングの詳細は「本物のプログラマはHaskellを使う」
の第45回の記事を参考にしてください。
こういうことではなく、プログラムの中でカウントする仕組みを作るには、
という趣旨の質問でしょうか?
319:デフォルトの名無しさん
12/11/08 21:33:42.67
>>316 こうすればok
tak x y z
| x <= y = do
tell(Sum 1)
return z
| otherwise = do
tell(Sum 1)
x' <- tak (x - 1) y z ;変えた
y' <- tak (y - 1) z x ;変えた
z' <- tak (z - 1) x y ;変えた
tak x' y' z' ;変えた
320:デフォルトの名無しさん
12/11/08 21:46:20.04
>>316がやりたいのは"遅延評価された場合"だからWriterだとマズイかも
321:デフォルトの名無しさん
12/11/08 21:46:32.28
>>318
すみません、書き忘れました。
仰る通りプログラムの中でカウントする仕組みを作るには、という趣旨です。
>>319
それをやると遅延評価の場合と結果変わっちゃいませんかね?
322:319
12/11/08 21:57:07.69
すいませんでした。orz
snd(runWriter(tak 100 50 0))とかやると糞時間かかりますね。
あとここちょっと違ってます。
| x <= y = do
tell(Sum 1)
return y; 変えた
323:319
12/11/08 21:59:19.20
ああごめん。>>322の最後は無視して。orz
324:デフォルトの名無しさん
12/11/08 22:33:46.28
>>316
Haskellは純粋だから、評価順序によって違う値を返す関数は書けない。遅延評価を前提とした呼び出し回数を数えるには、明示的に遅延評価をエミュレートする必要がある
import Control.Applicative
import Control.Monad.ST
import Data.STRef
thunk :: ST s a -> ST s (ST s a)
thunk action = do
ref <- newSTRef Nothing
return $ do
cache <- readSTRef ref
case cache of
Just val -> return val
Nothing -> do val <- action; writeSTRef ref (Just val); return val
tak :: STRef s Int -> ST s Int -> ST s Int -> ST s Int -> ST s Int
tak counter ex ey ez = do
modifySTRef counter (+1)
x <- ex; y <- ey
if x <= y
then ey
else do
a <- thunk $ tak counter (pred <$> ex) ey ez
b <- thunk $ tak counter (pred <$> ey) ez ex
c <- thunk $ tak counter (pred <$> ez) ex ey
tak counter a b c
takCount :: Int -> Int -> Int -> Int
takCount x y z = runST (do
counter <- newSTRef 0
_ <- tak counter (return x) (return y) (return z)
readSTRef counter)
325:324
12/11/08 22:35:38.37
あれ2chの仕様変わったの…
実体参照は適当に戻してね!
326:デフォルトの名無しさん
12/11/08 22:36:17.95
>< (//)
327:デフォルトの名無しさん
12/11/08 22:53:32.55
>>324
ありがとうございます、言い切ってもらえると参考になります。
今すごいH本をやっと読み終わろうかという段階なので正直難しいですが、
そのうち理解できるように精進します。
328:デフォルトの名無しさん
12/11/08 23:43:06.04
>>325
インデントは全角空白派が大勝利で悔しい
仕様変更の経緯のわかるスレとかあればどなたかプリーズ
329:デフォルトの名無しさん
12/11/09 13:58:18.49
ランタイムのGCっていつ行われるの?
アイドル時にやってくれる?
330:デフォルトの名無しさん
12/11/09 18:56:23.67
>>329
メモリが足りなくなったら
331:デフォルトの名無しさん
12/11/09 19:22:04.75
-threaded付けてるならアイドル時にもやる
332:デフォルトの名無しさん
12/11/09 19:22:21.31
>>330
今入力待ちで暇だなー……
あ、もう要らない領域あんじゃん
スカベンジスカベンジ……
こうはならないの?
333:デフォルトの名無しさん
12/11/09 19:23:42.68
>>331
あり^^
334:デフォルトの名無しさん
12/11/09 21:15:13.21
今日 -XTransformListComp なるものの存在を知ったんだけど
これって需要あるの?
{-# LANGUAGE TransformListComp #-}
import GHC.Exts (groupWith)
xs = [1,3,4,5,7,9,10,11,13]
ys = [x | (x,y) <- zip xs [1..], then group by x-y using groupWith]
335:デフォルトの名無しさん
12/11/11 15:48:20.65
conduit-0.5.2.7 を使っています。
ライブラリドキュメントの Data.Conduit にチュートリアルがありますが、
sourceList [1..10] $$ fold (+) 0 これの結果がどうなるか調べる方法を探しています。
チュートリアルでは、恐らく ghci 上で上記の式を評価して、
55 という数字が標準出力に出力されている様子が描かれていると思いますが、
私は Windows で GHC 7.6.1 を使っているため、ghci で conduit が使えません。
試しに次のようにしてみても、コンパイルエラーが出ます。
a :: GSink Int IO Int
a = sourceList [1..10] $$ fold (+) 0
main :: IO ()
main = print a
--------------------------------
No instance for (Show (Pipe l0 Int o0 u0 IO Int))
arising from a use of `print'
--------------------------------
どうすればチュートリアルのように
sourceList [1..10] $$ fold (+) 0 の評価結果を数値または数字で得る、
あるいは標準出力へ出力することができるでしょうか。
336:355
12/11/11 16:02:03.19
>>355
これでできました。
a :: GSink () IO Int
a = sourceList [1..10] $$ fold (+) 0
main :: IO ()
main = do
a <- runPipe a
print a
なんか不親切なチュートリアルですね。
最初の sourceFile の例ではちゃんと runResourceT があるのに。
337:335
12/11/11 16:02:48.97
すいません、レス番間違っていました。
>>335 です。
338:デフォルトの名無しさん
12/11/11 18:20:04.17
皆さんの思うハスケルの他の言語に対する優位性はなんですか?
339:デフォルトの名無しさん
12/11/11 18:25:43.15
conduit-0.5.4ならsourceList [1..10] $$ fold (+) 0で大丈夫だった
それよりWindowsのghc7.6.1ではghci上でconduitが使えないというのが気になる
340:デフォルトの名無しさん
12/11/11 18:53:17.01
>>339
>>289 >>290 >>293 辺り
341:デフォルトの名無しさん
12/11/11 19:02:24.58
>>339
7日に 0.5.4 が公開されていたんですね(その前日にDLしてました)
今 0.5.4.1 にアップデートして、
sourceList [1..10] $$ fold (+) 0 の値を print してみましたが、
コンパイルエラーでした。
大丈夫だったというのは、どのようにやったのでしょうか。
342:デフォルトの名無しさん
12/11/11 19:07:49.53
>>338 普段感じる利点はこのあたり
大域的な型推論
直和型が簡単に表現できる(CのunionやOOPLのsubtypeと比べて)
パターンマッチ(網羅性チェック、分岐と値の取り出しを同時に行える、など)
副作用のある箇所が型により分離される
(LLとかよりは)実行速度が速い
343:デフォルトの名無しさん
12/11/11 19:10:49.18
ほむほむ。
344:341
12/11/11 19:11:52.88
>>339
あぁ、分かりました。
(sourceList [1..10] $$ fold (+) 0) >> print
こういう事ですね。
これならできました。
もしかして、これならアップデートしなくてもできていたかも知れません。
ところで、conduit を 0.5.2.7 から 0.5.4.1 へ
"cabal install conduit" でアップデートしたのですが、
ライブラリドキュメントの方はこれでは更新されないのでしょうか。
(デフォルトなら ・・・/AppData/Roaming/cabal/doc/index.html
にインストールされるものです)
ドキュメントの表記の方は 0.5.2.7 のままなんです。
345:341
12/11/11 19:18:31.91
>>344
誤 (sourceList [1..10] $$ fold (+) 0) >> print
正 (sourceList [1..10] $$ fold (+) 0) >>= print
ライブラリドキュメントの方はトップの目次のところだけでなく、
内容も、例えば Data.Conduit のページの上部にも
"conduit-0.5.2.7: Streaming data processing library."
と書かれていて、更新されていません。
こういうものなのでしょうか。
Cabal のパッケージのバージョンは、
(規則に従うなら)4つ目の番号の変更は、
互換性は保っているがAPIが変更されている事になるので、
ドキュメントも変更しないとまずいような気がするのですが・・・
346:デフォルトの名無しさん
12/11/11 20:02:42.53
ghciで
λ> sourceList [1..10] $$ fold (+) 0
って入力しただけだけど 省略 >>= printと同じ事か
ドキュメンテーションが更新されないのは多分haddockのバージョンとghcのバージョンが違うから生成に失敗してるとかが考えられる
347:341
12/11/11 20:46:24.73
>>346
> 省略 >>= printと同じ事か
なるほど、たしかに。
> 多分haddockのバージョンとghcのバージョンが違うから
haddock.exe は ghc 7.6.1 に元々入っているのですが、
これが違うという事でしょうか。
ちなみに、ghc の bin ディレクトリには haddock.exe とは別に、
haddock-7.6.1 という名前の謎のファイルもあります。
(バイナリエディタで見てみると、形は実行ファイルの様ですが)
どうも、ghc 7.6.1 は謎の挙動かちらほらとありますね・・・
348:デフォルトの名無しさん
12/11/11 22:43:59.93
インストールした直後にcabalでconduit入れた時になんかhaddockのバージョンがおかしいって警告出たから
cabal install haddockで入れなおしたらconduitのドキュメント作ってくれるようになった
これはcabal/binにhaddockがあるからそっちが優先されるのが原因だけど
349:デフォルトの名無しさん
12/11/12 02:11:31.23
>>342
Javaのような言語で書かれた業務アプリ、ドカタの世界にもこれから進出してきたりしますかね
350:デフォルトの名無しさん
12/11/12 06:17:52.78
>>349
早くて20年後ぐらいじゃね?
351:デフォルトの名無しさん
12/11/12 20:15:17.94
Javaで書かれた商用ソフト見たことがない
ハードについてるドライバは何度かある
352:デフォルトの名無しさん
12/11/12 20:22:24.00
>>351
俺はひとつだけ知ってる
astah*
Haskell で書かれた商用ソフトってあるんかな
うちは社内ツールではあるけど
353:デフォルトの名無しさん
12/11/12 20:29:59.56
そういえばperlやjavascriptで書かれた商用ソフトも見たこと無いな。
354:デフォルトの名無しさん
12/11/12 20:33:15.19
コンパイルできない言語ってソースをそのまま売ることになると思うけど、それって商売になるのだろうか
355:デフォルトの名無しさん
12/11/12 20:37:06.13
ソースを売れっていうのは普通にあるでしょ
356:デフォルトの名無しさん
12/11/12 20:43:17.14
Android 用有料アプリは Java で書かれた商用ソフトである
という認識でいいのか?
357:341
12/11/12 22:44:21.87
>>348
Haddock を cabal install で入れてから、
cabal install --reinstall Conduit してもダメでした。
(ghc\bin ディレクトリより cabal\bin ディレクトリの方が
優先的に検索されるように設定しましたが・・・)
cabal\bin の Haddock.exe を ghc\bin へコピーしてみましたがダメでした。
よく見たら、cabal\doc 内には conduit-0.5.2.7 と conduit-0.5.4.1 があったので、
conduit-0.5.2.7 の方を適当にリネームして、index.html もリネームし、
この状態で cabal install --reinstall Conduit してみたら、
ドキュメントの目次やコンテンツの Conduit のバージョンが
ちゃんと 0.5.2.7 に更新されました。
Haddock の更新は必要条件だったのかよく分かりませんが、
とりかくドキュメントが正しく更新できて良かったです。
お騒がせしました。
358:デフォルトの名無しさん
12/11/13 20:32:21.56
>>351
Minecraft
359:デフォルトの名無しさん
12/11/14 13:53:30.81
何だよ
type family Mutable v :: * -> * -> *
Mutable v s a is the mutable version of the pure vector type v a with the state token s
って
リワハじゃ習わなかったぞ
360:デフォルトの名無しさん
12/11/14 15:21:27.75
トップレベルの関数の型宣言で
Unbox a => ……としたとして
letやwhereと続けた内部関数にも型宣言をつけるとします
このとき、その宣言でもトップレベルの a と同じ型を指定する為にはどうしますか?
361:デフォルトの名無しさん
12/11/14 18:30:25.04
関数を生成する関数 :: Unbox a => 内部関数の型 -> トップレベル関数の型
トップレベル関数 = 関数を生成する関数 内部関数 where 内部関数 = …
362:デフォルトの名無しさん
12/11/14 19:30:01.00
>>360
Lexically scoped type variables の事かな
363:デフォルトの名無しさん
12/11/19 07:06:57.78
関数内使わないほうが読みやすく感じる
whereって必要ですか?
364:デフォルトの名無しさん
12/11/19 07:07:41.13
s/関数内/関数内の関数定義/
365:デフォルトの名無しさん
12/11/19 07:37:36.32
さすがに一時束縛なしはハードモードでないの? letのほうが読みやすいということもあまりないでしょう
366:デフォルトの名無しさん
12/11/19 08:06:27.68
関数内関数は自由変数が多くて理解するのが難しいです
トップレベルの関数に持ち上げてしまって、モジュールの機能で外部からは隠して、
自由変数になっていたところは明示的に引数として渡すほうが良いのではないかと
367:デフォルトの名無しさん
12/11/19 08:09:12.81
ケースバイケースなんで
whereが要る要らないの話にはならないと思う
368:デフォルトの名無しさん
12/11/19 08:13:31.56
それはね、長い関数が読み難いだけなんだよ
369:デフォルトの名無しさん
12/11/19 18:06:19.91
自由変数の追いにくさと引数渡しの煩雑さを天秤に掛けた結果、
多くの人はwhereを大量に使うことを選択している
何を読み難いと感じるかは個人差が大きいから、
多数派と違う感性を持ってると生きづらいね
という結論が嫌なら、「読みやすく感じる」よりも客観的な論拠を挙げてください
370:デフォルトの名無しさん
12/11/20 00:03:10.08
プログラムは書くことより読むことのほうが難しいし読むことの方が多い
whereはプログラムを書きやすくできるが読みにくくする
whereを使うのは甘え
371:デフォルトの名無しさん
12/11/20 06:58:26.14
>>366
関数内のスコープに限定するより
モジュール内スコープに広げた方が読みやすい?
頭大丈夫?
372:デフォルトの名無しさん
12/11/20 07:07:32.45
>>370
頭の中で、読みにくいコードを読みやすいコードに書きかえればいいだろ
それができる人は読むことより書くことが多い
373:デフォルトの名無しさん
12/11/20 07:38:40.46
>>363
末尾再帰覚えてない人かな?
where使わず書いたら、引数の数が違うだけで同じ機能の関数が沢山出来上がってしまう
sum ns = sum' ns 0
where
sum' [] v = v
sum' (n:ns) v = sum' ns (n + v)
whereが無ければsum関数とsum'関数の両方が関数を使う側に公開されるか、末尾再帰関数作る度にモジュール書き換えが必要になる
374:デフォルトの名無しさん
12/11/20 08:10:24.50
sum ns = let sum' [] v = v
sum' (n:ns) v = sum' ns (n + v)
in sum' ns 0
375:デフォルトの名無しさん
12/11/20 09:16:11.00
>>372
君、仕事でプログラム書いたことないでしょ?
376:デフォルトの名無しさん
12/11/20 09:29:43.91
どっちも同じだと思えば両方読めるようになるのに、ノイズが気になって読めない
ノイズが少ない方が優れているといってノイズばかり見ている
雑音を無視したら優劣の概念がなくなってしまう
優劣を気にするとデジタルが読めなくなる
377:デフォルトの名無しさん
12/11/20 09:57:34.35
仕事でHaskell使った事ないわーw
378:デフォルトの名無しさん
12/11/20 14:25:22.30
そもそも、お前がいう「仕事」って、受注開発(の賃金労働)のことだろ?
自分で作ったサービスで始める仕事(ビジネス)だったら、言語はなんだっていいんだよ。
ドヤ顔で「仕事でhaskell使ったことないわ」とか恥ずかしすぎるわw
379:デフォルトの名無しさん
12/11/20 14:26:08.12
会社に小遣いもらってる分際が偉そうに、と思うね。
380:デフォルトの名無しさん
12/11/20 14:45:50.00
仕事で戦車使ったことないわ
381:デフォルトの名無しさん
12/11/20 15:35:16.08
ああ、Haskellerってこういうのばっかなのね
382:デフォルトの名無しさん
12/11/20 16:26:57.23
まだ平和な方のスレですよ
383:デフォルトの名無しさん
12/11/20 18:16:34.72
>>366
トップレベルにリフトすれば自由変数が減るかのような錯覚はどこからきた?