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

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

レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん2012/03/16(金) 21:54:23.92
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/
0951デフォルトの名無しさん2012/06/25(月) 22:07:13.71
ある人にとって当たり前のコードが、他の人には無駄にトリッキーな糞コードに見えたり、
また別の人には無駄に冗長な初心者くさいコードに見えるるということは普通にある(他の言語でもあると思うけど)
チームで仕事してるなら、そのチームにとってどういうコードが常識的か把握しとけって話になるけど、
webに置いてあるコードとかなら文句を言いながらでも頑張って読むしかない
0952デフォルトの名無しさん2012/06/25(月) 22:08:23.32
つまり>>910をエラーにして欲しいひとは
ユーザ定義演算子も高階関数もカリー化も無い言語を使えば良いんだよ
そんな言語なんて山ほどあるだろ
Haskell使う必要ない
0953デフォルトの名無しさん2012/06/25(月) 22:11:46.90
>>944
よく分らない部分がある。

> 2chやフォーラムに書き込んで「俺だけが知っててスゲーだろ」と思った以外に使い道がなかった仕様

これは、具体的にはどんな仕様のことを指しているの?
Haskell 2010 Language Report(http://www.haskell.org/onlinereport/haskell2010/
この中から、これが一例だというものは挙げられる?

それとも、今後そのような仕様が見つかった場合には削除してほしいという意味?
それならたぶん、今までもいくつか行われてきたような気がする。
例えば recursive do 表記とか。
まぁ、これはやはり役立つからと後でまた復活したけど。
0954デフォルトの名無しさん2012/06/25(月) 22:15:29.93
>>953
あぁ、すまん
例が悪かったか

recursive do は Haskell の仕様じゃなくて、
コンパイラ GHC の方の仕様だったかも
0955デフォルトの名無しさん2012/06/25(月) 22:20:02.83
>>952-953
やっぱり、エラーにするのは不都合が大きいので、そういうコードを書いた人をイジメぬいて退社させればいいと思う
0956デフォルトの名無しさん2012/06/25(月) 22:50:14.21
((.).(.))を使ったほうが分かり易いなら構わんだろ、とは思うが
\x y z -> x + y ^ z

flip ((.).(.))(^).(+)
と書くやつが居たら殴っていい
0957デフォルトの名無しさん2012/06/25(月) 22:51:13.64
>>944
> 仕様から削除できないなら、今までのプログラム人生で、2chやフォーラムに書き込んで「俺だけが知っててスゲーだろ」と思った以外に使い道がなかったコードを書くなというお願いです

最後が曖昧で、俺は「そういうコードを公の場に晒すな」という意味で捉えたけど、あってる?

もしそうだとしたら、そのお願いが叶えられることは、今後まずないと思う。

と言うかそれは、コードを読む側が「自分にとっては役に立たない単なる自慢コード」
なのかを今の自分の能力を総動員して見極める事柄じゃないの?

Haskell のコードに限らず、ネットに公開されている情報全てに言えることでしょ。
役に立つかどうかに限らず、嘘か本当かという話にも繋がる。

一対一の教師と生徒という関係ならまだ分らなくもないけど、
コードを公開する全くの赤の他人にそれをお願いするのは、怠慢だと思うよ。
0958デフォルトの名無しさん2012/06/25(月) 22:57:28.02
めんどくさいスレだなあ
0959デフォルトの名無しさん2012/06/25(月) 23:08:53.82
>>957
書いた本人には、「『書いた本人にとって』自慢する以外に役に立たないコードかどうか」判断できないってこと?
もし判断できないなら、病院に行った方がいいと思う
もし判断できていて、本当に自慢以外に役に立たないと判断していたら、自分のやってることは悪いことだと自覚すべきだと思う
0960デフォルトの名無しさん2012/06/25(月) 23:12:21.14
「仕様から削除しろ」の話はもうやめにしませんか?
0961デフォルトの名無しさん2012/06/25(月) 23:23:40.83
gcdをポイントフリーで(.)とmodのみを使って書けという問題が解けません
条件とラムダを使わないと無理ですよね
0962デフォルトの名無しさん2012/06/25(月) 23:31:23.00
>>959
本当にそれが「悪い」とまで言えるのか、誰にとってどれほど「悪い」のか、
という話はとりあえず置いておくとして。

そういう気持ちは分るし、役立つものだけが公開されるようにしようという
貴方の運動や働きかけを否定している訳ではないんだ。

ただ、お願いするだけなら、その願いは叶えられないと思うよ。
そんな甘くはない。

そして、ネット上に誰もが簡単に自由にどんな情報でも発信できる今の時代、
受け手側が自分の責任で情報を解釈できる力を求める気運が高まってるのは事実。

受け手側の能力を高める運動や働きかけをした方が、良い方向へ向うスピードは速いと思うな。
0963デフォルトの名無しさん2012/06/25(月) 23:35:09.41
もうええやろ
0964デフォルトの名無しさん2012/06/25(月) 23:35:25.12
(.)(.)おっぱい
0965デフォルトの名無しさん2012/06/25(月) 23:44:33.14
ポイントフリー病患者がキモいのはよく解った
0966デフォルトの名無しさん2012/06/25(月) 23:46:25.13
頭おかしいんだね
可哀想に
0967デフォルトの名無しさん2012/06/25(月) 23:50:28.03
>>961
それは、使える関数は mod のみ、使える演算子は (.) のみ、という意味か?
0968デフォルトの名無しさん2012/06/25(月) 23:58:01.51
>>967
はい
gcd' = (.)(.)(.) gcd' mod
みたいなかんじで
0969デフォルトの名無しさん2012/06/26(火) 00:19:14.61
>>968
モジュロ計算と、自身の再帰的定義だけで
最大公約数って求められるものだったっけ?
0970デフォルトの名無しさん2012/06/26(火) 00:22:38.47
if が欲しいね
パターンマッチ?
0971デフォルトの名無しさん2012/06/26(火) 01:07:08.94
>>966
そんな脊髄反射するほどのことか?
0972デフォルトの名無しさん2012/06/26(火) 01:26:08.17
ポイントフリー病って言葉にトラウマでもあるんだろう
0973デフォルトの名無しさん2012/06/26(火) 01:39:35.40
gcd 0 y = y
gcd x 0 = x
これは書いてよくて、一般的な場合だけポイントフリーにするならいけるんじゃない?
0974デフォルトの名無しさん2012/06/26(火) 02:49:42.80
gcd' 0 y = y
gcd' x 0 = x
gcd' x y = gcd'' x y
gcd'' = (\x y -> gcd' (mod x y) (mod y x))
この最後の行をポイントフリーにするってことか。考えたけど解らん
0975デフォルトの名無しさん2012/06/26(火) 08:28:42.18
gcd' (0,y) = y
gcd' (x,0) = x
gcd' (x,y) = gcd'' (gcd', (x, y) )
gcd'' = second (uncurry mod &&& uncurry (flip mod)) >>> app
使う関数をun/curriedどちらかに統一しないとcurryとuncurryが乱舞するから困る

あと無理やり全部ポイントフリーにするにしても
gcd' :: Integral a => (a,a) -> a
gcd' = loop $ swap >>> app &&& (fst >>> curry (cond ((==0) . fst .snd) >>> snd . snd ||| (cond ((==0) . snd . snd) >>> fst . snd ||| (second (uncurry mod &&& uncurry (flip mod)) >>> app))) )

cond :: (a -> Bool) -> a -> Either a a
cond p x = if p x then Left x else Right x

swap :: Arrow a => a (b,c) (c,b)
swap = arr snd &&& arr fst
ってな感じで分岐とか入れ替えが必要になるから(.)だけとかは無理っぽいように思える
自然数をλ式にエンコードする所までやればSKだけでいけるかもしれんけどそれこそesolang translatorでやれという話だし
0976デフォルトの名無しさん2012/06/26(火) 10:01:52.37
そもそも単に「ポイントフリースタイルで書け」では、何を「プリミティブ」とするかが決められないからな…
ちなみにsを使えば
dot2 s (.) ( dot2 s (.) gcd' ) mod ( flip mod )

※参考
dot2 s (.) f g h x = f ( g x )( h x )

で(多分)動く…
0977デフォルトの名無しさん2012/06/26(火) 10:18:22.05
あ、>>961ではプリミティブは(.)のみと規定されてるか…
(.)だけで、1つの引数を複数箇所で使用することは可能なのかな…
0978デフォルトの名無しさん2012/06/26(火) 10:52:46.56
BコンビネータだけでLコンビネータを作るという問題
0979デフォルトの名無しさん2012/06/26(火) 11:14:22.07
関数山手線ゲーム

1.関数を1つ決めます
2.既存の関数の集合からは定義できない関数を1つ挙げます
3. 2.で挙げられた関数を、既存の関数の集合に加えます

2.と3.を繰り返します

2.で挙げた関数が以下のいずれかの条件を満たすと負けです
・既存の関数から定義可能
・既存の関数の集合にその関数を加えるとチューリング完全にる(λxy.xとλxyz.xz(yz) が定義可能になる)

他の人が挙げた関数がいずれかに該当していると思ったら、指摘して証明しましょう 証明できたらその人の負け 証明できなければあなたの負けです!

※関数の型に、「関数型」を除く具体的な型や型制約があってはいけません つまり、関数の型は、Haskell表記で、小文字英数字と()と->だけで表されなくてはいけません
数値関数や文字列関数、リスト関数等は不可ということです


家族と、友達と、恋人と、大いに盛り上がること間違いなしですね!!!
0980デフォルトの名無しさん2012/06/26(火) 15:55:42.83
>>979
チューリング完全しばりこぇー
0981デフォルトの名無しさん2012/06/26(火) 16:33:03.71
>>980
そのルールがないと、sとkを挙げた時点で終了してしまいますからね
0982デフォルトの名無しさん2012/06/26(火) 16:48:31.56
>>917
C言語の関数ポインタもトリッキーで何やってるのか解
らないコードになるから全面禁止すべきだよな。

というかそもそもC言語はポインタが初心者に理解できないんだから
仕様でポインタなくすべきだ。初心者に保守できない言語はみんなクソ。

英文科出身でワードとエクセルしかできない俺にでも理解できる
言語をみんな作るべき。そうじゃないならつくった奴が馬鹿アホ間抜け
だということ。

初心者最強。誰でも生まれたときは初心者。初心者は神。
0983デフォルトの名無しさん2012/06/26(火) 17:25:05.21
読めないものを書く権利をなくすのではなく、読めないものを読む義務をなくせばいい
0984デフォルトの名無しさん2012/06/26(火) 18:00:19.14
まだやってんのか……
0985デフォルトの名無しさん2012/06/26(火) 18:02:20.23
翻訳の質の話題がやっと収束したら思ったら、今度はポイントフリーを構文的に禁止しろか…
ホントどうでもいい話題ほど止まらんよな、このスレ…。
0986デフォルトの名無しさん2012/06/26(火) 18:03:42.99
成功を全力で回避するのをやめれば、自転車置き場の議論が発生するのは不可避だ。
0987デフォルトの名無しさん2012/06/26(火) 18:17:23.65
成功する義務を全力で回避する
つまり安全神話を回避
0988デフォルトの名無しさん2012/06/27(水) 06:23:47.45
■ 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]
0989デフォルトの名無しさん2012/06/27(水) 06:59:55.10
[1..5]くらい使え
0990デフォルトの名無しさん2012/06/27(水) 07:05:53.77
無限リストとはなんだったのか
0991デフォルトの名無しさん2012/06/27(水) 08:01:09.39
>>988
もうPythonでもリスト内包表記使えるぞと指摘するのに疲れた
print([x*2 for x in [1, 2, 3, 4, 5] if 2 < x < 5])
0992デフォルトの名無しさん2012/06/27(水) 08:34:15.60
python の
[hoge(変数) for 変数 in [〜] if 条件]
の構文(後置 if ?)って
リスト内包のときしか使えない?
for 変数 in [〜] if 条件:
  hoge(変数)
ってやるとおこられる
気のせい?
0993デフォルトの名無しさん2012/06/27(水) 09:21:31.30
リスト内包/ジェネレータ式のみだよ
for 変数 in [〜 if 条件]:
ならできる
0994デフォルトの名無しさん2012/06/27(水) 09:21:31.87
python初心者スレでどうぞ
0995デフォルトの名無しさん2012/06/27(水) 10:21:52.35
次スレ
ttp://toro.2ch.net/test/read.cgi/tech/1340760070/
0996デフォルトの名無しさん2012/06/27(水) 10:28:29.80
Python3って消えたな
0997デフォルトの名無しさん2012/06/27(水) 10:44:45.38
>>993
ありがとう
0998 忍法帖【Lv=40,xxxPT】 2012/06/27(水) 12:11:49.10
誘導&うめてんてー

次スレ
ttp://toro.2ch.net/test/read.cgi/tech/1340760070/
0999 忍法帖【Lv=40,xxxPT】 2012/06/27(水) 12:12:35.08
誘導っす

次スレ
ttp://toro.2ch.net/test/read.cgi/tech/1340760070/
1000 忍法帖【Lv=40,xxxPT】 2012/06/27(水) 12:13:16.35
完走!

次スレ
ttp://toro.2ch.net/test/read.cgi/tech/1340760070/
10011001Over 1000Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。