関数型プログラミング言語Haskell Part17
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2012/01/02(月) 22:19:28.26ttp://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/
0067デフォルトの名無しさん
2012/01/04(水) 21:53:17.25だけど圏論によい具体例があまりないんだ。
なにかよい例を知っているか?
圏の例は基本的だが,圏の圏の例がより実践的だと思うが。
0068デフォルトの名無しさん
2012/01/04(水) 21:53:23.57[1] return <=< x == x
[2] x <=< return == x
[3] (a <=< b) <=< c == a <=< (b <=< c)
[4] (a <=< b) . f = a <=< (b . f)
どっちがシンプルに思えるかは人に依るかも
0069デフォルトの名無しさん
2012/01/04(水) 22:14:27.60こりゃますます常人には分からんな。
スマンが間単に読み方を教えてくれんかな?
0070デフォルトの名無しさん
2012/01/04(水) 22:18:57.72(<=<)はControl.Monadで定義されてるよ。定義は、
f <=< g = \x -> g x >>= f
0071デフォルトの名無しさん
2012/01/04(水) 22:42:02.17遠回しもくそもないだろ。
0072デフォルトの名無しさん
2012/01/04(水) 22:43:16.38表現が遠回しだとか、それこそ遠回しに伺っても、期待する返事は来ないぞ
(まぁ、単刀直入に訊いても、期待する返事が来るとは限らんけど)
0073デフォルトの名無しさん
2012/01/04(水) 22:46:17.580075デフォルトの名無しさん
2012/01/04(水) 23:02:28.210076デフォルトの名無しさん
2012/01/04(水) 23:03:18.65( ´∀`)< ぬるぽ
0077デフォルトの名無しさん
2012/01/04(水) 23:06:15.650078デフォルトの名無しさん
2012/01/04(水) 23:12:52.940079デフォルトの名無しさん
2012/01/04(水) 23:14:30.33それのどこが何に対して遠回しなのかを説明してくれ
そうすれば、君が >>68 の何に対して遠回しと感じているのか分かるかも知れん
father(son(x)) = x
これは、左辺にある x に対する2個の(この順の)変換が右辺と同等である
という事を示していると思う
このような意味を表すのに father(son(x)) = x を持ち出すのが遠回しと感じるのなら、
君ならどう式で表現するのだろうか?
0080デフォルトの名無しさん
2012/01/04(水) 23:24:29.250081デフォルトの名無しさん
2012/01/04(水) 23:34:44.980082デフォルトの名無しさん
2012/01/04(水) 23:48:28.90>father(son(x)) = x
>これは、左辺にある x に対する2個の(この順の)変換が右辺と同等である
>という事を示していると思う
うん。だがそれはその式を単にそのまま読んだだけだと思うんだ。
なにが言いたいんだこの式は?何が言えてるんだこの式は?とは思わな
いかい?
まあそういうことなんだが、皆さんイライラしているようだし、この辺
で寝るよ。かまってくれてありがとう。
0083デフォルトの名無しさん
2012/01/04(水) 23:55:17.37でも一旦慣れれば問題なくなるし、
この内容を簡潔に表現するにはこの式しかないと思うようになる(f . g = idもあるけど)
モナド則も似たようなもんじゃね
0084デフォルトの名無しさん
2012/01/05(木) 00:09:23.770085デフォルトの名無しさん
2012/01/05(木) 00:22:26.47> だがそれはその式を単にそのまま読んだだけだと思うんだ。
> なにが言いたいんだこの式は?
全く逆だ
「x に対して2個の変換 son と father をこの順で適用したものは x と同等である」
という、たまたま今は日本語で表された 「意味」 が何よりも先に先にある
(この意味を人に伝えるには何かの言語で表す以外ないから、たまたま日本語で表した)
この意味を数式という言語で表せば father(son(x)) = x となる
この意味を英語という言語で表せば・・・
この意味をヒンドゥー語という言語で表せば・・・お任せする
モナド則も意味が先にあって、それをHaskellの式で表す方法のひとつとして >>59 がある
他にも >>68 の様に表す方法もあるし、もしその意味を日本語で表すなら・・・
ということだ
0086デフォルトの名無しさん
2012/01/05(木) 00:31:08.780087デフォルトの名無しさん
2012/01/05(木) 03:04:58.01っていうのが一番簡潔で直接的なモナド則の書き方
>>= は \f->\g->join (fmap g f)によって定義できる二次的なもの
0088デフォルトの名無しさん
2012/01/05(木) 03:54:01.40[2] join . return == id == join . fmap return
0089デフォルトの名無しさん
2012/01/05(木) 14:48:38.070090デフォルトの名無しさん
2012/01/05(木) 14:52:37.50計算論 計算可能性とラムダ計算
買ってみようと思う。
他におすすめある?
0091デフォルトの名無しさん
2012/01/05(木) 14:55:33.270092デフォルトの名無しさん
2012/01/05(木) 15:20:01.290093デフォルトの名無しさん
2012/01/05(木) 15:49:55.57Amazon.com 本店(米)の中古はもっと酷い 916.21 ドル
でも、Amazon.co.uk なら中古が 20 ポンドで売ってる(国際便もあるみたい)
0094デフォルトの名無しさん
2012/01/05(木) 17:09:38.320095デフォルトの名無しさん
2012/01/05(木) 17:47:12.970096デフォルトの名無しさん
2012/01/05(木) 17:49:28.01MITの学生さんだって。みな頑張れ
0097デフォルトの名無しさん
2012/01/05(木) 17:53:03.61どうせ大学の図書館探したら転がってるだろうから、みることは可能だろうよ。
0098デフォルトの名無しさん
2012/01/05(木) 18:37:14.150099デフォルトの名無しさん
2012/01/05(木) 18:46:42.960100デフォルトの名無しさん
2012/01/05(木) 18:51:23.550101デフォルトの名無しさん
2012/01/05(木) 19:17:34.368000年過ぎた頃からもっと繰り返したくなった
0102デフォルトの名無しさん
2012/01/05(木) 20:56:35.84そうだね。
>>86
むしろ定義しか使わん。公式を使ったことはあまりないが。
>>85
>「x に対して2個の変換 son と father をこの順で適用したものは x と同等である」
数学世界の閉じこもりならそれでよいが、それでは世間と話ができんだろ。
>>84
理解できてる、理解できてない、なんてことはまあつまらんことだ。
0103デフォルトの名無しさん
2012/01/05(木) 22:02:39.10何を分かってないのか分からんのじゃないかと思う。
0104デフォルトの名無しさん
2012/01/05(木) 22:14:39.66[1] モナド則の意味をできるだけ平易な日本語で表現してほしいのか、
[2] 単にライブラリドキュメントに書かれたモナド則の表現が遠回しだと言いたいだけか
[3] それ以外の事が言いたいのか
[1] なら素直にそう言え
[2] なら言いたいだけ言っていれば良い
[3] ならハッキリと意思を伝えろ
0105デフォルトの名無しさん
2012/01/05(木) 22:18:19.52ネタでやってるとしか思えないぐらい質問が要領を得ない
0106デフォルトの名無しさん
2012/01/05(木) 22:49:24.22Haskellの範囲で定義されていないことをわざわざ調べて付け足す必要はない
0107デフォルトの名無しさん
2012/01/05(木) 23:04:55.33あのhom(FY,X) = hom(Y,GX)という定義式がなぜねじれた形になってるのか、
ずっと疑問だった。
0108デフォルトの名無しさん
2012/01/06(金) 10:40:36.540109デフォルトの名無しさん
2012/01/06(金) 10:59:56.720110デフォルトの名無しさん
2012/01/06(金) 12:54:31.230111デフォルトの名無しさん
2012/01/06(金) 15:20:01.72圏論知らないなりに↑の説明読んだんだけど、
>モナド は圏から同じ圏へいくつかの追加の構造を提供する特殊な関手
ってところにちょっと引っかかったので2点質問させてください。
1.例えばInt と Maybe Intは別の圏に存在する対象だと読みながら勝手に想像してたんだけど、
この説明からいくと同じ圏に属していると考えてOK?
あるいは、Dまでいかない、C'ぐらいの内部的な圏みたいな概念がもしかして存在する?
2.Haskellにおいて圏から別の圏への変換にあたる操作って、具体的には何なんでしょう?
0112デフォルトの名無しさん
2012/01/06(金) 16:06:41.22そのリンク先ではHask圏という、Haskellの型が対象で関数の値が射とする圏を考えているので、
その文脈の限りではIntとMaybe Intは同じ圏の対象だと考えて良い。
2.Functor型クラスがHask圏からHask圏への変換(自己関手)を表現していると考えられる。
class Functor (f :: * -> *) where
fmap :: (a -> b) -> (f a -> f b)
この定義の内、f :: * -> *のところがHask圏の対象である型を、別の型に写像する関数を表現している。
また、fmap :: (a -> b) -> (f a -> f b)のところが射を写像する関数を表現している。
0113デフォルトの名無しさん
2012/01/06(金) 16:15:39.92ありがとうございます、1については多分納得しました。
2は質問が悪かったです。
自己関手ではなく、明確に別の圏と考えられるものに変換しているような関手の具体例が
Haskellにあれば教えて欲しかったのです。
0114デフォルトの名無しさん
2012/01/06(金) 16:31:14.92Functor型クラスが別の圏に変換する関手だ、と考えることもできるよ。
何を圏と考えるかの問題。
0115デフォルトの名無しさん
2012/01/06(金) 16:36:15.59書いてから、何を圏とするかで変わるよな、とは思ったのですが意図を汲み取って頂けて嬉しいです。
Hask圏で考えると、Haskellにおいて別の圏にあたる概念はなさそうですね(?)。
0116デフォルトの名無しさん
2012/01/06(金) 16:45:49.97それ俺も分からない。なぜ?
0117デフォルトの名無しさん
2012/01/06(金) 16:48:49.320118デフォルトの名無しさん
2012/01/06(金) 20:58:56.44>>115
よくわからんが、型を集合(Set圏の対象)と考える場合、HaskellのFunctorは
型から型(集合から集合)への対応で、Set圏で完結していると考えられるから
基本無理なんじゃない?
あるとしたら集合からなにか別の対象を構成して圏自体を構成するとか必要になるのじゃないかと思う。
0119デフォルトの名無しさん
2012/01/06(金) 21:59:44.43東京にある6つのキー局の内、製作から財務まで一貫して朝鮮人が行ってるテレビ局が1つ
中国共産党から毎年大量の反日工作費が流れているテレビ局が2つ
もろに北朝鮮と繋がっているテレビ局が1つ
年寄はまだまだテレビという外国人に騙され続ける
0120デフォルトの名無しさん
2012/01/06(金) 22:17:19.97>>110
0121デフォルトの名無しさん
2012/01/06(金) 22:37:50.720122デフォルトの名無しさん
2012/01/07(土) 01:57:09.160123デフォルトの名無しさん
2012/01/07(土) 13:33:31.17Let's join us!
0124デフォルトの名無しさん
2012/01/07(土) 14:49:07.40[1] flip(>>=) f . return == f
[2] flip(>>=) return . f == f
[3] flip(>>=) g . flip(>>=) f == flip(>>=) (flip(>>=) g . f)
この定義から分かることは
f と g と return には flip(>>=) を適用できること
flip(>>=) f の戻り値の型は f の戻り値の型と同じ (引数の型だけ変わる) ということ
つまり、戻り値の型は変えられないが引数の型は変えられるようなものを表現したいんだと思う
0125デフォルトの名無しさん
2012/01/07(土) 15:59:51.70うん。勿論[1]-[3]は、>>=やfなどの型についてのそういう制約を前提にして
いるが、[1]-[3]はそれ以上の条件を表現しているよね。
0126デフォルトの名無しさん
2012/01/07(土) 16:31:12.63== が成立する条件が難しいと思う
f==g なら f の型と g の型は等しいとは思うが、それ以上は難しい
0127デフォルトの名無しさん
2012/01/07(土) 23:46:02.70別の意味があるなら == を定義するべき
0129デフォルトの名無しさん
2012/01/08(日) 10:07:40.920130デフォルトの名無しさん
2012/01/08(日) 10:39:44.400131デフォルトの名無しさん
2012/01/08(日) 11:54:54.22まさしくクソメン。
0132デフォルトの名無しさん
2012/01/08(日) 12:05:09.42だからさ、詳しく説明して欲しいのなら素直にそう言えって何度言ったら・・・
説明を求めていないのなら無視しろよ
0133デフォルトの名無しさん
2012/01/08(日) 12:08:42.390134デフォルトの名無しさん
2012/01/08(日) 12:10:29.13それに無視して暗に黙認を形成することは少なくとも俺には絶対にできない。
そういう表明だ。
0135デフォルトの名無しさん
2012/01/08(日) 12:16:57.290136デフォルトの名無しさん
2012/01/08(日) 12:17:54.40黙認しないのなら、しっかり質問しろ
お前は「嫌いだ」としかまだ言っていない
嫌いだと表明するだけでは残念ながら何も起きないぞ
式だけ書いておけば・・・と言っておきながら、
その式について何も訊いていないだろ
>>130 にとっては、お前がこの式の何が分からないのかが分からない状態だと思うが
0137デフォルトの名無しさん
2012/01/08(日) 12:21:07.73この人は自分で調べないから絶対に具体的な質問出来ない人だよ
0138デフォルトの名無しさん
2012/01/08(日) 12:24:51.53何か起こす?そんなの期待してるから何も出来ないんだよ。
そもそも圏論はスレ違いだ。
0139デフォルトの名無しさん
2012/01/08(日) 12:32:03.120140デフォルトの名無しさん
2012/01/08(日) 12:34:44.100141デフォルトの名無しさん
2012/01/08(日) 12:49:17.630142デフォルトの名無しさん
2012/01/08(日) 13:05:02.48不粋だな
0143デフォルトの名無しさん
2012/01/08(日) 13:07:29.45これをどうやって実現してるかというと、どうやら展開時に自分自身が記述されてるファイルをIO使って読み込んで解析してるらしい
よく聞くコンパイルタイムIOという空恐ろしいものはこうやって使うのかといういい実例だと思ったね
0144デフォルトの名無しさん
2012/01/08(日) 13:15:03.18template haskell って地味に良い拡張機能だよな
HaskellDB で使って実感したわ
対応した IDE ができるともっと良いが
0145デフォルトの名無しさん
2012/01/08(日) 13:20:27.440146デフォルトの名無しさん
2012/01/08(日) 14:15:39.33IDE で言語選ぶわけじゃないし
0147デフォルトの名無しさん
2012/01/08(日) 14:16:43.080148デフォルトの名無しさん
2012/01/08(日) 14:55:26.81そして英雄となれ
0149デフォルトの名無しさん
2012/01/08(日) 14:56:05.77あなたはIDEで言語を選ばないの?
多くの人はIDEで言語を選ばないの?
すべての人はIDEで言語を選ばないの?
0150デフォルトの名無しさん
2012/01/08(日) 15:02:26.580151デフォルトの名無しさん
2012/01/08(日) 15:03:00.330152デフォルトの名無しさん
2012/01/08(日) 15:15:52.21ghc-mod って、template haskell に対応してたっけ
たとえば、Template haskell のチュートリアルに
-------------------------------
module TupleReplicate where
import Language.Haskell.TH
tupleReplicate :: Int -> Q Exp
tupleReplicate n = do id <- newName "x"
return $ LamE (VarP id)
(TupE $ replicate n $ VarE id)
-------------------------------
という例がある
$(tupleReplicate 2) が a -> (a, a) という型の関数
$(tupleReplicate 3) が a -> (a, a, a) という型の関数
と ghc-mod は教えてくれる?
言っておくが、ghc-mod がクソとか役に立たんと言ってるわけではない
0153デフォルトの名無しさん
2012/01/08(日) 15:19:15.80やったことないです、、、
@kazu_yamamotoさんに聞いてみルトいいかも
0154デフォルトの名無しさん
2012/01/08(日) 15:25:29.61もちろん言語選択時に考慮するだろ
0155デフォルトの名無しさん
2012/01/08(日) 15:27:02.910156デフォルトの名無しさん
2012/01/08(日) 15:36:00.480157デフォルトの名無しさん
2012/01/08(日) 15:40:42.17foo = $(tupleReplicate 2)と展開した上で名前に束縛すればfooについて当然型名がかえって来るけど
確かhaskellのインタプリタ(not ghci)が走ってるプロセスを持ってて
バッファの内容を食わせた上で指定した文字列でそいつに問い合わせてるから、
トップレベルで名前を持ってない定義だと上手く参照してくれないんじゃないかと思う
0158デフォルトの名無しさん
2012/01/08(日) 15:59:20.600159デフォルトの名無しさん
2012/01/08(日) 17:11:37.66> よくわからんが、型を集合(Set圏の対象)と考える場合、HaskellのFunctorは
> 型から型(集合から集合)への対応で、Set圏で完結していると考えられるから
> 基本無理なんじゃない?
結局は、解釈、モデル化の仕方の問題だけど、
関数以外のArrowクラスのインスタンスを射として考えるならば、
それはHask圏=Set圏の射ではないから、
Hask圏の部分圏と考えることはできない圏を考えていることになる
0160デフォルトの名無しさん
2012/01/08(日) 19:13:49.14/::::::::::::::::::::::::::::::;;::ノ ヽ;::\
/::::::::;;;;;;;;;,,,;;...-‐''"~ ヽ:;::l
|:::::::::::| 岡田 異音 |ミ|
|:::::::/ ,,, ヽ,、 '|ミ|
'|:::::::l '''"" ゙゙゙゙` |ミ|
|:::::|. ,,r ‐、 ,, - 、 |/
,/⌒| ノ ・ _), (. ・ `つ|
| ( "''''" |"'''''" |
ヽ,,. ヽ |
| ^-^_,, -、 |
| _,, --‐''~ ) | マニフェストもう守れない。どうしよう・・・・
'ヽ ( ,r''''''‐-‐′ /
震災後
|:::::::::/ |ミ|
|::::::::| ,,,,, ,,,,, |ミ|
|彡|. '''"""'' ''"""'' |/
/⌒| -=・=‐, =・=- |
| ( "''''" | "''''" |
.ヽ,, ヽ .| キリッ
| ^-^ |
. | ‐-===- | 大震災が起こったのだからマニフェストの破綻も致し方ありません
,\. "'''''''" /
朝鮮民主党
おわり
0161デフォルトの名無しさん
2012/01/09(月) 20:15:30.30x=10
x=11
これってHaskellでどう書くの?
0162デフォルトの名無しさん
2012/01/09(月) 20:19:11.150163デフォルトの名無しさん
2012/01/09(月) 20:36:13.49関数型は変数の意味が違うよ。適当な教科書を読んでみましょう
0164デフォルトの名無しさん
2012/01/09(月) 20:41:21.78main = do
let x = 10
let x = 11
print x
0165デフォルトの名無しさん
2012/01/09(月) 21:27:31.04サンクス
0166デフォルトの名無しさん
2012/01/09(月) 23:34:33.20main =
let x = 10 >>
let x = 11 >>
print x
■ このスレッドは過去ログ倉庫に格納されています