関数型プログラミング言語Haskell Part6
レス数が900を超えています。1000を超えると表示できなくなるよ。
0001デフォルトの名無しさん
2006/11/07(火) 21:24:26http://www.haskell.org/
日本語サイト
http://www.sampou.org/cgi-bin/haskell.cgi
http://shidot.dyndns.org/hs/
過去ログ
関数型プログラミング言語Haskell
Part1 http://pc.2ch.net/tech/kako/996/996131288.html
Part2 http://pc2.2ch.net/test/read.cgi/tech/1013846140/
Part3 http://pc8.2ch.net/test/read.cgi/tech/1076418993/
Part4 http://pc8.2ch.net/test/read.cgi/tech/1140717775/
Part5 http://pc8.2ch.net/test/read.cgi/tech/1149263630/
関連スレは>>2
関連書籍は>>3
・2chの仕様により、行頭の半角スペースは表示されません。
コードをインデントしたいときは、代わりに または全角スペースを使うことができます。
0809デフォルトの名無しさん
2007/02/18(日) 13:11:550810デフォルトの名無しさん
2007/02/18(日) 13:49:100811デフォルトの名無しさん
2007/02/18(日) 14:21:23バルバロイはすっこんでろ!
0812デフォルトの名無しさん
2007/02/18(日) 16:17:190813デフォルトの名無しさん
2007/02/18(日) 16:53:02海草なども使えばいいってことですか?
0814デフォルトの名無しさん
2007/02/18(日) 22:07:240815デフォルトの名無しさん
2007/02/18(日) 22:28:200816デフォルトの名無しさん
2007/02/18(日) 23:24:26Haskelになんとなく関わっていることで自分が賢くなったと思い込みたい人間が大半だからな。
その事実をはき違えて、スレの流れをHaskell本来のレベルに引き上げてもらっては困る。
0817デフォルトの名無しさん
2007/02/19(月) 01:11:27使われることばかり宣伝されるのが,悪影響なんだと思う.
モナドは,副作用どころではなく,もっと広いクラスの計算を
統一的な枠組みで定式化できることが本当の利点だと思うし,
副作用に限定しても,どのような副作用が入るかを厳密に
定式化できる構造を与えられることのほうが大切と思うがなあ.
0818デフォルトの名無しさん
2007/02/19(月) 01:34:21圏論って勉強するの大変ですか?
集合論と郡論まではなら勉強したことあります
0819デフォルトの名無しさん
2007/02/19(月) 01:45:56勉強できればいいってこと? そうなら、まあまあ簡単。
PierceとかBarr,Wellsを読んで、具体的な分野の論文見れば
あっさりと追いつける。分からなかったら辞書的にMacLane。
0820デフォルトの名無しさん
2007/02/19(月) 03:11:00こんなところで質問する程度のやる気では無理
0821デフォルトの名無しさん
2007/02/19(月) 17:35:02その質問に対して現状においてもっとも適切に答えをくれる場所
あるだろ・・・。
0822デフォルトの名無しさん
2007/02/19(月) 18:02:06IOモナドは他のモナドとちがって
随伴使ったモナドと解すべきなんだと思う。
つまり
普通のモナド: Maybe, List, etc..
随伴で構成されたモナド: IOモナド
IOモナドで全部副作用と名のつくものを一括で処理しているのが
いろいろな鯨飲の元なんだと思う。
IOモナドを役割ごとにもっと分割させないと。
本当にIOモナドはI/Oだけ扱えばいいんだと思う。
0823デフォルトの名無しさん
2007/02/19(月) 18:02:53○原因
0824デフォルトの名無しさん
2007/02/19(月) 18:49:00この本ですか?
http://www.cis.upenn.edu/~bcpierce/tapl/index.html
0825デフォルトの名無しさん
2007/02/19(月) 18:50:02psファイルがあるのですね
http://www.let.uu.nl/esslli/Courses/barr-wells.html
0826デフォルトの名無しさん
2007/02/19(月) 19:55:30函手F上のモナドってなんだ?
あんまりよくわかっていないことを言わないほうがいい。
モナドは函手じゃなくて圏の上で構成される構造だ。
だから「自己」函手なわけだよ。
0827デフォルトの名無しさん
2007/02/19(月) 19:56:52すまん。訂正。どんどんいってけーーーー。
俺もよくわかってないし。
0828デフォルトの名無しさん
2007/02/19(月) 20:52:05> 随伴で構成されたモナド: IOモナド
これってどういう意味?
IO monad = (IO, η, μ)
のIOが、何かの左 or 右随伴になってるってこと?
Listだって集合の左随伴だと思うが…
0829デフォルトの名無しさん
2007/02/19(月) 20:53:18集合へのforgetful functorの随伴ね
0830デフォルトの名無しさん
2007/02/19(月) 21:20:57モナド (F,η,μ) で,特に F を明示したい場合に "monad over F" という
言い方をすることがあるので,それほど変ではないと思うよ.
0831デフォルトの名無しさん
2007/02/19(月) 21:34:40こういう話に追いつけるのはいつになることやら。
0832デフォルトの名無しさん
2007/02/19(月) 22:05:34!!!
マジで!ちょっとまてわからん。orz
orz
0833デフォルトの名無しさん
2007/02/19(月) 22:09:08あー。早とちり。
>のIOが、何かの左 or 右随伴になってるってこと?
そういう意味じゃない。どういう意味かと聞かれたら
そこを現在勉強中です。
うまく答えれません。正直そんなナチュラルに答え返されるとは思わなかった。
0834デフォルトの名無しさん
2007/02/19(月) 22:16:50モナドと随伴は一対一対応する.
(随伴が与えられると,そこからモナドが構成できる.逆に,
任意のモナドに対して,それを構成するような随伴が存在する)
よって IO に対してそれに対応する随伴があるのは当然.
ということを言おうとしてると思って,IO の随伴を求めたけど
全然直感的でないものしか得られなかった.
これって何か解釈あるのかな? 参考文献お願いします.
0835833
2007/02/19(月) 22:18:07ちょうどそれを考えられる材料がそろってきたので。
期待しないでください。
0836デフォルトの名無しさん
2007/02/19(月) 23:30:53それともどれかがより大きな記述力があるの?
なんで圏論なのさ?チューリングマシンでは駄目なのかよ!
チューリングがホモだからって差別してんじゃないわよ!
0837デフォルトの名無しさん
2007/02/20(火) 00:02:47コンマ圏がマンコ圏に見えて困るでしょ?
0838デフォルトの名無しさん
2007/02/20(火) 01:50:36モナドを構成する随伴は一般に複数あってそのうちの一方の端が Eilenberg-Moore の
構成でもう一方の端が Kleisli の構成、だよね。
端というのはある圏の始対象と終対象という意味で。
0839デフォルトの名無しさん
2007/02/20(火) 02:46:29今の最強はhaskellでしょうか?
http://www.shiro.dreamhost.com/scheme/trans/beating-the-averages-j.html
この人達が絶賛するlispのマクロに対応する機能も
haskellは持ってるのでしょうか?
0840デフォルトの名無しさん
2007/02/20(火) 02:49:250841デフォルトの名無しさん
2007/02/20(火) 14:18:13Haskellにはマクロはない。
Lispのことは良く知らないけど、記述力という点で
Haskellより弱いとは思えない。
0842デフォルトの名無しさん
2007/02/20(火) 14:55:200843デフォルトの名無しさん
2007/02/20(火) 15:35:07第一級の関数とかマクロとかパターン照合とかが使えるかどうかが大きいと思う。
0844デフォルトの名無しさん
2007/02/20(火) 16:14:12それは記述力とは関係なくて、エラー抑制の効果があるだけ。
0845デフォルトの名無しさん
2007/02/20(火) 18:53:11その結果、Lispの方がちょっとHaskellよりも記述力が高いのですよ。
でも、多くの場面では、カチカチの型が憑いているメリットの方が大きいと思うけれど。
0846デフォルトの名無しさん
2007/02/20(火) 19:30:22Data.Dynamicを使える訳で、そうしないのは気持ちの問題に過ぎないのかも。
型安全でないHaskellライブラリなんて寒気がする、とか。
0847デフォルトの名無しさん
2007/02/20(火) 20:01:39マクロをエラー抑制だけと言い切るのはちょっとw
ttp://www.shiro.dreamhost.com/scheme/wiliki/wiliki.cgi?Scheme%3a%e3%83%9e%e3%82%af%e3%83%ad%e3%81%ae%e5%8a%b9%e7%94%a8
0848デフォルトの名無しさん
2007/02/20(火) 20:04:38メタな要素がまざると、型とか意味論的に都合が悪いのかな
0849デフォルトの名無しさん
2007/02/20(火) 22:41:560850デフォルトの名無しさん
2007/02/20(火) 22:43:040851デフォルトの名無しさん
2007/02/20(火) 23:01:37LispのevalはLispの世界で定義されている。
この差は大きいと思う。
0852デフォルトの名無しさん
2007/02/20(火) 23:02:53性的なほうがいいね!
0853デフォルトの名無しさん
2007/02/20(火) 23:11:08きつい方が気持ちよい
0854デフォルトの名無しさん
2007/02/24(土) 00:52:28圏論の基礎は数学者向けの基礎なので、
普通の人は違う本を読んだほうがいいらしい。
0855デフォルトの名無しさん
2007/02/24(土) 01:58:15これから初心者の俺が朝まで生Haskellやろうかと思うんだけど
おまえら実況板並みに教えてくれないか?
0856855
2007/02/24(土) 06:05:170857デフォルトの名無しさん
2007/02/24(土) 09:34:02ワロタ
0858デフォルトの名無しさん
2007/02/24(土) 17:37:24だってだれもレスくれねーんだもん
バベル見て寝たわ
0859デフォルトの名無しさん
2007/02/24(土) 18:05:10夜中の2時にいきなりでレスも糞もねーだろw
VIPじゃねーんだぞwwww
昼間に犯行予告をしとけよ
0860デフォルトの名無しさん
2007/02/24(土) 18:43:300861デフォルトの名無しさん
2007/02/24(土) 19:01:360862デフォルトの名無しさん
2007/02/25(日) 02:59:15∩___∩
|ノ⌒ ⌒ ヽ
/ ●) ●) |
Let's | ( _●_) ミ Haskell♪
彡、 |∪| 、`
/ ヽノ ヽ
/ 人 \\ 彡
⊂´_/ ) ヽ__`⊃
/ 人 (
(_ノ (_)
0863デフォルトの名無しさん
2007/03/03(土) 00:14:49い ま か ら ハ ス ケ る か ら お し え て く れ
0864デフォルトの名無しさん
2007/03/03(土) 00:36:300865デフォルトの名無しさん
2007/03/03(土) 00:41:35Map関数までしかすすんでないんだけど、
いきなりWikiつくりはじめちゃうぞーー
0866デフォルトの名無しさん
2007/03/03(土) 01:00:05ちょwwwそれ無謀wwwwwww
0867デフォルトの名無しさん
2007/03/03(土) 02:24:520868デフォルトの名無しさん
2007/03/03(土) 02:29:12基礎を勉強したところでコードは書けるようにならないじゃない
なんか作ろうとしたほうが5倍くらい早くおぼえれる
そうだろ?父さん!
0869デフォルトの名無しさん
2007/03/03(土) 02:54:28君が一番上達する方法はしらないから、自由にすればいいよ。
0870デフォルトの名無しさん
2007/03/03(土) 02:57:200871デフォルトの名無しさん
2007/03/03(土) 09:58:100872デフォルトの名無しさん
2007/03/03(土) 12:54:390873デフォルトの名無しさん
2007/03/03(土) 16:31:01Haskellでそれができるとしたら「型」の概念に対して
相当鋭敏な感覚を持ってないとむつかしいような気がする。
javascriptとかだったらなんとなく見よう見まねで動きそうな気もするが。
0874デフォルトの名無しさん
2007/03/04(日) 00:46:42import Prelude hiding(either)
import Control.Monad.List
both, either :: a -> a -> ListT [] a
both a b = return a `mplus` return b
either a b = lift [a,b]
main = do
-- Both Bill and Mary loves either Martha or John.
print $ runListT $ do
lover <- both "Bill" "Mary"
lovee <- either "Martha" "John"
return $ lover ++ " loves " ++ lovee
-- Either Martha or John is loved by both Bill and Mary.
print $ runListT $ do
lovee <- either "Martha" "John"
lover <- both "Bill" "Mary"
return $ lover ++ " loves " ++ lovee
結論: 自然言語にも副作用があるというのにHaskellときたら(略
0875デフォルトの名無しさん
2007/03/04(日) 14:31:37こんな書き方できるの初めて知った
0876デフォルトの名無しさん
2007/03/06(火) 23:57:05こういうプログラムをつくってみようと思い立ってもまったく書けない
あれ?文法どうだったっけ?みたいな
0877デフォルトの名無しさん
2007/03/07(水) 00:13:36手続き型言語で培った慣れが役に立ちにくいというだけであって、
学習の難しさはさほど変わらないんじゃなかろうか。
初めてプログラミングを習った人は大抵、
「思い立っても全く書けない」状態を経験するだろう。
0878デフォルトの名無しさん
2007/03/07(水) 10:43:060879デフォルトの名無しさん
2007/03/07(水) 20:46:20ふつうのHaskellプログラミングでMAP関数のとこまでは読んだ
0880839
2007/03/07(水) 21:28:52cのプリプロセッサを強引に前処理としてかませば
lispのマクロと同じことができるかも
0881デフォルトの名無しさん
2007/03/07(水) 21:36:550882デフォルトの名無しさん
2007/03/07(水) 21:37:05テキストファイルの各行を30文字に切り詰めるプログラム。
0883デフォルトの名無しさん
2007/03/07(水) 21:39:07Cプリプロセッサは実質的にチューリング完全だから能力は十分だけど、
Haskellの方がメタなことをするのに適していないような気がする。
例えば、局所的に型を宣言することができないとか。
0884デフォルトの名無しさん
2007/03/07(水) 22:49:05>Cプリプロセッサは実質的にチューリング完全だから能力は十分
これってホント?ループがかけないような
0885デフォルトの名無しさん
2007/03/07(水) 22:49:530886デフォルトの名無しさん
2007/03/07(水) 22:50:390887デフォルトの名無しさん
2007/03/07(水) 23:20:390888デフォルトの名無しさん
2007/03/07(水) 23:46:56ところで、どうもまだ混乱しているんですが、自己includeのループをどう止
めたものかがわりません。 ifdef とかで何とかなるもんなの? define の再
定義では上手く行かないと思うんだけど。
たとえば階乗を計算するコードって、どんな概形になりますか?
# スレ違いすぎ?
0889デフォルトの名無しさん
2007/03/07(水) 23:48:14でループはできる
0890839
2007/03/07(水) 23:55:48http://practical-scheme.net/wiliki/wiliki.cgi?Scheme%3aScheme%e3%83%97%e3%83%ad%e3%82%b0%e3%83%a9%e3%83%9e%e3%81%ae%e3%83%ac%e3%83%99%e3%83%ab10
まだレベル1から2ぐらいです
これ以上勉強したらhaskellには戻ってこないと思う
0891デフォルトの名無しさん
2007/03/08(木) 00:11:56適当だけどこんなん用意して
#include<boost/preprocessor/slot/slot.hpp>
#ifdef N
#define BOOST_PP_VALUE N
#include BOOST_PP_ASSIGN_SLOT(1)
#define BOOST_PP_VALUE 1
#include BOOST_PP_ASSIGN_SLOT(2)
#undef N
#endif
#if BOOST_PP_SLOT(1) == 0
#define X BOOST_PP_SLOT(2)
#else
#define BOOST_PP_VALUE BOOST_PP_SLOT(2)*BOOST_PP_SLOT(1)
#include BOOST_PP_ASSIGN_SLOT(2)
#define BOOST_PP_VALUE BOOST_PP_SLOT(1)-1
#include BOOST_PP_ASSIGN_SLOT(1)
#include __FILE__
#endif
こんな風に呼び出す。
#define N 6
#include "fact.c"
main(){
printf("%d\n",X);
}
あとはC++関係のスレで
0892デフォルトの名無しさん
2007/03/08(木) 00:42:45俺が念頭に置いてたのはこんな感じ。
http://lists.boost.org/Archives/boost/att-46646/lambda.cpp
>>885
let data Foo = ... in ...
のように式の中で即席の型を作れると、C++のテンプレートの
真似ができるかと思ったが、良く考えるとそうでもなかったかも。
0893879じゃない
2007/03/08(木) 01:49:32でも、IOモナドはいまいちピンと来てないです。
あと、全部メモリに読み込んでから処理するのはいいんでしょうか(関数型だとそれがキレイ?)
import System.IO
import System.Environment
main = do args <- getArgs
hFile <- openFile (head args) ReadMode
content <- hGetContents hFile
putStr $ unlines $ map (take 30) $ lines content
最後の行を
mapM (putStrLn . (take 30)) $ lines content
にしてもいけました。
ツッコミお願いします
0894デフォルトの名無しさん
2007/03/08(木) 02:03:52お疲れさん。
>あと、全部メモリに読み込んでから処理するのはいいんでしょうか(関数型だとそれがキレイ?)
hGetContentsは全部メモリに読んでる訳じゃなく、入力は遅延する。
これはこれで気持ち悪い(副作用と紙一重)けど、便利なことは間違いない。
0895デフォルトの名無しさん
2007/03/08(木) 02:18:49import System
main=getArgs>>=readFile.head>>=mapM_ putStrLn.take 30.lines
0896893
2007/03/08(木) 02:25:45ありがとうございます!
Stringの値が必要になったら全読みされちゃわないんですか?
Stringのケツが必要になるまでは遅延される?
>>895
1行キタ─(゚∀゚)─!!!! まさに関数型!!!
関数合成ってそう使うんですね。初めてしっくり来ました。
0897893
2007/03/08(木) 02:55:18main=getArgs>>=readFile.head>>=(\c->mapM_ (putStrLn.take 30)$lines c)
にしないと、>>882の動きになりませんでした。
このラムダは消せないのでしょうか…?
0898デフォルトの名無しさん
2007/03/08(木) 05:30:36main = getArgs>>=readFile.head>>=putStrLn.unlines.map (take 30).lines
とやる。
0899デフォルトの名無しさん
2007/03/08(木) 06:30:58main = getArgs >>= readFile . head >>= mapM_ (putStrLn . take 30) . lines
ちょっと分かりづらいか・・・。
0900デフォルトの名無しさん
2007/03/08(木) 09:28:14よって実現できるのはプッシュダウンオートマトンであってTuring機械ではない
(外部スクリプトで複数回CPPをかけていいんならTuring完全になる)
ただしC++ templeteを使っていいならTuring完全になる
0901839
2007/03/08(木) 09:37:55http://practical-scheme.net/wiliki/wiliki.cgi?Lisp%3A%E3%82%88%E3%81%8F%E3%81%82%E3%82%8B%E8%AA%A4%E8%A7%A3&l=en
>なので、C並に速いLispコードは見た目も安全性もC並になる、というのが私 (Shiro) の経験です。
haskellの場合はC並にごちゃごちゃしなくてもC並の速度が実現できるということなのでしょうか?
0902デフォルトの名無しさん
2007/03/08(木) 09:56:04おもちゃベンチマークでもなければね
どうして安易な1フレーズの結論に飛びつきたがるのかなぁ
0903デフォルトの名無しさん
2007/03/08(木) 10:22:58Boost だけど template を使ってるわけじゃないんだね。
漠然と、シンボルを結合したりしているのかな、とは思っていたが、うまい方法が思いつかなかったよ。ありがとう。
0904デフォルトの名無しさん
2007/03/08(木) 10:38:50>>892のリンク先のコード(β簡約器)はincludeを使っていない。
見れば分かるけど、λ式を最大nステップ簡約するマクロはO(log n)個のdefineで書ける。
だから「実質的に」チューリング完全、と書いた。
http://pc11.2ch.net/test/read.cgi/tech/1068359871/
完全にすれ違いなのでレスがあればこっちによろしく。(適当なスレが見付からなかったので)
0905デフォルトの名無しさん
2007/03/08(木) 10:55:04Boostを語れゴラァ part3
http://pc11.2ch.net/test/read.cgi/tech/1158991211/
0906デフォルトの名無しさん
2007/03/08(木) 12:15:39最後は、mapM_の部分適用…と思って、小一時間悩みました。
最後は、(mapM_ (putStrLn . take 30)) . lines と評価されるんですね。
結合順位重要。関数適用最強…と。 _〆(。。)
0907デフォルトの名無しさん
2007/03/08(木) 16:12:460908デフォルトの名無しさん
2007/03/08(木) 23:48:49まぁまぁ面白いな
レス数が900を超えています。1000を超えると表示できなくなるよ。