関数型プログラミング言語Haskell Part8
レス数が950を超えています。1000を超えると書き込みができなくなります。
0001デフォルトの名無しさん
2007/10/30(火) 20:28:13http://www.haskell.org/
日本語サイト
http://www.sampou.org/cgi-bin/haskell.cgi
http://www.shido.info/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/
Part6 http://pc11.2ch.net/test/read.cgi/tech/1162902266/
Part7 http://pc11.2ch.net/test/read.cgi/tech/1174211797/
・2chの仕様により、行頭の半角スペースは表示されません。
コードをインデントしたいときは、代わりに または全角スペースを使うことができます。
0002デフォルトの名無しさん
2007/10/30(火) 20:28:45・Introduction to Functional Programming Using Haskell
http://www.amazon.co.jp/exec/obidos/ASIN/0134843460/
・Haskell: The Craft of Functional Programming
http://www.amazon.co.jp/exec/obidos/ASIN/0201342758/
・The Fun of Programming
http://www.amazon.co.jp/exec/obidos/ASIN/1403907722/
・The Haskell School of Expression: Learning Functional Programming Through Multimedia
http://www.amazon.co.jp/exec/obidos/ASIN/0521644089/
・入門Haskell
http://item.rakuten.co.jp/book/1794880/
・ふつうのHaskellプログラミング
http://item.rakuten.co.jp/book/4052963/
0003デフォルトの名無しさん
2007/10/30(火) 20:28:500004デフォルトの名無しさん
2007/10/30(火) 20:29:36・関数型言語Part IV
http://pc8.2ch.net/test/read.cgi/tech/1083649982/
・【数学者】Haskellはクソ言語【オナニー】
http://pc8.2ch.net/test/read.cgi/tech/1128011645/
・純粋関数型言語Concurent Clean
http://pc8.2ch.net/test/read.cgi/tech/1075629340/
・関数型言語ML(SML, OCaml, etc.), Part 4
http://pc8.2ch.net/test/read.cgi/tech/1133003340/
・Lisp Scheme Part16
http://pc11.2ch.net/test/read.cgi/tech/1172404795/
・【入門】CommonLispその2【質問よろず】
http://pc8.2ch.net/test/read.cgi/tech/1140012484/
・Emacs Lisp 2
http://pc8.2ch.net/test/read.cgi/tech/1068467385/
0005デフォルトの名無しさん
2007/10/30(火) 20:30:11Haskell98によると、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でリテラルを直に
書くことはできない。
(続く)
0006デフォルトの名無しさん
2007/10/30(火) 20:30:473.最近の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)が正しく動作しない。
00071
2007/10/30(火) 20:33:11前スレが終わってからしばらく建ってなかったので建てました。
初めてスレ建てしたので、行き届かないところがあったらごめんなさい。
0008デフォルトの名無しさん
2007/10/30(火) 21:15:530009デフォルトの名無しさん
2007/10/31(水) 01:00:130010デフォルトの名無しさん
2007/10/31(水) 01:32:18ttp://uproda11.2ch-library.com/src/1141095.hs.shtml PASS:mu
であげてみたので、「この手続き脳が!」とか「貴様はなんもわかっちゃいねぇ!」とかってアドバイスしてくれると嬉しいです
あとフリーポイントスタイルの関数定義で
hogehoge = abc $ def $ ghi
hogehoeg = abc.def.ghi
↑がダメで↓がOKなのが何故なのか理解できない
.は関数合成用で$は部分適用用なの?Hoogleとかみてもよくわかんなかった
0011デフォルトの名無しさん
2007/10/31(水) 02:08:52直した方がいいところはいろいろあるけどまずは簡単なところを一つ。
combinateStr = zipWith (++)
Preludeモジュールに入っている関数を一通り読んでおくと勉強になるよ。
0012デフォルトの名無しさん
2007/10/31(水) 07:06:57あんがとー読んでみる
0013デフォルトの名無しさん
2007/10/31(水) 10:20:02ghiがdefの引数になってしまう。
一方abc . def . ghi は \ x -> abc(def(ghi x))
0014デフォルトの名無しさん
2007/10/31(水) 17:00:34headとかdrop 1とか使うよりパターンマッチの方が楽だぜ
groupEmptyLine :: [String] -> [String]
groupEmptyLine ls = case ls of
[] -> []
[]:[]:rest -> groupEmptyLine ([]:rest)
line:rest -> line : groupEmptyLine rest
createLineNumber :: Int -> [String] -> [String]
createLineNumber n ls = case ls of
[] -> []
[]:rest -> [] : createLineNumber n rest
line:rest -> (fillSpace 6 n ++ ":" ++ line) : createLineNumber (n + 1) rest
0015デフォルトの名無しさん
2007/10/31(水) 18:08:02where
f n "" = (n, "")
f n line = (n+1, fillSpace 6 n ++ ":" ++ line)
0016デフォルトの名無しさん
2007/10/31(水) 18:13:540017デフォルトの名無しさん
2007/10/31(水) 20:22:23よくわかんねー ためしに↓をコンパイルしてみたら怒られなかった件 …アレ?
main = do
cs <- getArgs
putStr $ test2 $ unlines cs
test1 = abc $ def $ ghi
test2 = abc.def.ghi
abc cs = cs
def cs = cs
ghi cs = cs
>>14
かっけー! なるほどー 今日一日綺麗にかけねーなーって悩んでたのがバカみたいだ
>>15
今日勉強してたんだけど
foldr←何やってるかはわかるけど何が嬉しいかはわからない
mapAccumL←意味がわからない
だったんだぜ… Hoogleで見てみてもまず引数の型に何が書いてあるかもわかんなかったんだぜ… accってなんだ…
0018デフォルトの名無しさん
2007/10/31(水) 20:53:29Hoogleもいいけど、こっちのリファレンスなら使用例ものってるよ
http://www.zvon.org/other/haskell/Outputglobal/index.html
0019デフォルトの名無しさん
2007/10/31(水) 21:16:09それはabc,def,ghiが全部a->a型だから通る。
例えばdef, ghiの型がInt -> Intだったらdef $ ghiってのは
引数がInt型の関数defにInt->Int型の引数ghiを突っ込むことになるので
Int ≠ Int->Intってことで型エラーになる。
0020デフォルトの名無しさん
2007/10/31(水) 21:41:32foldrは演算子を使ってリストを潰したいときに使う。
foldr (+) 0 [1,2,3,4] = 1+(2+(3+(4+0)))
他にも、
foldr (*) 1でリスト要素の積
foldr (&&) Trueでリスト要素のAND
foldr max 0で0を下限とした最大要素
foldr union emptyで複数の集合の和集合
foldr (.) idで複数の関数の合成
など応用いっぱい。
accてのはただの型変数の名前で、aとかbとかと一緒。
0021デフォルトの名無しさん
2007/10/31(水) 22:43:13今夜うちにきて妹をファックしていいぜ
>>19
よくわからんからあとでよく考えてみる…
>>20
なんか使いこなせば幸せになれる代物らしいことは分かった
お前らありがとな
またスレに話題がないときにでも構ってくれ ノ
0022デフォルトの名無しさん
2007/10/31(水) 23:29:45mapAccumL のイメージ図
http://www.lab2.kuis.kyoto-u.ac.jp/~hanatani/tdiary/?date=20040715
0023デフォルトの名無しさん
2007/11/01(木) 08:01:37どれもfoldrよりfoldr1のが楽そうだな
0024デフォルトの名無しさん
2007/11/01(木) 08:07:22maxの例はそうだけど、それ以外は空リストでも問題なく扱えるfoldrの方が使いやすくないか?
0025デフォルトの名無しさん
2007/11/01(木) 08:10:09なるほど。納得
0026デフォルトの名無しさん
2007/11/01(木) 12:49:18所詮おもちゃ言語か
23 名前:デフォルトの名無しさん[sage] 投稿日:2007/11/01(木) 04:45:00
darcsのスケーラビリティは改善したか?
百メガ程度のソースで、2Gでもメモリ不足でコケてどうにもならなくて泣いた。
Haskell勉強中だから応援してはいるが、Haskellユーザ以外で使ってる奴いるのか?
25 名前:デフォルトの名無しさん[] 投稿日:2007/11/01(木) 05:12:27
>>23
あれはdarcsを位置から作り直さないと直りそうもないんだけどwww
そこまでやる気あるのかな
28 名前:デフォルトの名無しさん[sage] 投稿日:2007/11/01(木) 12:47:17
>>23
それはdarcsではなくHaskellが悪い。
Haskellでは文字列のメモリ効率が悪すぎるから、あまり大きな文字列は扱えない。
0027デフォルトの名無しさん
2007/11/01(木) 13:25:07今頃気づいたのか?
0028デフォルトの名無しさん
2007/11/01(木) 20:13:54誰かsequenceの説明してくれないか?
モナドがなんで便利そうなのかイメージ的にはわかったんだけど、なんでもいいけどなんかモナドをリストにして扱いたいのの具体例が思いつかね
0029デフォルトの名無しさん
2007/11/01(木) 20:59:21sequence [putStr "Hello", putChar ' ', putStrLn "world"]
とかすれば"Hello world\n"と表示できたり、
sequence_ $ repeat (putStrLn "hoge")
とすればhogeが無限に表示できたり。
実用例が知りたいってことならGoogle Code Searchでいくつか見つかる。
mapM(mapしてsequence)は日常的に使うけど、sequenceを単独で使うことはそれほど無い気がする。
リストモナドに適用して総当たりという使い方も一応ある。
Prelude> sequence [[1,2], [3,4,5], [6]]
[[1,3,6],[1,4,6],[1,5,6],[2,3,6],[2,4,6],[2,5,6]]
0030デフォルトの名無しさん
2007/11/02(金) 01:07:34sequence自体が何をするのかはわかるんだけど…
google code明日にでも漁ってみるよ
分からないのは、たとえばその例だと
putStr "Hello world"で済むじゃんいらないじゃんみたいな
リストモナドに総当たりうんぬんはすごく幸せそうに見えるわ
0031デフォルトの名無しさん
2007/11/02(金) 01:23:24うん。だからsequenceの真価が発揮されるのはリストの内容や要素数が実行時まで決まらないときだ。
なんか人為的な例だけど、
g :: Int -> IO (Maybe (IO ())
という関数があるとする。これは何か動作を実行するんだけど、それは失敗するかもしれなくて、
そのときはNothingを返す。成功した場合は後で後始末をしなきゃいけない。そのために(Just 後始末)を返す。
gを0から9までを引数にして実行して、それが終わったら全部後始末をしたいとしよう。これはsequence_を使って
do
cleanups <- liftM catMaybes $ mapM g [0..9]
sequence_ cleanups
と書ける。
0032デフォルトの名無しさん
2007/11/02(金) 01:38:06ttp://www.haskell.org/ghc/dist/stable/dist/
0033デフォルトの名無しさん
2007/11/02(金) 20:17:45むずかしーな…
sequence_ 〜〜のほうはわかるけどgがどんな関数なのかわからん…
時間かけて考えてみる
そして今度はStateモナドが意味わかんない件
あと>>=とかreturnも微妙によくわからない…
ふつけるP.277の
main = do g <- getStdGen
let ns = take 3 (randoms g)
-- print (ns :: [Int])
って>>=使った記法にどうやったら変形できるの?
getStdGen >>= (\g -> take 3 (randoms g)) じゃダメなの?
0034デフォルトの名無しさん
2007/11/02(金) 20:46:19getStdGenはIOモナドだけどtake 3 (randoms g)はモナドじゃないから
return (take 3 (randoms g))にしないとだめ。
main = getStdGen >>= return . take 3 . randoms >>= (print :: [Int] -> IO ())
0035デフォルトの名無しさん
2007/11/02(金) 23:57:32でも\gが勝手に型推論されていい感じになったりはしないのか?
あと(print :: [Int] -> IO ()) もよくわからんから明日勉強してみるよ!
0036デフォルトの名無しさん
2007/11/03(土) 00:14:35前スレで↓のような宣言が書かれていたのですが、
これはどのような実装で使うことができる構文なのでしょうか?
type Hoge' = { h in Hoge | (one h) < (two h)}
0037デフォルトの名無しさん
2007/11/03(土) 00:16:45sequenceはモナドができるまでのHaskellのIOに使われていたもので、
現在ではレガシーです。
0038デフォルトの名無しさん
2007/11/03(土) 04:20:37その書き込みに対して「それはどういう方言?実装ある?」という
質問があったけどその後誰も反応しなかったところを見ると
ガセだったじゃないのかな。
0039デフォルトの名無しさん
2007/11/04(日) 15:38:45管理どうなってんだ
0040デフォルトの名無しさん
2007/11/04(日) 22:27:26http://haskell.org/ghc/download_ghc_681.html
0041デフォルトの名無しさん
2007/11/05(月) 02:47:400042デフォルトの名無しさん
2007/11/05(月) 21:43:44お前が書くんだよ
0043デフォルトの名無しさん
2007/11/06(火) 09:02:100044デフォルトの名無しさん
2007/11/06(火) 10:39:430045デフォルトの名無しさん
2007/11/06(火) 12:17:280046デフォルトの名無しさん
2007/11/06(火) 20:22:54>>33の続きなんだけど
@
genNRandom :: Int -> IO ()
genNRandom n = do
g <- getStdGen
let ns = take n (randoms g)
putStr $ show (ns :: [Int])
A
genNRandom :: Int -> String
genNRandom n = do
g <- getStdGen
let ns = take n (randoms g)
show (ns :: [Int])
B
genNRandom :: Int -> [Int]
genNRandom n = do
g <- getStdGen
take n (randoms g)
@はコンパイル通るけどAとBがダメなのはなんでなんだぜ?
で、
ttp://www.sampou.org/haskell/a-a-monads/html/laws.html#nowayout
読んでたらなんとなく分かった気がしたんだけど要するにIOモナドは1方向モナドで、値が取り出せないし、
IOモナド使ってる関数は返り値の型が絶対IO()とかになるから参照透明じゃないのが他の関数まで波及しないよって意味なのか?
じゃMaybeとかStateとかは使っても参照透明なままなのか?
0047デフォルトの名無しさん
2007/11/06(火) 20:57:353は型がInt -> IO [Int] で、最後をreturn(take n (randoms g))にせないかん。
0048デフォルトの名無しさん
2007/11/06(火) 22:22:38(・´ω`・)ぅーん
0049デフォルトの名無しさん
2007/11/06(火) 22:35:47IOモナドを使った関数も参照透明だよ。
個人的には、IOモナドを「副作用を閉じ込める」と表現したり、
値を取り出せるかどうかを云々しても混乱するだけだと思う。
むしろ、IO aとaは全然別のものであるという認識を推奨。
実際、IO aの中にa型の値など入っていない。
この辺読んでみたらどうだろう。
ttp://www.ice.nuie.nagoya-u.ac.jp/~h003149b/lang/haskell_io.html
0050デフォルトの名無しさん
2007/11/06(火) 23:09:33それぞれこんな感じになって、
1. do {r <- IO r; IO ()}
2. do {r <- IO r; String}
3. do {r <- IO r; [Int]}
これを >>= を使った形にしたらこんな感じ。
1. IO r >>= (r -> IO ())
2. IO r >>= (r -> String)
3. IO r >>= (r -> [Int])
(>>=) :: m a -> (a -> m b) -> m bだから
>>=の前後は m a >>= (a -> m b) って状態になってないといけない。
1はちゃんとそれを満たしてるからOKだけど、
2はString = [Char] = [] Charで、IO ≠ []なのでNG。
3も同様にNG。
0051デフォルトの名無しさん
2007/11/06(火) 23:39:33読んだ 少し分かったような分からないような…?
YOUはIOモナドを使った関数も参照透明だよって言ってるけど
標準入力読んだときとか乱数生成したときとか同じ引数あげても同じ値が返ってくるとは
限らないじゃん それって困るんじゃないの? って思うの
>>50
>>49の説明と合わせたらちょっと分かったかも
そーいえばリストもモナドなんだったっけ
例示してくれた1.2.3.の例はHaskellとして正しい文法なん?
言いたい意味はわかるけどそういう書き方があるの?
前スレ952が教えてくれたサイトやら見てみたけどわかんない…
0052デフォルトの名無しさん
2007/11/07(水) 00:05:04randomRIO :: (Int, Int) -> IO Int
というのを考えてみる。これは要するに与えられた範囲の乱数を生成する関数な訳だけど、
厳密に考えると、これは動作を返す関数で、同じ引数で呼ばれたら常に同じ動作を返す。
例えば、(0, 3)を与えて呼び出すと、常に「0以上3以下の乱数を生成する」という動作を返す。
この「動作」を実行した結果はもちろん毎回違うけど、それをHaskellプログラムが
受け取ることはないので、参照透過性には影響ない。
(この動作の結果を受け取って別のことをする、より大きな動作を作ることはできるけど)
これは別に言葉遊びじゃなくて、実際、randomRIO (0, 3)が複数回出てくる巨大な式
f x = ... randomRIO (0, 3) >> ...... fmap (1-) $ randromRIO (0, 3) ...
があったとして、これを機械的に一つにまとめて
f x = let z = randomRIO (0, 3) in ... z >> ...... fmap (1-) $ z ...
としても意味が変わらないことが保証される。これが参照透過性。
0053デフォルトの名無しさん
2007/11/07(水) 00:06:110054デフォルトの名無しさん
2007/11/07(水) 00:25:41アクションやら動作うんぬんとかいうことかー
変数に束縛して使ったときに動作が実行されて〜〜みたいな?
main = do
rnd <- randomRIO(0,3)
putStr $ show (rnd :: Int)
とかすると束縛したときはアクションですけどshowに渡るときにはいつの間にか数字ですよみたいなごまかし方(?)なのか?
ていうかghcでコンパイルしたあと実行すると処理が帰ってこないんだけどghciでmain呼ぶとちゃんと表示される罠 意味わかんね
>>53
だってわかんなかったんだもん いぢわるー
0055デフォルトの名無しさん
2007/11/07(水) 00:44:46do記法で
rnd <- randomRIO (0, 3)
と書くと、rndが束縛されるのは数値Intであって動作IO Intじゃない。
矢印の右辺と左辺は別物。というかこの行だけ取り出すのは無意味。
do式全体で、「randomRIO (0, 3)を実行し、その結果がrndならばputStr $ show rndを実行するという動作」と読む。
慣れるまではdo記法をほどいて
randomRIO (0, 3) >>= (\rnd -> putStr $ show rnd)
に戻して考えるようにした方が分かりやすいかもしれない。
俺の手元ではコンパイルしたのもちゃんと動いたよ。
0056デフォルトの名無しさん
2007/11/07(水) 00:57:31( ´3`)<よくわかんなーい
乱数を生成する動作を返す関数があって、その動作が実行されてモノホンの数値になる瞬間がある気がするんだけど気のせいなのか?
ちなみに
The Glorious Glasgow Haskell Compilation System, version 6.6.1
ghc test.hs --makeでコンパイルしてtest.exe実行→処理帰ってこない
0057デフォルトの名無しさん
2007/11/07(水) 01:41:54いや、Haskellプログラムは最初から最後まで動作をこねくりまわしてるだけで、
いつ実行されるかという話はあまり関係ない。
「ジャガイモの皮を剥く」というレシピと「茹でる」というレシピから
「ジャガイモの皮を剥いて茹でる」というレシピを合成する、という次元のことをやってる。
この作業をするとき、実際にいつレシピに基づいて料理が行われるかを気にする必要はない。
実際には、プログラムを起動すると即座にmainが「実行」されはじめて、
それに必要な分だけ「評価」が起こる訳だけど。
0058デフォルトの名無しさん
2007/11/07(水) 07:08:36レシピは完成品を作っちゃくれないってか
0059デフォルトの名無しさん
2007/11/07(水) 11:47:380060デフォルトの名無しさん
2007/11/07(水) 19:57:03今日もまたわからないことがいっぱいでした…
0061デフォルトの名無しさん
2007/11/07(水) 20:16:100062デフォルトの名無しさん
2007/11/07(水) 20:17:560063デフォルトの名無しさん
2007/11/07(水) 20:25:130064デフォルトの名無しさん
2007/11/07(水) 20:31:53誰?
0065デフォルトの名無しさん
2007/11/07(水) 20:50:21園諭を提案した人
0066デフォルトの名無しさん
2007/11/08(木) 23:04:520067デフォルトの名無しさん
2007/11/09(金) 00:37:520068デフォルトの名無しさん
2007/11/09(金) 03:04:270069デフォルトの名無しさん
2007/11/09(金) 07:50:26それから-O2をつけた場合のコンパイル速度が六倍になったけど、これは-fasmがデフォになったおかげだな
0070デフォルトの名無しさん
2007/11/09(金) 21:01:59コマンドライン引数から複数のテキストファイル名を取得してその中身を標準出力に出力するプログラム書いてみてくれ
IO [String]が…[]外れねぇよチクショウorz
0071デフォルトの名無しさん
2007/11/09(金) 21:22:15main = do
args <- getArgs
mapM_ dump args
where
dump file = do
content <- readFile file
putStr content
こんなの?
0072デフォルトの名無しさん
2007/11/09(金) 21:30:54俺とてつもなく頭悪い気がしてきた('A`)
0073デフォルトの名無しさん
2007/11/09(金) 23:45:24import System.Environment
main = getArgs >>= mapM_ ((putStr =<<) . readFile)
0074デフォルトの名無しさん
2007/11/10(土) 01:57:22mapA :: ArrowChoice a => a b c -> a [b] [c]
mapA f = arr listcase >>>
arr (const []) ||| (f *** mapA f >>> arr (uncurry (:)))
where
listcase [] = Left ()
listcase (x:xs) = Right (x,xs)
main :: IO ()
main = runKleisli (Kleisli (const getArgs) >>> mapA (Kleisli readFile) >>> arr concat >>> Kleisli putStr) ()
-- mapAみたいに便利な関数は早く標準ライブラリに入れてほしい
0075デフォルトの名無しさん
2007/11/10(土) 12:58:22モナドと組み合わせると恐ろしく単純にかけるようになる
main = getArgs >>= mapM_ (readFile >>> putStr)
0076デフォルトの名無しさん
2007/11/10(土) 13:01:01Kleisliをつけたり外したりがいらないか?
0077デフォルトの名無しさん
2007/11/10(土) 13:27:490078デフォルトの名無しさん
2007/11/10(土) 17:30:400079デフォルトの名無しさん
2007/11/10(土) 22:17:130080デフォルトの名無しさん
2007/11/10(土) 22:20:080081デフォルトの名無しさん
2007/11/10(土) 22:25:52何こいつスゴいかっこいいんだけど
0082デフォルトの名無しさん
2007/11/10(土) 22:26:01保守できないに100ルピー
0083デフォルトの名無しさん
2007/11/11(日) 11:03:25という悪夢を見てしまった
0084デフォルトの名無しさん
2007/11/11(日) 13:55:48現在適当な粒度の関数に分解する鶴を開発中です
0085デフォルトの名無しさん
2007/11/11(日) 13:57:05無責任名誉会長は俺ね。
0086デフォルトの名無しさん
2007/11/11(日) 19:07:03素直にλを残した方が分かりやすいわな。
main = getArgs >>= mapM_ (\a -> readFile a >>= putStr)
008779
2007/11/11(日) 19:39:30自分はまだ初心者でチュートリアル勉強している段階ですけど、この世界が
広がったら素晴らしいなぁと本気で思ってますよ。
私の現在の妄想は、最近メジャーになってきたWebサービスの関数型版。
住所 -> GoogleMapAPI -> 天気予報 -> 天気マーク付き地図
0088デフォルトの名無しさん
2007/11/11(日) 19:53:470089デフォルトの名無しさん
2007/11/11(日) 19:59:51それは俗に言う「マッシュアップ」というやつではないか?
関数型言語と関係なくそこら辺の奴でも作れるぞ。
0090デフォルトの名無しさん
2007/11/11(日) 20:11:17ただのマッシュアップだな
masuidriveのブログとか見るといいような気がするよ
そして
>>71-77,86の諸氏よありがとう
よく理解できないから明日色々試してみるわ…
Haskell挫折しそう… 書いてて楽なのは分かるんだけど…分かるんだけど…
009179
2007/11/12(月) 07:08:04もうあるの?
0092デフォルトの名無しさん
2007/11/12(月) 11:01:32とか無責任に書いてみる
0093デフォルトの名無しさん
2007/11/12(月) 16:47:36そこまで来たらやっぱりこう書きたくなる
main = getArgs >>= mapM_ ((>>= putStr) . readFile)
0094デフォルトの名無しさん
2007/11/12(月) 16:56:09俺はラムダ抽象が嫌いなのでwhere節を使う
0095デフォルトの名無しさん
2007/11/12(月) 19:48:05お前の好みはhaskellには不向きだな。
0096デフォルトの名無しさん
2007/11/12(月) 20:14:14where節みたいにローカル変数を使った後に定義できる言語は他にはCleanくらいしか知らない
それに嫌いって言っても使うことは結構ある。>>86みたいな例なら迷わずwhereを使うってだけで
0097デフォルトの名無しさん
2007/11/12(月) 20:58:37関数の内部で関数を定義できる言語はいくらでもある。rubyとか。
0098デフォルトの名無しさん
2007/11/12(月) 21:06:160099デフォルトの名無しさん
2007/11/12(月) 21:18:000100デフォルトの名無しさん
2007/11/12(月) 21:19:56ソースコード上で定義が参照よりも後に現れること
f x = g -- ここでgを使う
where
g = 2 -- ここでgを定義
0101デフォルトの名無しさん
2007/11/12(月) 21:26:38owata();
}
void owata(){
writefln("\(^o^)/");
}
0102デフォルトの名無しさん
2007/11/12(月) 21:27:460103デフォルトの名無しさん
2007/11/12(月) 21:28:18>>98はローカル関数の話な、誤解させてすまん
0104デフォルトの名無しさん
2007/11/12(月) 21:30:21なんというエスパー
010596
2007/11/12(月) 21:32:27遅延評価はあまり関係ないと思う。あくまでコード上に現れる順序の問題
極端な話、正格な言語で
f x = y where y = 2
が
f x = let y = 2 in y -- このletは正格
の構文糖なだけでも俺には十分
0106デフォルトの名無しさん
2007/11/12(月) 22:26:37実際、昔 ELisp でそんな感じの macro 自作して使ってたし。
0107デフォルトの名無しさん
2007/11/12(月) 23:36:210108デフォルトの名無しさん
2007/11/13(火) 00:18:430109デフォルトの名無しさん
2007/11/13(火) 12:48:470110デフォルトの名無しさん
2007/11/13(火) 19:37:02今、いろんなテキスト漁って勉強中ですが、モナドのところ見てて不思議に思いました。
これって、早晩知らなくてもHaskellが書けるようになったりするんじゃないのでしょうか。
今はまだ途上なので、透過参照を維持できるように云々と理論的な面が表に強く出て
ますけど、近いうちに標準のAPIからは隠蔽されていくということはないですか?
0111デフォルトの名無しさん
2007/11/13(火) 19:37:310112デフォルトの名無しさん
2007/11/13(火) 19:42:46>>73をモナドを使わずに書いてください
0113デフォルトの名無しさん
2007/11/13(火) 19:57:53歴史的にはどうか知らんが、モナドは参照透過性のために仕方なくあるわけじゃなくて、
道具として積極的に使われてる。だからHaskellでモナドが使えなくなることは考えられない。
モナドを知らなくてもIOを書けると良い、という話なら、現状でもできると思う。
0114デフォルトの名無しさん
2007/11/13(火) 20:22:01>>93をみてこんなの↓つくってみたんだけど、
main :: IO ()
main = getArgs >>= mapM_ ((>>= putStrLn.conv).readFile) >> getCPUTime >>= print
where
conv :: String -> String
conv = unlines.(map ((map toLower).(filter (/= '\"')))).lines
最初に与えたファイルパスのぶんが読まれないっぽいんよ
c:\Users\aiueo> main < c:\a.txt c:\b.txt
と入力すると、b.txtの中身とCPUTimeだけが表示されるんだよね
エロい人なぜだか教えてください
0115デフォルトの名無しさん
2007/11/13(火) 20:27:40モナドを使わないと、実用的なHaskellのプログラムは書けない。
モナドの理論的な側面を詳しく知らなくとも、モナドを使うことはできる。
結論:
モナドの理論的な側面は今は無視して、モナドを使ってHaskellのプログラムを書けばよろし。
理論的なことは後から少しずつ覚えていけばよろし。
0116デフォルトの名無しさん
2007/11/13(火) 20:29:38「<」これはリダイレクション
0117デフォルトの名無しさん
2007/11/13(火) 20:30:00だってそれa.txtは標準入力に与えられてるもんよ
c:\Users\aiueo> main c:\a.txt c:\b.txt こーやれ
0118デフォルトの名無しさん
2007/11/13(火) 20:39:55ありがとう!
0119デフォルトの名無しさん
2007/11/13(火) 21:09:22なんで>>86みたく書くんだ?
main = mapM_ (\a -> putStr =<< readFile a) =<< getArgs
でよくね?モナド使わないときとモナド使うときで読む方向違うのってやりにくくね?
なんか理由あんの?おせーておせーて
0120デフォルトの名無しさん
2007/11/13(火) 21:14:550121デフォルトの名無しさん
2007/11/13(火) 21:25:47ありがとうございます。"モナド"という言い方がよくありませんでした。Maybeとか
リストのモナドは仰るように積極的に使われていると自分も思いました。
ただ、IOモナドがよく分からんのですね。特にIORefとか。この手のものは、単に
透過参照性を維持するためのテクニックと見えてしまいます。
0122デフォルトの名無しさん
2007/11/13(火) 21:34:19だったら>>75が自然に見えてくるだろう
0123デフォルトの名無しさん
2007/11/13(火) 21:38:120124デフォルトの名無しさん
2007/11/13(火) 21:41:42処理系とそのバージョンは?
Control.Arrowをインポートしたかどうか。
0125デフォルトの名無しさん
2007/11/13(火) 21:48:31readFile :: String -> IO String
putStr :: String -> IO String
(>>>) :: (Arrow a) => a b c -> a c d -> a b d
instance Arrow (->)
0126125
2007/11/13(火) 21:49:19putStr :: String -> IO ()
ね
0127デフォルトの名無しさん
2007/11/13(火) 21:52:41参照透過性を壊さないでIOを実現するに当たって、現状よりマシなインタフェースがあるってこと?
0128デフォルトの名無しさん
2007/11/13(火) 23:40:51無理やりコンパイル通せばこうなるぞ。
main = getArgs >>= mapM_ (readFile >>> (>>= putStr))
Kleisli使うのは俺はパスw
0129デフォルトの名無しさん
2007/11/14(水) 01:19:080130デフォルトの名無しさん
2007/11/14(水) 01:31:500131デフォルトの名無しさん
2007/11/14(水) 05:55:26だからといって 型シノニムで定義できるわけでもないので、しょうがないんだけど
0132デフォルトの名無しさん
2007/11/14(水) 14:53:09main = getArgs >>= mapM_ (readFile >=> putStr)
0133デフォルトの名無しさん
2007/11/14(水) 15:38:28instance (Eq a) => Eq (Maybe a) where
の(Eq a) => はどうして必要なんでしょうか?
0134デフォルトの名無しさん
2007/11/14(水) 16:05:38中身が比較できないとMaybeも比較できないじゃん
具体的には、
instance (Eq a) => Eq (Maybe a) where
Nothing == Nothing = True
Just a == Just b = a == b -- このa==bが意味を持つことを保証しないといけない
_ == _ = False
0135デフォルトの名無しさん
2007/11/14(水) 16:39:52Maybe aとaを同一視してましたorz
わかりやすい説明ありがとうございました。
0136デフォルトの名無しさん
2007/11/14(水) 19:13:05hoge <- getContents
putStr hoge
↑のような式を>>=を使って書き直した場合、どのような式になるのでしょうか?
0137デフォルトの名無しさん
2007/11/14(水) 19:17:43getContents >>= \cs ->
getContents >>= putStr
0138136
2007/11/14(水) 20:05:49do cs <- getContents
hoge <- getContents
putStr hoge
じゃなくて
do hoge <- getContents
cs <- getContents
putStr hoge
の間違いでしたorz
0139デフォルトの名無しさん
2007/11/14(水) 21:17:45getContents >>= \hoge ->
getContents >>= \cs ->
putStr hoge
このケースでは(>>=)を使う旨みはないね。
0140デフォルトの名無しさん
2007/11/14(水) 22:11:24A. getContentsを2回やってからputStr
B. putStr hogeをやるために1個目のgetContentsをやって2個目のは保留
のどっちの動作になるんだっけ。
遅延評価的にはBだよね?
0141デフォルトの名無しさん
2007/11/14(水) 22:18:38IO動作は上から順に(厳密には>>=の左辺から右辺へ)実行される
getContentsの動作は特殊で、読み込み自体は文字列が必要とされるまで遅延される
だから、順序としては、
1. 1個目のgetContentsが実行され、ハンドルがセミクローズされる。遅延読みのため即座にリターン
2. 2個目のgetContentsが実行され、ハンドルがセミクローズ状態なので例外発生
で、putStrは実行されない
0142デフォルトの名無しさん
2007/11/14(水) 22:28:250143デフォルトの名無しさん
2007/11/14(水) 22:55:190144デフォルトの名無しさん
2007/11/14(水) 23:11:310145デフォルトの名無しさん
2007/11/14(水) 23:31:03依存関係を無視したり、更新情報を無視したり、
無いファイルを参照したり、必要なターゲットを生成しなかったりと
明らかに修正しなければならない部分が多々あるようですが
0146143=145
2007/11/15(木) 00:01:32ホスト、ターゲットで共通
・distrib以下のファイルに実行許可がされていない
・configureでgmpのヘッダ、ライブラリ位置を指定しても途中から無視する
・makeをやり直した場合、すでに生成したファイルで且つ更新の必要がないものでも再ビルドする場合がある
ホストでは、
・libraries/Cabal/cabal-setup/CabalSetup.hcを生成してくれない
・かといってターゲットとして生成したファイルだとundefined referenceが発生するので-keep-hc-filesを指定してCabalSetup.oをリコンパイルしなければならない
・hc-file-bundleする際、libraries/haskell-src/Language/Haskell/Parser.hsという存在しないファイルをアーカイブしようとする
(現在ビルド中ですので途中までしかわかっておりませんが)ターゲットでは
・compiler/primop*.hs-inclが空ファイルで生成される
・compiler/stage1にインタフェースファイルが生成されないためpreludeのビルドに失敗する
等が確認できました
i386-unknown-openbsd → arm-unknown-openbsdという特殊な環境ということもありますが、
普通の環境ではすんなりクロスコンパイルできるのか疑問に思えました
0147143
2007/11/15(木) 00:07:350148デフォルトの名無しさん
2007/11/15(木) 01:19:56C-c, C-lを実行するとよくEmacsが固まってしまって何の入力も受け付けなく
なってしまいます。そのたびにkill -KILLをしているんですが
同じような症状の人はいないでしょうか?
0149デフォルトの名無しさん
2007/11/15(木) 01:36:110150デフォルトの名無しさん
2007/11/15(木) 03:01:07do ioref <- newIORef 0
modifyIORef ioref (+1)
readIORef ioref >>= print
という式の中でmodifyIORef ioref (+1)がiorefの値を変更している仕組みが
どうしてもわかりません。予想としては
・modifyIORefを使うと引数の値を変更できると言語の根っこの部分で決められている
という事かなと思っているんですが、この考えでいいんでしょうか?
0151デフォルトの名無しさん
2007/11/15(木) 07:23:12C言語の例でよければ
*ioref=*ioref+1;
で変更されるのは*iorefであってiorefではない。
Perlなら
$$ioref=$$ioref+1;
といった具合で。
Cで詳細に書いてみる。
void modifyIORef(int * ioref,int (*fn)(int)){
*ioref=fn(*ioref);
}
int add1(int arg){
return arg+1;
}
int readIORef(int * ioref){
return *ioref;
}
int main(){
int * ioref;
ioref=newIORef(0);
modifyIORef(&add1);
printf("%d\n",readIORef(ioref));
return 0;
}
まあ(>>=)の部分(doで省略される部分とか)までより近く書くともっと長くなりますが。
それ以前にかけるかどうかちょっと自信ないけど。
*iorefは変更されてもiorefは1回の初期化時の変更のみということで。
0152150
2007/11/15(木) 08:04:34つまりHaskellは、定数だけでなく、変更される変数の値を保存しておくための(つまり再代入可能な)
場所も用意しているということなんでしょうか?
0153デフォルトの名無しさん
2007/11/15(木) 10:27:06実装上はその通り。GHCにはヒープ上に変更可能オブジェクトを置くための機構があるし、
多分Hugsも似たようなもの。
一方で、言語について「Haskellは〜用意している」という言い方をするのは誤解がある気がする。
実際、>>151の言うように、IORefを使っても(Haskellの普通の)変数の値が変更されることはないし、
言語の根幹に変更を迫るような拡張じゃない。
扱える型を限定すれば、自分で(ファイル入出力を使ったりして)IORefみたいなものを書くこともできる。
0154150
2007/11/15(木) 13:37:19よくわかりました。ありがとうございます。
今入門HaskellとふつうのHaskellの二冊を読みながら色々試しているんですが
もうちょっと詳しい説明が欲しいなと思うことがよくあります。
そこでプログラミングPerlのような
・どのようにHaskellでプログラミングするか
・Haskellはどういう理由でこういう風になっているのか
を解説した本が欲しいのですが、テンプレに載っている洋書で↑の内容に
合っている本はないでしょうか?
0155143
2007/11/15(木) 13:54:41find compiler/stage1 -name ¥*.o -exec rm {} ¥;して
make -C compiler boot stage=1 && make -C compiler stage=1したら
ビルド&インストールに成功したようです
後でパッケージを作って本インストールするつもりです
日本語のクロスコンパイルのドキュメントが少ないので
作業過程を簡単に書かせていただきたいと思います
(需要は無いでしょうけど)
うざったいと思われる方は「クロスコンパイル」をNGワードにしてください
0156デフォルトの名無しさん
2007/11/15(木) 13:56:24・どのようにHaskellでプログラミングするか
→『Haskell: The Craft of Functional Programming』
・Haskellはどういう理由でこういう風になっているのか
→『Introduction to Functional Programming Using Haskell』
かなあ。両方とも良い本だと思う。まだ全部読み切ってないけど。
0157150
2007/11/15(木) 21:41:29その二冊ですね。お金に余裕ができたら買ってみます。
話は変わるのですがHaskellのガベージコレクションは他の言語(java,ruby...)
と比べて動作する機会がほとんどないと思うんですがどうでしょうか。
変数の宣言時にしか値を入れられなくて、グローバル変数とスタック上に
載せられるローカル変数でほとんど全てが賄えるなら
どこからも参照されていないデータ(ガベージコレクタの対象になるデータ)
ができるなんてことはまずないと思うんですが・・・
0158デフォルトの名無しさん
2007/11/15(木) 22:41:43そんなことはない。遅延評価のために何でもかんでもヒープに割り当てないといけないので、
Haskellは平均的な言語よりずっと多くゴミを出す。
GHCでコンパイルしたプログラムなら、+RTS -Sstderrオプションをつけて実行すれば
GCがどれくらい動いたかが分かる。
適当なプログラムで試してみたけど、約3秒の実行時間中にヒープから700MBほど確保し、
そのうち約9割は第0世代のGCで即座に捨てられてた。
0159デフォルトの名無しさん
2007/11/15(木) 22:45:570160デフォルトの名無しさん
2007/11/15(木) 22:47:230161デフォルトの名無しさん
2007/11/15(木) 23:07:27700mBの間違いじゃないのか
0162デフォルトの名無しさん
2007/11/15(木) 23:15:22741,834,476 bytes allocated in the heap
108,671,480 bytes copied during GC (scavenged)
2,030,404 bytes copied during GC (not scavenged)
13,955,072 bytes maximum residency (11 sample(s))
1415 collections in generation 0 ( 0.55s)
11 collections in generation 1 ( 0.43s)
32 Mb total memory in use
0163デフォルトの名無しさん
2007/11/16(金) 01:10:194.4 遅延パターン
http://www.sampou.org/haskell/tutorial-j/patterns.html
での最初の例
reqs = client init resps
resps = server reqs
client init (resp:resps) = init : client (next resp) resps
server (req:reqs) = process req : server reqs
がどういう意味なのかさっぱりわかりませんorz
どうして↑がだめで
client init resps = init : client (next (head resps)) (tail resps)
だとOKなんでしょうか?
0164デフォルトの名無しさん
2007/11/16(金) 02:19:04これって瞬間最大メモリ使用量が700MBってこと?
0165デフォルトの名無しさん
2007/11/16(金) 02:50:580166デフォルトの名無しさん
2007/11/16(金) 02:52:24OS側で本当に実メモリを消費したとは限らないから
調べないと分からないか。
0167デフォルトの名無しさん
2007/11/16(金) 03:27:46アロケートされたメモリの数が700MBってことなのだが、実際はgeneration 0に割り当てられた少ないメモリが使いまわされているだけだから、メモリの使用量自体は少ないはず。
0168デフォルトの名無しさん
2007/11/16(金) 07:15:29OSから確保したのが32MB
実際のヒープオブジェクトの総量が瞬間最大で13,955,072 bytes
コピーGCだからOSから確保した領域の半分以下しか貯められない
0169デフォルトの名無しさん
2007/11/16(金) 17:49:52do
xs <- interleaveState $ sequence $ replicate 3 get
sequence $ map set xs
で get set get set get setの順になるようなやつ
0170デフォルトの名無しさん
2007/11/16(金) 18:08:040171デフォルトの名無しさん
2007/11/16(金) 18:26:23の間違いか?
どっちにしても無理だろ
0172デフォルトの名無しさん
2007/11/16(金) 18:36:40すいません、間違いでした
無理orz
0173デフォルトの名無しさん
2007/11/16(金) 22:22:170174デフォルトの名無しさん
2007/11/17(土) 03:16:48としたときに実際に>>=がどのインスタンスに定義されている>>=の処理を行うのか、
というのはどうやって決まるんでしょうか?
0175デフォルトの名無しさん
2007/11/17(土) 07:11:03型推論。fooの型とbarの型とその式の使われ方が勘案される。
0176デフォルトの名無しさん
2007/11/17(土) 11:11:46それはコンパイル時と実行時のどちらでされるものなんでしょうか?
0177デフォルトの名無しさん
2007/11/17(土) 11:43:58実行時
0178デフォルトの名無しさん
2007/11/17(土) 11:57:24・ただし、型クラスのディスパッチは実行時まで遅延される。
・ただし、どのインスタンスについてのコードを生成すれば良いか静的に決まる場合は、
最適化の一環としてディスパッチを省略する。
こんな感じか。
0179174
2007/11/17(土) 12:49:35なるほど、静的に型をチェックしつつ、動作は動的に決まるんですね。
ところで
数学パズル ものまね鳥をまねる―愉快なパズルと結合子論理の夢の鳥物語
ttp://www.amazon.co.jp/%E6%95%B0%E5%AD%A6%E3%83%91%E3%82%BA%E3%83%AB-%E3%82%82%E3%81%AE%E3%81%BE%E3%81%AD%E9%B3%A5%
E3%82%92%E3%81%BE%E3%81%AD%E3%82%8B%E2%80%95%E6%84%89%E5%BF%AB%E3%81%AA%E3%83%91%E3%82%BA%E3%83%AB%E3%81%A8%E7%B5%
90%E5%90%88%E5%AD%90%E8%AB%96%E7%90%86%E3%81%AE%E5%A4%A2%E3%81%AE%E9%B3%A5%E7%89%A9%E8%AA%9E-%E3%83%AC%E3%82%A4%E3%
83%A2%E3%83%B3%E3%83%89-%E3%82%B9%E3%83%9E%E3%83%AA%E3%83%A4%E3%83%B3/dp/4627019017/ref=sr_1_9?ie=UTF8&s=books&qid=1195271100&sr=1-9
この本を読んだことがある人いますか?関数プログラミングの土台の考え方がわかる本らしいんですが。
0180デフォルトの名無しさん
2007/11/17(土) 13:28:59途中まで読んだだけだけどコンビネータの話。
S,K,I とか。Yコンビネータも出てきたかは覚えてない。
0181デフォルトの名無しさん
2007/11/17(土) 16:07:56a 2 = 2
のような引数によって異なる型の値を返すことはOKなんでしょうか?
0182デフォルトの名無しさん
2007/11/17(土) 16:22:37template haskell
0183デフォルトの名無しさん
2007/11/17(土) 16:25:26ダメ
0184デフォルトの名無しさん
2007/11/17(土) 16:30:24a :: Int -> Either String Int
a 1 = Left "hoge"
a 2 = Right 2
0185182
2007/11/17(土) 16:51:520186デフォルトの名無しさん
2007/11/17(土) 22:16:41今日Haskell始めたばかりのド素人なんだけど、
ones = addlist 1 onesでも、
addlist init xs = init : head xs : tail xs -- [1,1,1,1,1,1,1,1,1,1]
addlist init xs = init : xs -- [1,1,1,1,1,1,1,1,1,1]
addlist init ~(x:xs) = init : x : xs -- [1,1,1,1,1,1,1,1,1,1]
addlist init (x:xs) = init : x : xs -- C stack overflow
ってなる。要するに(x:xs)が含まれる部分が先に解釈されるとマズいってことじゃないかな。
単体でのxsはパターンはパターンでも手続き型言語での仮引数と同じ程度の意味しかもたないパターンだから暗黙的に遅延される。
head xsやtail xsも関数だからxsが未確定なら遅延される。
でも(x:xs)というパターンは未確定でも遅延しないでxとxsを照合しようとする。
結果的にinitに値がセットされる前にx:xsを延々と調べ続ける。それではマズいので、(x:xs)を遅延パターンにする、ってことじゃないかな。
0187デフォルトの名無しさん
2007/11/17(土) 23:24:01明日からHaskell始めるつもりのド素人なんだけど、
関数の仮引数xがconstructor pattern(たとえばy:ys)の場合、
それはcase x of y:ys -> ...という形に変換される。
で、caseの条件式はWHNFまで評価されてしまうので、
遅延させたい時には使えない。
0189163
2007/11/17(土) 23:59:14Haskellの考え方に慣れるまでまだ時間がかかりそうですorz
0190デフォルトの名無しさん
2007/11/18(日) 00:28:05sequence = foldr mcons (return [])
where mcons p q = p >>= \x -> q >>= \y -> return (x:y)
↑のsequenceの定義を見るとfoldrが使われているんですが、それだと
sequence [putStr "foo", putStr "bar"] の場合リストの後ろの方、
つまりputStr "bar"の方が先に評価されるのに、実際には
fooの方が先に出力されてしまいます。どうして後ろからではなく、先頭から
評価されるんでしょうか?
0191デフォルトの名無しさん
2007/11/18(日) 00:55:140192デフォルトの名無しさん
2007/11/18(日) 01:04:47= A `mcons` (B `mcons` (C `mcons` (return [])))
= A >>= (\x -> (B `mcons` (C `mcons` (return []))) >>= \y -> return (x:y))
よってA, B, Cの順にエフェクトが出る。
0193デフォルトの名無しさん
2007/11/18(日) 01:17:35Haskell今日始めた人なんだけど
その最適化の一環としてディスパッチが省略された場合ってのは
C++でいうとtemplateによってコード生成された状態と考えていいんですかね
0194デフォルトの名無しさん
2007/11/18(日) 02:12:23main = putStr "hoge" >>= \x -> putStr "foo" >>= \y -> return y
main = putStr "hoge" >>= \x -> putStr "foo" >>= \y -> return "bar"
↑のように最後にreturnさえすればエラーにならずhogefooと出力されるということは、
IOモナドはMaybeモナドやListモナドと違って、最後に何を返すかではなく、
動作をどういう順に行うのかを決めるための仕組みだと考えればいいんでしょうか?
0195デフォルトの名無しさん
2007/11/18(日) 08:09:29そんな感じ。
>>194
何を返すかによってmainの型が違う。
上の二例ではIO ()で、最後の例だとIO String。
両方コンパイルが通るのは、mainの型はIO αという形なら何でもよく、
生成されたα型の値は無視されることになってるから。
0196デフォルトの名無しさん
2007/11/18(日) 13:45:25実行時にならないとどのインスタンスのコードが実行されるか
静的に決まらない場合ってどんな場合??
0197デフォルトの名無しさん
2007/11/18(日) 13:51:59クラスのインスタンス一般に対して書かれた関数は全部そう。例えば、
double :: (Num a) => a -> a
double x = x + x
こんな関数を定義したら、これをコンパイルする時点ではどの(+)を使うべきか決まらない。
0198193
2007/11/18(日) 13:56:54その関数doubleに対して具体的に値を入れたときに
コード生成される(静的に生成?)んじゃないんですかね?
頭がC++脳なのでtemplateのことばっかり頭に浮かんでしまうんですがね…
0199デフォルトの名無しさん
2007/11/18(日) 14:08:31少なくともGHCやJHCならdoubleが定義されたモジュールをコンパイルする時点でコードを生成する。
そうじゃないと、doubleを使う度に毎回doubleをコンパイルすることになって、
分割コンパイルの恩恵が薄れる。(C++はあえてこれをやってるわけだが)
それから、Haskellの仕様上、完全に静的に済ますわけにはいけない。
newtype P a = P a deriving Show
nq :: (Show a) => Int -> a -> String
nq 0 x = show x
nq n x = nq (n-1) (P x)
こういう関数をtemplate式でコンパイルしようとしたら、無限にnqのインスタンスを生成する必要がある。
あと、実際にはdoubleのような小さい関数はインライン化されるので、ディスパッチが省略される可能性はある。
0201デフォルトの名無しさん
2007/11/18(日) 14:34:20↑がこうなるのはわかるんですが
1:2:3 -> ?
とやった場合はどんなデータができるんでしょうか?
0202186
2007/11/18(日) 14:42:100203デフォルトの名無しさん
2007/11/18(日) 14:43:060204デフォルトの名無しさん
2007/11/18(日) 14:46:12(:) :: a -> [a] -> [a]
0205デフォルトの名無しさん
2007/11/18(日) 14:48:27やってみりゃいいじゃん。それで挙動に疑問があったらここでもう一度聞いてみな。
0206201
2007/11/18(日) 15:25:47なるのにghciで:t 1:2とやると
1:2 :: (Num t, Num [t]) => [t]
というなんだかよくわからないメッセージが出ます。
:tだと型チェックしないのかなと思ったんですが
:t putStr 1
とやると今度はきちんとエラーが出ます。
・1:2 :: (Num t, Num [t]) => [t] は一体どういう意味なのか
・なんで:t 1:2はエラーにならないのに:t putStr 1はエラーになるのか
↑2つになる理由は何故なんでしょうか?
0207デフォルトの名無しさん
2007/11/18(日) 15:43:17GHCは型クラス周辺を微妙に拡張してるからそのせいだろう。
Haskell98では(Num [t])という文脈はありえない。
Hugsで :t 1:2 と入れたらエラーが出たし。
0208デフォルトの名無しさん
2007/11/18(日) 15:44:430209デフォルトの名無しさん
2007/11/18(日) 15:53:43Haskellでは1とか7とかの整数リテラルは(Num a) => aという型を与えられる。
つまりNumのインスタンスなら何にでもなり得る。具体的にはIntでもIntegerでもRationalでもいいし、
未知のユーザー定義型でもいい。
「1:2」という式では、とりあえず「1」の型をtと書くと、整数リテラルだから(Num t)という制約が必要。
(:)の右辺の型は左辺の型のリストだから、「2」の型は[t]。これも整数リテラルだから制約(Num [t])も要る。
式全体の型は右辺と同じで[t]だから、結果として(Num t, Num [t]) => [t]になる。
0210201
2007/11/18(日) 16:16:460211デフォルトの名無しさん
2007/11/18(日) 16:19:47書かれていないとも限らない、ということですか。
0212デフォルトの名無しさん
2007/11/18(日) 16:44:20初歩的な質問でごめんなさい。
main = do
cs <- getContents
putStr.unlines $ lines cs
これはコンパイル通るんですが
main = do
cs <- getContents
putStr.unlines.lines cs
これは通りませんでした…これって何故なんですか?
てっきりlinesとunlinesというのは対になってるもんだと思ってたんですが…
0213デフォルトの名無しさん
2007/11/18(日) 16:50:06なら通るよ。
関数適用とか演算子の優先順位の問題だね。
f $ g x == f . g $ x /= f . g x
0214デフォルトの名無しさん
2007/11/18(日) 16:55:54「putStr.unlines.lines cs」の部分が
putStr.unlines.(lines cs)
って解釈されるはず
main = do
cs <- getContents
(putStr.unlines.lines) cs
ならたぶん通る
0215デフォルトの名無しさん
2007/11/18(日) 16:58:160216デフォルトの名無しさん
2007/11/18(日) 17:00:370217デフォルトの名無しさん
2007/11/18(日) 17:09:39まあ>>215をあまり真に受けないでくれ
0218デフォルトの名無しさん
2007/11/18(日) 17:23:42f.g x.h のように関数が引数を持つ場合にやるとなんか微妙
0219デフォルトの名無しさん
2007/11/18(日) 17:25:16こう決めた理由はあるの?
0220デフォルトの名無しさん
2007/11/18(日) 17:25:37思ったら、数学の教科書とソックリです。
つまり、Haskellは数学ができる人向けってことでしょうか?
0221デフォルトの名無しさん
2007/11/18(日) 17:31:13うお、通りました。ありがとうございます。
関数合成と関数適用の優先順位の問題だったんですね。
0222デフォルトの名無しさん
2007/11/18(日) 18:15:00関数適用最強の原則を守るためじゃないか?
俺は現状で満足だ。
map (fromMaybe 0 . fst) xs
とか書けるし。
0223デフォルトの名無しさん
2007/11/18(日) 18:34:32うざい括弧をつけなくて済む
0224デフォルトの名無しさん
2007/11/18(日) 20:16:16↑↑うざい括弧
0225デフォルトの名無しさん
2007/11/18(日) 20:23:030226デフォルトの名無しさん
2007/11/18(日) 20:42:38C言語風には f(g(x))
うざくない?
0227デフォルトの名無しさん
2007/11/19(月) 03:14:41このページの2007-07-04の日記を参考にプログラムを書いているのですが
これで横型探索できる理屈がまったくわかりません
0228デフォルトの名無しさん
2007/11/19(月) 03:39:03instance Monad (State s) where
m >>= k = State $ \s -> let
(a, s') = runState m s
in runState (k a) s'
↑の式でm >>= k が m >> kなら、右辺は
State $ \s -> let
(a, s') = runState m s
in runState k s'
((k a)がkだけになる)
という風になると考えていいんでしょうか?
0229227
2007/11/19(月) 04:04:210230デフォルトの名無しさん
2007/11/19(月) 04:24:37それでOK。
ただm >>= kとm >> kのkはそれぞれ別の型だってことに注意。
m1 >> m2 = m1 >>= const m2 なので k=const m2 と考えると
runState (k a) s'
= runState ((const m2) a) s'
= runState m2 s'
0231228
2007/11/19(月) 10:59:03>>=が一つだけならなんとか頭で理解できるんですが>>=が二つ以上ならんでいたり
do式で表されていたりすると脳味噌が追い付きませんorz
0232143
2007/11/19(月) 23:12:23<ターゲット、ホストに共通>
デフォルトサーチパスにGNU MPがない場合は--with-gmp-{includes,libraries}で指定する必要があるが、
途中からこの指定(ライブラリサーチパス)を見てくれなくなる上、
できあがったGHCでも-Lオプションを指定しなければいけなくなるので
(少なくともlibgmp.so.*かlibgmp.aファイルのどちらかを)デフォルトサーチパスにシンボリックリンクしておくほうがいい。
<ホスト>
ghc-6.6.1/Makefileの
echo ghc-$(ProjectVersion)/libraries/haskell-src/Language/Haskell/Parser.hs >> hc-files-to-go
という行を削除またはコメントアウトする必要がある。
libraries/Cabal/cabal-setup/CabalSetup.hsが作られないので、
cd compiler && make boot && makeの後、
cd libraries/Cabal/cabal-setup
rm CabalSetup.{o,hi} cabalsetup
../../../compiler/ghc-inplace -H16m -O -H32m -package Cabal -c CabalSetup.hs -o CabalSetup.o -ohi CabalSetup.hi -keep-hc-files
../../../compiler/ghc-inplace -o cabal-setup -H16m -O -H32m -package Cabal CabalSetup.o
する必要がある。
make hc-file-bundle Project=Ghcの前に、
make -C rts AutoApply_thr.hc AutoApply_thr_p.hc AutoApply_debug.hc AutoApply_thr_debug.hc
する必要がある。
続く
0233143
2007/11/19(月) 23:14:33<ターゲット>
いきなり/usr/localにインストールするのではなく、stage1のためのディレクトリにインストールして、
それを利用してもう一度ghcをビルドしたほうがいいと思われる。
*-hc-tar.gzをソースツリーにコピーするのではなく、展開されるghc-6.6.1を手動でソースツリーに上書きする必要がある。
distrib以下のスクリプトに実行権限を与える必要がある。
hc-buildが完了した後、
cd compiler
rm -f *.hs-incl
make primop-can-fail.hs-incl primop-commutable.hs-incl primop-data-decl.hs-incl
primop-has-side-effects.hs-incl primop-list.hs-incl primop-needs-wrapper.hs-inc
l primop-out-of-line.hs-incl primop-primop-info.hs-incl primop-strictness.hs-inc
l primop-tag.hs-incl primop-usage.hs-incl
find . -name \*.o -exec rm {} \;
make boot stage=1 && gmake stage=1
cd ..
make install stage=1
で完了。
ちなみにザウルスのOpenBSD上では16MB以上のテキストセグメントがある実行ファイルは実行できないので
テキストセグメントを32MBに拡張したカーネルを使用しなければビルドできませんでした。
GNU makeがmakeという名前以外(gmakeなど)でインストールされている場合は、適宜読み替えてください。
かなり効率の悪い方法なので、Makefile等をちゃんと読めばもっと最適化できると思います。
古いGHCで新しいGHCをビルドするのはうまくいきますが、
新しいGHCで古いGHCをビルドするのはなかなかうまくいきませんね。
0234デフォルトの名無しさん
2007/11/20(火) 08:39:00例えば
add x y = x + y
という関数があって、一度
add 1 2
という式を評価した後もう一度
add 1 2
を評価しようとするとき、内部では律儀に 1 + 2 を行うんでしょうか?それとも
add 1 2 = 3
みたいな式が内部で作られてたりするんでしょうか?
0235デフォルトの名無しさん
2007/11/20(火) 09:30:04俺が知ってるのは
f x a b c = a*x*x + b*x * c
という関数に対して
f (1+2) 3 4 5
と呼び出した場合に1+2が1度しか評価されないことくらい…
0236デフォルトの名無しさん
2007/11/20(火) 10:20:01Haskellの規格では規定されてないけど、普通は評価しなおす。
関数を全部メモ化していたら、救いようのないメモリリークが起こるはず。ただし、
map (\x -> x * add 1 2) xs
のようなコードが最適化されて
let _z = add 1 2 in map (\x -> x * _z) xs
になって、add 1 2が一回しか計算されない、という場合はある。
0237デフォルトの名無しさん
2007/11/20(火) 11:41:31コンパイラのコンパイルオプションによっても動作が違うかな
import System.IO.Unsafe
f n=seq (unsafePerformIO $ putStrLn "hello") n
a=f 1+f 1
main=print a
のようなコードだとGHC6.6.1の場合で最適化なしの場合とありの場合でhelloの表示回数が違ったりする。
0238237
2007/11/20(火) 11:44:46a=f 1+f 2
でも最適化ありで1回表示、 無しで2回表示でした。
0239デフォルトの名無しさん
2007/11/20(火) 18:31:21ドラキュラとかが眠ってそうな感じの、棺おけ型のベッドというのは市販されているのでしょうか?
冬の暖房の時期に、部屋ごと暖めるのでは効率が悪いので、棺おけの中だけ温度調節できれば
コスト安になると思ったのです。
また、フタをつけるので静かですし、明かりもシャットアウトできてよいと思うのです。
0240デフォルトの名無しさん
2007/11/20(火) 19:04:23(計算をデフォルトで遅延させる機能のある、関数型のプログラム言語は市販されているのでしょうか?)
冬の暖房の時期に、部屋ごと暖めるのでは効率が悪いので、
(評価されない可能性のある式を正格に評価するのは効率が悪いので)
棺おけの中だけ温度調節できればコスト安になると思ったのです。
(必要になってから評価できれば計算コストを削減できると思ったのです。)
また、フタをつけるので静かですし、明かりもシャットアウトできてよいと思うのです。
(一度評価されればメモ化されるので計算量が少なくなりますし、バグの混入もシャットアウトできてよいと思うのです。)
答え:Haskellは無料で公開されています
こうですか!? わかりません!
0241デフォルトの名無しさん
2007/11/20(火) 19:27:370242デフォルトの名無しさん
2007/11/21(水) 04:31:54GHC6.8.1にはHGL入ってないんですか?
0243デフォルトの名無しさん
2007/11/22(木) 01:59:38Win32モジュールにはSetLayeredWindowAttributesのラッパは入ってないんだな・・
自作するしかないんだろうか。
0244デフォルトの名無しさん
2007/11/22(木) 07:26:410245デフォルトの名無しさん
2007/11/22(木) 12:20:00>書いてパッチを送るんだ!
いや、これってwindows2000以降の機能で、Win32モジュールに入れるべきかどうか正直迷うんだよね。
0246デフォルトの名無しさん
2007/11/22(木) 23:16:48ツッコミなどよろしく。
0247デフォルトの名無しさん
2007/11/23(金) 09:58:22Windowsに詳しくないので間違ってたら済まんが、2000以降のみの関数も
普通にwin32パッケージに入ってないか?setConsoleCPとかfindFirstChangeNotificationとか。
>>246
どこに置いたかも書けよw
0248デフォルトの名無しさん
2007/11/23(金) 10:06:51場所は、わかるだろ。
0249デフォルトの名無しさん
2007/11/26(月) 23:05:20既存の流行している言語は対応できてないと。
これはどういう理由でしょうか?遅延評価とか、その辺のことを指しているんでしょうか。
0250デフォルトの名無しさん
2007/11/26(月) 23:13:400251デフォルトの名無しさん
2007/11/26(月) 23:23:18一人歩きしてるだけじゃないかな。実際には何をするにも副作用は
あるし、MapReduce だって Reduce の作業はスケーラビリティが
殆ど無いか少ない。関数型言語には副作用が無いというのと同じ様な
勘違い。ただ副作用が無い=スケールする部分を奇麗に切り出せる
のであれば有用ではある。
0252デフォルトの名無しさん
2007/11/27(火) 11:43:41>>249の話は伝聞なんで雲を掴むような話だけど。
0253249
2007/11/27(火) 11:48:13遅延評価っていうのは、別に関係ないんでしょうか。何かそっちの話を聞いた
ことがあるんです。自分の初心者脳では、正格では無限のリソースを前提に
した関数を書けないが、Haskellのような言語だと記述可能、とか思ったのですが、
ちょっと頭悪いですか?w
0254デフォルトの名無しさん
2007/11/27(火) 12:16:38CPUコアの利用効率を上げられますが、
それには頭のいいスケジューラが必要なわけで。
例えば、
http://www.fixstars.com/Grid/pukiwiki/index.php?MapReduce
にプチ解説があるようなstragglersの問題。
ただ実行順序が規定されてないので、
工夫する余地がまだまだ残されているとは言えると思う。
Erlangのような言語が、あまりpure functionalじゃないとはいえ、
一通りの実績を上げていますし。
また、プログラマがスケジューラに自由を与えるような
プログラミングスタイルを強制されているという見方もあると思う。
0255デフォルトの名無しさん
2007/12/06(木) 10:41:19関数型で今イチバン売れ筋なのはF#なんですかね。
0256デフォルトの名無しさん
2007/12/06(木) 17:36:48・概念的にはMonadよりArrowのほうが分かりやすいんじゃないか?とか。
・Monadって何?って聞かれるとなんと答えていいかわからないが、
Arrowなら『矢印をカプセル化したようなもの』と言える。
あとは適当に結合演算とか普通の関数をアロー化する演算とか実装していけばおk。
脳内のイメージも矢印をつないでいくだけだし。
Monadをイメージしようとしてもなんかいまいちピンとこない……。
bindにやる夫関数とか適当に名前を付けて無理矢理イメージしたけど。
・Monadのbind演算子(>>=)はm a -> (a -> m b) -> m bで非対称的。
Arrowの(>>>)はa b c -> a c d -> a b dで比較的対称性があって気持ちよい。
・Arrowは『計算を結合』しているのが自明的に表現されてる。
Monadは別にそうは見えない。……値と計算を結合なのか?意味わかんね。
・そもそも非対称な二項中置演算子はイマイチ気に入らない。
リスト結合演算子とか`elem`とかは仕方ないけど、せめてあまり高階にしてほしくない
・Monadの計算部(a -> m b)は結構重要なパーツの一つなのに、名前が付いてない。
だから『モナドを返す関数』としかいえねえ。
しかもbindした後にはその返り値とは(型は同じだけど)別の奴が帰ってくる。無駄に混乱。
その点Arrowは計算部がずばり『Arrow』。カプセル化されていて美しい。
・Monadは(>>=)は左から右へ流すように使えるが
普通の関数は右から左。もちろんliftMとかも右から左。
(=<<)も右から左。しかし関数を拡張して適用するという見方で見るとこっちが自然という謎さ。
結局どっちからどっちへ読むべきか迷う場所が多く、思考停止してしまう。
ArrowだったらArrowとして結合されている部分は左から右。
普通の関数は右から左で思考が自然に切り分けられる。
0257デフォルトの名無しさん
2007/12/06(木) 17:37:32Arrowはまあ基本的にポイントフリーな感じがするし、普通の関数と分けられていいんじゃない?
・Arrowの構造を作ったりする関数は基本的にArrowだけを返す。
Monadの関数はなんかリストとかに入ってたりして気味が悪い。モナドのリストって、最中十個入りじゃないんだから。
・Arrowの構造を作る関数はキチンと構造を作ってるように見える。
Monadの場合は解読に時間がかかる。なんのためにこんな書き方をしてるんだろうとか……。
・ArrowでStateを自作してみたら比較的分かりやすかった。
Monadのは今見ても訳が分からん。というかMonadの対象が関数って何だよ。
・Monadに慣れ親しんでる人はMonadを扱うのに苦労しないだろうから、
簡単なものなら短い表記が出来るMonadのほうがいいんだろう。
しかし、初心者にいきなり教えるのならArrowのほうが直感的。
ポイントフリースタイルを使いまくってムツカシイことさえしなければ。
・Arrow講座みたいな入門編とかでArrowを書くとき、
関数がそのままアローになるからってやたら省略しないでいただきたい。
アローな部分と普通の関数の部分が綺麗に分かれてるのがいいんだから……
それにarrってやっておけばその部分は一般のArrowでも使えるし。
SF f >>> SF g = SF (f >>> g)とか出来るからそういう書き方が出来ること自体はありがたいが。
・arr.uncurryとかarr.constってよく出てくるけどそういう関数はないのか……
・Arrow関係ないけどデータ構築子と型構築子が同じ名前って混乱するな。時々イラっとくる。
・aとかbとか何を表してんのか直感的じゃねえよ。型変数だったり、引数だったり……
fって名前だから関数かと思いきやArrowだったり。
ネーミング規約みたいなものはないのか……
Arrowが引数で来たときの名前の付け方とかおもいつかねえけど。
・そろそろふつける買おうかな……。
・初心者のくせに身の程をわきまえない長文失礼しました……
0258デフォルトの名無しさん
2007/12/06(木) 17:42:34> ・Monadでポイントフリースタイルをやろうとするとかなりキモくなるよね。
もう少し他人のコードを読んでいくと感覚がつかめてくると思いますよ
0259デフォルトの名無しさん
2007/12/06(木) 18:11:18しかし「モナドのリスト」って言い方は何か違和感あるな。
[IO]みたいなのを想像してしまう。
0260デフォルトの名無しさん
2007/12/06(木) 18:16:500261デフォルトの名無しさん
2007/12/06(木) 18:25:06把握。
>>259
ライブラリを見返してるけどそこまではなかったかも……。
初めて見たときに比べればそこまで疲れないし。
やっぱり慣れの問題なんだろうか。『モナドを返す関数』が普通の関数と同じ地位にいるのがイマイチだけど。
引数の数でバージョンがいくつもあったりするのもなんかいただけない。
でもやっぱり慣れれば気にならなくなるんだろうな……。
なんかJavaやったらCのポインタが理解できた時の気持ちを思い出した。(違うか)
0262デフォルトの名無しさん
2007/12/06(木) 18:30:020263デフォルトの名無しさん
2007/12/06(木) 18:30:440264デフォルトの名無しさん
2007/12/06(木) 18:38:36日本語だと「モナドな関数」か。
俺のコードの大部分はモナドな関数になってるな。
普通の関数より書きにくいから嫌なんだが、変更に強いコードにするために仕方なく。
0265デフォルトの名無しさん
2007/12/08(土) 12:05:09http://www.sampou.org/haskell/tutorial-j/classes.html
> (ここで、同値性といっているのは、「値同値性」のことです。
> 対照的な概念としては、「ポインタ同値性」というのがあります。
> たとえば、Java 言語の == です。
> ポインタ同値性は参照透明性を持ちません。
> それゆえに純粋な関数型言語とは相性がよくありません。)
なぜポインタ同値性は参照透明性を持たないのですか?
0266デフォルトの名無しさん
2007/12/08(土) 12:26:42ポインタ同値をテストする関数eqがあったとすると、
let v = [1,2] in eq v v
はTrue。一方、vを展開して
eq [1,2] [1,2]
とするとFalseになるかもしれない。
参照透過って言うのはそもそも、こういう展開をしても
プログラムの意味が変わらないってことだから、
eqによって参照透過性が破られたと言える。
0267265
2007/12/08(土) 12:37:55おー!なるほど。わかりやすい説明ありがとう。
[1,2] が複数箇所に出現する場合、メモリ上に別々に配置されるかもしれないわけですね。
勉強になりました。
0268デフォルトの名無しさん
2007/12/09(日) 15:29:39Aは型構築子、全体は多相型、aはパラメータ
Aはデータ構築子、全体はデータ構造、aはその中身
aは型クラスAのインスタンス、何かの型の一部
って変わるのがちょっとわかりにくいね。もうちっとなんとかならんか。
0269デフォルトの名無しさん
2007/12/09(日) 21:35:19乱数生成器をsplitしていくつかにしてseed固定で乱数を作れといわれました。
どう作ればいいんでしょうか?
初歩的な質問だったらすみません。
0270デフォルトの名無しさん
2007/12/10(月) 00:51:190271デフォルトの名無しさん
2007/12/10(月) 15:07:15でも無限リスト型を再定義するとリストに関して作ったすべての関数について委譲関数を作んなきゃいけなくて現実的じゃない。
結局これは妥協するしかないのか?それともなんらかのテクニックで回避できる?
0272デフォルトの名無しさん
2007/12/11(火) 10:46:48日本語でおk
0273デフォルトの名無しさん
2007/12/11(火) 10:52:25俺の知る限り、妥協するしかない
0274デフォルトの名無しさん
2007/12/11(火) 12:46:45評価がとまらないだけで型安全だよ。
0275デフォルトの名無しさん
2007/12/11(火) 13:17:06でも全域関数でない関数が厄介なことは事実だから、何か呼び名が欲しい
0276デフォルトの名無しさん
2007/12/11(火) 17:14:07よくわかんないけど、チューリングの停止問題のこと言ってるの?
0277デフォルトの名無しさん
2007/12/11(火) 17:30:25いや、Haskellには失敗し得る関数があるじゃん
例えば、headはリストが空の時例外を飛ばすし、
lengthは無限リストに適用されたら終わらない
一方で、例えばdropみたいに、引数に未定義値が含まれない限り、
あらゆる引数に対してちゃんと値をもどす関数もある
だからこの二つを区別できるように、短い呼び名があれば便利だな、ということ
「型安全」という言葉を使いたくなるけど、これは>>274の言う通り誤用だし
0278デフォルトの名無しさん
2007/12/11(火) 17:40:12そういう一般的な関数のことを部分関数というんじゃないかね
0279デフォルトの名無しさん
2007/12/11(火) 18:03:01全域関数も部分関数の一種だから、とか考えてたけどカジュアルに使う分には問題ないか
グダグダですまん
0280271
2007/12/11(火) 19:46:50型システムで『無限リストかそうでないか』をカッキリ分けられたら、
そっちのほうが型安全にならないかな?と思って271を書いたんだけど。
たとえば幽霊型とか使ってそういうのが解決できないかとか思ったんだけど、
それじゃ現行の関数を活かせないし、あんまり意味ないなあ、と。
0281デフォルトの名無しさん
2007/12/12(水) 01:00:18言いたいのは、型システムを使って、
無限リストのフロー解析をして、
プログラムの停止性、正当性などを知ることができないかってこと?
それならリストの有限性の抽象解釈をやるってことになると思うけれど。
0282271
2007/12/12(水) 01:16:01違う。返り値が無限リストの関数で、その関数の型を明示しておけば、
無限リストに対して使ってはいけない関数の引数にした時に型エラーになるようにしたい。
まあ無理っぽいのでもう諦めてるけどな。
0283デフォルトの名無しさん
2007/12/12(水) 02:43:32※起こりえる全てのリストのうちどれが有限リストかを確かめることは
無限に長いリストに対して演算を行うことと同じ
ってだれかが言ってた
0284デフォルトの名無しさん
2007/12/12(水) 07:57:59静的に型推論してくれるんだから、
enumFromにInt a => a -> [a] Inf
って書けるとして
lengthに[a] Ltd -> Int
みたいに指定したらコンパイルエラーになって欲しいとかそういう問題だって。無理だけど。
0285デフォルトの名無しさん
2007/12/12(水) 08:17:31あとコンパイルエラーになって欲しいのは『length.repeat x』みたいな文脈な。
0286デフォルトの名無しさん
2007/12/12(水) 09:39:03>>281の言うような方法も効果を挙げるだろうが、
lazyな言語だと、リストを生成する全ての関数が、
無限リストを返す可能性があるので>>276でFAだが。
[1..]が無限リストであることも、解析が必要になるし。
うまくできるケースもあるが、希少すぎる。
0287デフォルトの名無しさん
2007/12/12(水) 11:18:260288デフォルトの名無しさん
2007/12/12(水) 11:39:590289デフォルトの名無しさん
2007/12/12(水) 17:16:57関数言語としてのおいしいところは全てC#3.0に持っていかれてしまった。
0290デフォルトの名無しさん
2007/12/12(水) 17:26:090291デフォルトの名無しさん
2007/12/12(水) 17:27:04関数言語?w
C#3.0?w
0292デフォルトの名無しさん
2007/12/12(水) 18:12:14F#じゃなくて、C#かよ・・・
0293Wadler
2007/12/12(水) 22:26:38a->[a]という(型の)monad(仮にDとしましょう)をつりたくて困っています。
どなたか教えてください。
とくにDのmapFにあたる関数も教えていただけれありがたいです。
0294デフォルトの名無しさん
2007/12/12(水) 23:11:10はい?
0295デフォルトの名無しさん
2007/12/12(水) 23:12:010296デフォルトの名無しさん
2007/12/12(水) 23:13:50日本語でおk
0297デフォルトの名無しさん
2007/12/13(木) 00:02:02data D a = mkD (a -> [a])
instance Monad D where ...
ってことか?
あとmapFってなんだ?fmap?
0298デフォルトの名無しさん
2007/12/13(木) 01:20:15よくわからんが、釣りってことか?
0299デフォルトの名無しさん
2007/12/13(木) 01:23:14mkDはなぜ先頭が大文字になってないんだ?
受理されないだろ。
0300デフォルトの名無しさん
2007/12/13(木) 01:25:29近頃Haskellerの質の低下が激しすぎるぞ
0301デフォルトの名無しさん
2007/12/13(木) 02:15:060302デフォルトの名無しさん
2007/12/13(木) 02:20:100303デフォルトの名無しさん
2007/12/13(木) 02:23:350304デフォルトの名無しさん
2007/12/13(木) 08:17:19>>303
そのとうりですすいません……
0305デフォルトの名無しさん
2007/12/13(木) 11:07:28この辺からおかしくなってきてる
0306デフォルトの名無しさん
2007/12/13(木) 11:49:460307デフォルトの名無しさん
2007/12/13(木) 11:51:120308デフォルトの名無しさん
2007/12/13(木) 16:58:02大人数投入用にコードもデータもブラックボックスにできる仕組み(命令型のオブジェクト指向同等?)誰か作らないのかな
0309デフォルトの名無しさん
2007/12/13(木) 17:07:09人海戦術でプログラミングする時代は終わった
0310デフォルトの名無しさん
2007/12/13(木) 17:23:49ブラックボックス化ってどんなの?
カプセル化なら標準のモジュールシステムがあるけど
0311デフォルトの名無しさん
2007/12/13(木) 17:28:42そんなにオブジェクト指向がやりたいなら
つ O'Haskell
0312デフォルトの名無しさん
2007/12/13(木) 17:30:170313デフォルトの名無しさん
2007/12/13(木) 17:31:50・・・夢を見た
0314デフォルトの名無しさん
2007/12/13(木) 18:14:01そもそもhaskellにはオブジェクト指向は不要なんですよ。
というのも、関数の再利用できる範囲がCやらjavaやらとは桁違いに大きいのが特徴だからです。
0315デフォルトの名無しさん
2007/12/13(木) 21:20:250316デフォルトの名無しさん
2007/12/13(木) 21:22:030317デフォルトの名無しさん
2007/12/13(木) 21:35:09そもそもhaskellを使って実用アプリを公開してる人があんまりいないんだから
仕方ないだろ。
0318デフォルトの名無しさん
2007/12/13(木) 22:49:470319デフォルトの名無しさん
2007/12/13(木) 23:10:300320デフォルトの名無しさん
2007/12/14(金) 00:39:15GHCiの機能追加がメインっぽい。
0321デフォルトの名無しさん
2007/12/14(金) 00:53:25generic programing指向だからなあ。
Genericsの世界では最強認定を受けてる。
0322デフォルトの名無しさん
2007/12/14(金) 01:21:070323デフォルトの名無しさん
2007/12/14(金) 02:29:17工場制手工業ならOOであることやポピュラリティ(みんなが使ってること)は必須だ。
0324デフォルトの名無しさん
2007/12/14(金) 13:26:48今流行ってること取り入れたってどうせちぐはぐになるだけ。
0325デフォルトの名無しさん
2007/12/14(金) 13:28:050326デフォルトの名無しさん
2007/12/14(金) 14:15:06OOは一手法に過ぎないんだから、もっと良いものが知られればそっちが使われるようになるだろ
0327デフォルトの名無しさん
2007/12/14(金) 14:21:57わざわざ分けて必須って言うほどのものではないな。
0328デフォルトの名無しさん
2007/12/14(金) 14:54:59意外とreusabilityが悪いから、
generic programmingが注目されているのが現状です。
Haskellのtype classとかC++のconceptみたいなやつ。
C++はtemplate/traitsでやってましたが、ちょっと非力なので、
Haskellのtype classそっくりの"concept"が入る事になりました。
0329デフォルトの名無しさん
2007/12/14(金) 14:59:18実際使ってみたら意外とオブジェクト指向のメリット包含しててSUGEEとか思った
0330デフォルトの名無しさん
2007/12/14(金) 14:59:57日本語でおk
0331328
2007/12/14(金) 15:35:510332デフォルトの名無しさん
2007/12/14(金) 15:45:42不自然だ
読みにくい
目が痛い
0333デフォルトの名無しさん
2007/12/14(金) 16:23:51共産主義みたいなもん。高尚な理屈よりも明日パンが、今日のバグを潰せるかが問題なわけだ。
いいじゃない。Haskellは芸術的な小物を個人で作るのに向いてるってことで。
0334デフォルトの名無しさん
2007/12/14(金) 17:07:50多数のバカよりも少数の優秀な人間でプログラミングしたほうが安く早くできます。
0335328
2007/12/14(金) 17:08:28そういう意味か。すまん
>>328については、
http://journals.cambridge.org/action/displayAbstract?fromPage=online&aid=715036
で。探せばピィーディーエフも見つかるようです。
0336デフォルトの名無しさん
2007/12/14(金) 17:09:42どの辺の理論のことを言ってるの?
0337デフォルトの名無しさん
2007/12/14(金) 17:10:46不自然だ
読みにくい
目が痛い
お前は日本語文書の常識を勉強したほうがよさそうだな
0338デフォルトの名無しさん
2007/12/14(金) 17:16:49周辺環境も整っていない状況だと、小物を個人で作るのすら満足にできん。
0339デフォルトの名無しさん
2007/12/14(金) 17:43:43が、6.8系用が出てない・・6.6系は非公式
0340デフォルトの名無しさん
2007/12/14(金) 17:52:210341デフォルトの名無しさん
2007/12/14(金) 17:56:18普通にdarcs版をビルドできないか?
0342デフォルトの名無しさん
2007/12/14(金) 17:56:46なんで?
0343デフォルトの名無しさん
2007/12/14(金) 19:53:13つまりこれで全ての言語がC++のサブセットになるというわけです
0344デフォルトの名無しさん
2007/12/14(金) 20:54:45本日からHaskellはC++のサブセットである
兄弟の絆に結ばれる
Haskellのくたばるその日まで
どこにいようとC++は貴様らの兄弟だ
多くはベトナムへ向かう
ある者は二度と戻らない
だが肝に銘じておけ
C++は死ぬ
死ぬために我々は存在する
だがC++は永遠である
つまり―――Haskellも永遠である!
0345デフォルトの名無しさん
2007/12/15(土) 07:46:00test = flip fun1 . fun2
の場合、
1. test = flip (fun1 . fun2)
2. test = flip (fun1) . fun2
どっちの意味なんでしょうか。(.)が使用されている場合、flipが対象とする
関数がどこまでかかるか分かんなくなってしまいました。
0346デフォルトの名無しさん
2007/12/15(土) 08:05:18括弧の付け方としては (flip fun1) . fun2 のほうが正しい。
0347345
2007/12/15(土) 14:13:25ありがとうございます。合成関数全体にかかるのかと思ってました。
もう少しいいでしょうか。
http://ja.doukaku.org/comment/4621/
にある、
attachIndex = map (uncurry (flip zipWith [0..] . ((,) .) . flip (,))) . zip [0..]
がよく理解できないのですが、
(flip zipWith [0..] . ((,) .) . flip (,)) 0 "abc"
の部分は
zipWith (((,) .) $ flip (,) 0) [0..] "abc"
と考えられると思うのですが、何ででしょうか。(flip zipWith [0..] . ((,) .) . flip (,)) の
第一引数"0"がまず部分適応されてflipされるところが理解できません。
0348デフォルトの名無しさん
2007/12/15(土) 14:41:26から始める。まずこの式は(A . B . C) 0という形だからA (B $ C 0)に直せて、
flip zipWith [0..] ( ((,) .) $ flip (,) 0 )
これはflip A B Cという形だからA C Bと書き換えられて、
zipWith ( ((,) .) $ flip (,) 0) [0..]
0349345
2007/12/15(土) 15:29:30ありがとうございます。しかし、まだちょっと理解できませんw
1.第一引数"0"の部分適応を行う
2.flip する
の順番の根拠がよく分かりません。
(flip zipWith [0..] . ((,) .) . flip (,)) 0 "abc"
の第二引数が最後に適応されるのは何故でしょうか。
あと、これは変な質問なんですけど、
(flip zipWith [0..] . ((,) .) . flip (,)) 0 "abc"
の形を慣れた方は直接記述できちゃうんでしょうか。それとも、
zipWith ( ((,) .) $ flip (,) 0) [0..] "abc"
の形から変形させていく形でプログラム書いていくんでしょうか。
0350デフォルトの名無しさん
2007/12/15(土) 15:37:45Haskellでは基本的にどんな順番で簡約しても結果は同じだから、分かりやすい順序でやっただけ。
もっと実装に即した順序でやることもできるけど、面倒なだけな気がする。
>の形を慣れた方は直接記述できちゃうんでしょうか。
俺はできない。読むのも二分くらい掛かった。
0351デフォルトの名無しさん
2007/12/15(土) 15:42:07たぶんすらすら書けるんだろう。
0352デフォルトの名無しさん
2007/12/15(土) 15:46:11そーいうのって可読性犠牲にしてまでやるものなのか?
0353デフォルトの名無しさん
2007/12/15(土) 15:47:28> Haskellでは基本的にどんな順番で簡約しても結果は同じだから、分かりやすい順序でやっただけ。
(flip zipWith [0..] . ((,) .) . flip (,)) 0 "abc"
自分がどうも腑に落ちないのは、どうして
zipWith ( ((,) .) $ flip (,) 0 "abc") [0..]
こうじゃないんだろう?ってとこなんですね。もちろん、こういう解釈だとダメなんですけど、
引数一つだけ取って、ある関数を返してから、次に行くってのがルールだったりするのかな、
と思ったのですが。
> 俺はできない。読むのも二分くらい掛かった。
そうですかw。いや、直感的に書ける人って凄いなぁって思ったんですが、なかなか
そういう人はいないんでしょうかね。
0354デフォルトの名無しさん
2007/12/15(土) 16:02:39デザインパターン中毒はどうか知らんが、この書きかたには
記述が簡潔になるという利点があるんだから、別にいいんじゃないかと思う。
>>353
Haskellの関数は常に一引数関数で、多引数関数は
カリー化でエミュレートされているだけだということを思い出すべし。
(.)も両辺を一引数関数として合成するから、
(f . g) a b
と
f (g a b)
は等しくない。
0355デフォルトの名無しさん
2007/12/15(土) 16:05:04> (f . g) a b
この括弧なんとかならないかな
0356デフォルトの名無しさん
2007/12/15(土) 16:13:51> Haskellの関数は常に一引数関数で、多引数関数は
> カリー化でエミュレートされているだけだということを思い出すべし。
そうでしたw。
いやぁ、ありがとうございます。スッキリしました。
0357デフォルトの名無しさん
2007/12/15(土) 16:36:06>219に戻れ
0358デフォルトの名無しさん
2007/12/15(土) 16:43:36>>219とは趣旨が違う
> (f . g) a b
この括弧はうっとうしいなぁと言ってるだけなんだよ。
$みたいに括弧省略したい
0359デフォルトの名無しさん
2007/12/15(土) 17:10:550360デフォルトの名無しさん
2007/12/15(土) 17:31:400361デフォルトの名無しさん
2007/12/15(土) 20:25:33お前は何を言っているんだ
0362デフォルトの名無しさん
2007/12/15(土) 21:14:46心で感じろ
0363デフォルトの名無しさん
2007/12/16(日) 01:37:28風を感じろ
0364デフォルトの名無しさん
2007/12/16(日) 01:45:320365デフォルトの名無しさん
2007/12/16(日) 20:36:290366デフォルトの名無しさん
2007/12/17(月) 08:39:00太字になるのは?
0367デフォルトの名無しさん
2007/12/17(月) 09:27:140368デフォルトの名無しさん
2007/12/17(月) 11:39:390369デフォルトの名無しさん
2007/12/17(月) 11:47:310370デフォルトの名無しさん
2007/12/17(月) 16:08:40(疎結合の)クラスタ範囲にまで並列化する
(普通のマルチコア・マルチCPU(どっちも共有メモリ)範囲の(半)自動並列化ならGHC本体だけでもできる)
そんなハード持ってなければどっちみち関係ない
0371デフォルトの名無しさん
2007/12/17(月) 22:55:51/ \
/ ─ ─\ 今年もあと一ヶ月だお・・・
/ (●) (●) \
| (__人__) | ________
\  ̄ ./ .| | |
ノ \ | | |
/´ | | |
| l | | |
ヽ -一ー_~、⌒)^),-、 | |_________|
ヽ ____,ノγ⌒ヽ)ニニ- ̄ | | |
/ ̄ ̄ ̄\
/ ─ ─ \
/ (●) (●) \. 俺はこの一年間何をしていたんだろう
| (__人__) | 2chで浪費した莫大な時間を何か有意義なことに使っていたら・・・
\ ` ⌒´ /
/ \
0372デフォルトの名無しさん
2007/12/17(月) 23:18:53つうか基本的に専門スレしか見ない人も多いと思うんだが。
今年も大変勉強になりました。
0373デフォルトの名無しさん
2007/12/22(土) 18:46:23>>96
JavaScriptでもできるな
0374デフォルトの名無しさん
2007/12/22(土) 20:49:400375デフォルトの名無しさん
2007/12/22(土) 23:20:062ちゃんやらなくても結果は一緒だったと思うんだよ
0376デフォルトの名無しさん
2007/12/23(日) 00:04:510377デフォルトの名無しさん
2007/12/24(月) 12:55:59読んだ人いる?
圏論による論理学 高階論理とトポス
清水 義夫
ISBN978-4-13-012057-9,
発売日:2007年12月中旬,
判型:A5, 232頁
内容紹介
20世紀後半,数学,計算機科学,論理学などの分野で採用されてきている圏論.
関数概念を基本として現象をとらえようというこの方法を,
関数型高階論理とトポスを題材にして丁寧に解説する.
論理学の観点を中心に,圏論の考え方を紹介するテキスト.
主要目次
序
第1章 関数型高階論理
第2章 トポス
第3章 トポスの基本定理
第4章 プルバック関手f *の右-随伴関与Πf
第5章 リミット、空間性トポス、限定記号
結び
付録1 A∧( ) ┤A⊃( )のイメージ的理解
付録2 各章の課題
主な記号一覧/索引
0378デフォルトの名無しさん
2007/12/24(月) 12:57:43立ち読みしたが、俺らには全く関係ないよ
0379デフォルトの名無しさん
2007/12/24(月) 12:59:29●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
●●●●●●●●●●●●●●●●不合格●●●●●●●●●●●●●●●●●
●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
これを見た人は確実に【不合格】です。これをコピペでどこかに1回貼れば回避できます。
これは本当です。やらないと一年無駄になります.
私も最初は嘘だと思ったんですが、一応コピペしました。それで第一志望に合格出来ました。
けどコピペしなかった友達がA判定とっていたのに、おちたんです。(慶応合格h.sさん)
俺はもうE判定で記念受験だったんだけど、コピペを10回くらいした途端に過去問が
スラスラ解けるようになって、なんと念願の開成に受かりました。(開成合格r.kくん)
これを今年の試験前に見てシカトしたら、入試でミスって最悪です。(n.aさん)
0380デフォルトの名無しさん
2007/12/24(月) 16:34:290381デフォルトの名無しさん
2007/12/24(月) 16:37:43通報しますた
0382デフォルトの名無しさん
2007/12/25(火) 08:38:38関係ないことないだろ。
Haskellの型システムを理論的に理解する時など。
0383デフォルトの名無しさん
2007/12/25(火) 08:51:280384デフォルトの名無しさん
2007/12/25(火) 11:43:560385デフォルトの名無しさん
2007/12/26(水) 19:57:100386デフォルトの名無しさん
2007/12/26(水) 21:11:49東大OB乙
0387デフォルトの名無しさん
2007/12/28(金) 18:50:21場所はバトルロワイヤルの撮影地にもなった
軍艦島での一枚です。
http://www.uploda.net/cgi/uploader1/index.php?file_id=0000278909.bmp
撮影し現像した物を
心霊写真がないかな〜っと面白半分で探していると
偶然にも一枚だけ物凄い写真が在りました
最初に見えたのは右下の子供の様な顔です
左にはボーっと立ち尽くし
こっちを見ている子供がうっすらと写っています
上部には青白い叫び顔があります
それだけではありません
探せば探すほど気持ち悪い顔があるのです
私は現在で約30ほどの顔を見つけました、全てこっちを見ています
探せば探すほどあまりにも出てくるので
気持ち悪くなり頭が痛くなりました
この写真ですが、ある友人に貸した所
夜に1時間程笑い声の様なものが聞こえてかなり
怖かったらしいです・・・
霊感がある方はぜひ鑑定をお願い致します。
因みに、スキャナーで高画質でスキャンした上で
見易いように画質調整をしています
ですのでファイルサイズが9MBにもなります・・・
0388デフォルトの名無しさん
2007/12/28(金) 21:23:54スレ違い
画像処理 その10
http://pc11.2ch.net/test/read.cgi/tech/1197759782/
0389デフォルトの名無しさん
2007/12/29(土) 00:40:560390デフォルトの名無しさん
2007/12/31(月) 18:01:51既出や意味不明な質問でしたらすみません。
ポイントフリースタイルって言葉がありますよね。
仮引数を無くして、関数を関数だけで定義するという意味で。
firstNLines n cs = (unlines . take n . lines) cs
上のような関数が定義されていたとして、
仮引数を減らす仮定で
firstNLines n = unlines . take n . lines
上のように書けますよね。
更に仮引数 n を無くす場合
firstNLines = (. lines) . (unlines .) . take
と書けると思うんですが
ポイントフリースタイルとなった最後の定義式を見て
理解しやすくなったとは思えないのです。
積極的に使うべきなのでしょうか。
0391デフォルトの名無しさん
2007/12/31(月) 18:07:32ごちゃごちゃしてるのがいやならポイントフリーで。
0392デフォルトの名無しさん
2007/12/31(月) 19:15:14とりあえず二つ目のfirstNLines nみたいに普通に使ううちは
型を明示してれば分かりにくくなることも無いけど、
度を過ぎた奴はコードの修正とかも考えると扱いにくいわ読みにくいわでいろいろと面倒だし、
ポイントフリースタイルが時にはポイントレス(要領の悪い)スタイルといわれることもある
ってHaskellWikiに書いてた
俺もflipとかドットとか使いまくったコードを読むのは嫌い。
でも書いてる奴からするとパズルみたいで楽しいんだろうなあ、とか。
0393389
2007/12/31(月) 19:29:48書くときは頭の体操になるかもしれませんが
読む方からすると大変ですよね。
0394デフォルトの名無しさん
2007/12/31(月) 21:34:100395デフォルトの名無しさん
2007/12/31(月) 22:03:280396デフォルトの名無しさん
2007/12/31(月) 23:38:550397デフォルトの名無しさん
2008/01/01(火) 00:16:55今年は Haskeller になれるように頑張りまふ(`・ω・´)!!
0398デフォルトの名無しさん
2008/01/01(火) 10:27:49今年こそはHaskellマスターになる
0399デフォルトの名無しさん
2008/01/01(火) 11:08:26少し愉快になれた(゚∀゚)
0400デフォルトの名無しさん
2008/01/01(火) 17:35:39>>52
の説明に感動した。
0401デフォルトの名無しさん
2008/01/01(火) 18:08:19ポイントって確か関数合成演算子じゃなくて「値」のことだったかと
まあそれを踏まえて言ってるのかもしれないけど
0402デフォルトの名無しさん
2008/01/09(水) 00:26:20みんなエディタは何使ってる?
Emacs が多いのかな。
0403デフォルトの名無しさん
2008/01/09(水) 00:50:16eclipseは使いづらいし、xyzzyのhaskell-modeはバグだらけだしwindowsでしか動かないし。
0404デフォルトの名無しさん
2008/01/09(水) 00:52:19モナドなんてHaskellではただのデータ型なんだから、別に難しいことなんかないよ。
0405デフォルトの名無しさん
2008/01/09(水) 09:01:44vim にもあるでしょ?俺は vim 使ってるよ
0406デフォルトの名無しさん
2008/01/09(水) 11:04:47設定ファイルをちょこっと編集するぐらいなら使うが、深い使い方は覚えてない。
0407デフォルトの名無しさん
2008/01/09(水) 15:34:50ここに由来が書いてあります。
http://www.haskell.org/haskellwiki/Pointfree
0408デフォルトの名無しさん
2008/01/09(水) 17:39:13haskellの組み込み言語atomを詳しくおしえて
0409デフォルトの名無しさん
2008/01/11(金) 18:22:16今、SICPを少しずつ読んでるのですが、set!のようなものをHaskellがモナド化するのは
単に純粋であることに拘るからでしょうか。IORefみたいなものがset!に当たるかと思います
が、副作用アリだぞ、ということを意識させる以上のメリットとかがよく分かりません。
0410デフォルトの名無しさん
2008/01/11(金) 20:10:23プログラマに直接メリットはない。
メリットは最適化コンパイラを作るのが楽になること。
0411デフォルトの名無しさん
2008/01/12(土) 04:05:03研究テーマはプログラミング言語の中でも、
意味論やプログラム解析などが多く、
そういう研究では参照の透明性が非常に有益な性質です。
たとえば、Javaで盛んに研究されているエスケープ解析も、
初期の成果では、関数型言語で行われたものが多いです。
また参照の透明性を保つことは、実務プログラマにとっても大変有益で、
プログラムの簡明さを保つことにつながります。
良く理解すれば、他の言語でも使える一つの方法論を得たことになります。
0412デフォルトの名無しさん
2008/01/12(土) 04:32:280413デフォルトの名無しさん
2008/01/12(土) 04:33:240414デフォルトの名無しさん
2008/01/12(土) 08:18:04現状どうなってるか全く知らないけど
0415デフォルトの名無しさん
2008/01/12(土) 09:06:52そんな小難しい話しなくても、評価順の決まっていない言語で副作用を使うのが
どれだけ厄介か考えれば済むことじゃないか?
0416デフォルトの名無しさん
2008/01/12(土) 09:42:37確かに純粋であることに拘っているからという点は大きい。
しかし、それだけではなく、例えば、
Haskellではリストを使ったプログラムを書いている途中でそれを非決定性計算と
みなしてプログラムの一部を書くとか、IOに限らずモナドを気軽に使う人もいる。
そのためモナド一般を扱う便利関数(mapMとかモナド変換子とか)が多く用意されている。
IOがモナドになっているとそういった便利関数が使えるので便利。
また、モナドになっていると読みやすさのためにコードをまとめたり
移動させたりといった操作が気軽にできる。
例えば副作用のある言語で
f x = x + y + (副作用のある式)
where
y = (副作用のある式)
とかやるとどの順番で副作用が現れるかとか、yはどのタイミングで
何回評価されるのかわからない。
Haskellであればそのような問題はないので気軽にwhereにコードを
まとめたりできる。
0417409
2008/01/12(土) 11:02:27>>415
そうなんですが、モナドはdo記法が可能で、これは実質手続き型の
記述ですよね。手続き型の記述が関数型言語内で可能だから、IOが
モナドになっていると思うのです。
>>416
モナド自体は演算のリレーということで分かるんですが、副作用の発生
する式をそうする理由は、上に書いたように、単に順番が保証されるのが
モナドである、という以上の理由は無い気がします。
どちらかというと、>>410さんの書いていることがメインなのでしょうかね。
0418デフォルトの名無しさん
2008/01/12(土) 12:10:33CやSchemeよりコンパイラの最適化がより進むって事はないんで、
そこのところは誤解しないように。
参照の透明性から、プログラム変換しやすくなるので、
コンパイラの研究がやりやすいってだけ。
0419デフォルトの名無しさん
2008/01/12(土) 12:10:54>単に順番が保証されるのがモナドである
違う。遅延処理ではg . f(x)でf → gと簡約されるかどうかがわからないのと同じように
¥x -> mf >>= mg でmf → mgと簡約されるかどうかはわからない。
モナド自体には「計算のリレー」の意味はあるけど「順番に実行する」意味はない。
IOモナドみたいな奴は、計算のリレーが示すその一連のIOアクションがmainに渡されたときに
(遅延しないHaskell処理系が)順番に実行することで「順次実行」を実現している。
IOがモナドになっているのは「計算がリレーの形になっている」ことを保障させるためだけ。
UnsafeInterleaveIOはIOモナドから出してすぐ入れるだけの処理だけどIOアクションが遅延するようになる。
これは計算のリレーを途中で切断したからその部分だけ順次実行できなくなったんだね。
これを使ってる関数にはgetContentsやinterleaveとかがある。
0420デフォルトの名無しさん
2008/01/12(土) 14:57:58HaskellのIOの実装に関する論文なんだが、
タイトルを忘れてしまった。
それらしい論文のタイトルを挙げてくれませんか?
0421デフォルトの名無しさん
2008/01/12(土) 15:08:02Tackling the awkward squad:
monadic input/output, concurrency, exceptions, and foreign-language calls in Haskell
http://research.microsoft.com/%7Esimonpj/Papers/marktoberdorf/mark.pdf
0422デフォルトの名無しさん
2008/01/12(土) 17:23:16これだこれだ
ありがとう
0423421
2008/01/12(土) 18:09:21ご褒美に最近読んで面白かったHaskell論文のタイトルくれ
0424デフォルトの名無しさん
2008/01/14(月) 02:35:49これに書かれてる、
> Ericssonによる 電話のソフトウェアを用いた一連の実験によれば、9から25倍の向上が 見られました
の部分の根拠となる論文って何?
0425デフォルトの名無しさん
2008/01/14(月) 12:27:39標準でありますか?
exTuple (x,y) = (y,x)
みたいな感じの。無いならいいんですが・・・。
0426デフォルトの名無しさん
2008/01/14(月) 13:26:010427デフォルトの名無しさん
2008/01/14(月) 13:39:28flip (,) までは考えてたんですが
ありがとうございます。
0428デフォルトの名無しさん
2008/01/14(月) 15:15:28foldl を用いて書け,という問題を連休中ずっと考えてるんですが,
脳味噌が手続き型で凝り固まっていてさっぱりわかりません.
どうやって書くのか教えて頂けませんか.
0429デフォルトの名無しさん
2008/01/14(月) 15:19:020430デフォルトの名無しさん
2008/01/14(月) 15:26:32import List
-- n進数表示から整数へ
fromBaseN :: Integer -> [Integer] -> Integer
fromBaseN n ds = foldl f 0 ds
where
f acc d = n * acc + d
-- 整数からn進数表示へ
toBaseN :: Integer -> Integer -> [Integer]
toBaseN n 0 = [0]
toBaseN n x = reverse $ unfoldr f x
where
f 0 = Nothing
f x = Just (mod x n, div x n)
-- 十進数から二進数へ
decToBin :: [Integer] -> [Integer]
decToBin = toBaseN 2 . fromBaseN 10
0431デフォルトの名無しさん
2008/01/14(月) 15:30:33教科書的なら一発でできる方法があるはずだ
0432デフォルトの名無しさん
2008/01/14(月) 20:10:49mjd?
0433デフォルトの名無しさん
2008/01/14(月) 20:36:34当方Windowsなんですが、
久しぶりにHaskellやろうと思って6.8.2をインストールしたんだけどSystem.Console.Readlineがない・・
一年くらい前につくったインタプリタがビルドできないっす;;
にわかなのでライブラリインストールもままならないのですが、cabal-installってWindowsでも使えますでしょうか?
0434デフォルトの名無しさん
2008/01/14(月) 21:05:11その逆は思いつかんなあ
0435デフォルトの名無しさん
2008/01/14(月) 22:12:17http://natume.sourceforge.jp/
0436デフォルトの名無しさん
2008/01/15(火) 00:17:040437デフォルトの名無しさん
2008/01/15(火) 00:29:35Haskellプログラム書くならHaskell98に準拠しないと互換性なくなるぜ?
0438デフォルトの名無しさん
2008/01/15(火) 00:30:280439デフォルトの名無しさん
2008/01/15(火) 03:18:49428 では無いんだが
Just (mod x n, div x n)
ここって modDiv 使った方が速いのか?
そうすると >>425 みたいなのを使うべき?
0440デフォルトの名無しさん
2008/01/15(火) 03:19:50だった。ごめん。
0441デフォルトの名無しさん
2008/01/16(水) 00:40:44divMod 使う方が速いんじゃないかな。
かといって>>425は読みにくいから
Just (r,q) where (q,r) = divMod x n
でいいんじゃない。
0442デフォルトの名無しさん
2008/01/16(水) 06:56:190443デフォルトの名無しさん
2008/01/16(水) 11:52:42modとdivの計算コストは小さいから、
タプルを消費しないように書いた方がいい。
0444430
2008/01/16(水) 13:48:57とりあえず実測してみた。ghc-6.8.2 -O2、入力はrandomRIO (0, 2^16)で
19.6 19.2 toBaseN
14.2 14.6 toBaseN_where
12.6 13.1 toBaseN_loop
8.6 10.8 toBaseN_case
7.9 7.0 toBaseN_loop_case
左から、%time、%alloc、関数名。_whereは>>441のやりかた。_caseはwhere節の代わりにcase式を使ったもの
_loopはreverse+unfoldrの代わりに手でループ(末尾再帰)を書いたもの
総実行時間の約1/4がGCだった
数が小さくてもdivとmodのコストが大きいな
0445デフォルトの名無しさん
2008/01/16(水) 17:30:40末尾再帰ってことは $! を使ってるってこと?
良ければソースを見せて貰えませんか。
0446デフォルトの名無しさん
2008/01/16(水) 19:00:45なぜか$!に慣れないのでseqを使ってるけど
toBaseN_loop_case :: Integer -> Integer -> [Integer]
toBaseN_loop_case n 0 = [0]
toBaseN_loop_case n x = f x []
where
f 0 ds = ds
f x ds = case divMod x n of
(r, q) -> f r (q:ds)
toBaseN_loop :: Integer -> Integer -> [Integer]
toBaseN_loop n 0 = [0]
toBaseN_loop n x = f x []
where
f 0 ds = ds
f x ds = let q = div x n; r = div x n in
q `seq` r `seq` f r (q:ds)
0447デフォルトの名無しさん
2008/01/16(水) 19:22:34そういうわけで>>444の結果は間違ってる
0448デフォルトの名無しさん
2008/01/17(木) 19:16:160449デフォルトの名無しさん
2008/01/17(木) 19:17:040450デフォルトの名無しさん
2008/01/17(木) 21:31:07人間が不快に感じるかどうかなんて些細な問題だよな
0451デフォルトの名無しさん
2008/01/17(木) 22:19:480452デフォルトの名無しさん
2008/01/18(金) 00:05:36512ビットの素因数分解だって有限時間でできますよ。
0453デフォルトの名無しさん
2008/01/19(土) 03:21:02お前の人生も有限時間で終わるぜ
0454デフォルトの名無しさん
2008/01/19(土) 10:02:310455デフォルトの名無しさん
2008/01/19(土) 18:40:07State モナドの使い方を
教えて貰えませんか?
0456デフォルトの名無しさん
2008/01/19(土) 18:58:230457デフォルトの名無しさん
2008/01/19(土) 19:20:13例が腐るほどWEB上にあるだろ
検索してみろよ
0458デフォルトの名無しさん
2008/01/19(土) 19:22:470459デフォルトの名無しさん
2008/01/19(土) 19:34:18入門書に載ってた例だけど、
・文字列を要素とする二分木が与えられたとき、その要素を整数に置換した木を得たい。
ただし同じ文字列は同じ整数に対応させること。例えば、
0460459
2008/01/19(土) 19:40:19例えば、
(("hoge") "hage" (("fuga") "hage" ("fuga")))
という木なら
((0) 1 ((2) 1 (2)))
にする。
手続き型言語なら、実行した置換を記録しながら木を左から走査していけば良いわけだが、
Stateモナドを使えばHaskellでも同様に書ける。逆にStateモナドを使わずに写像を引き回すのは面倒。
0461デフォルトの名無しさん
2008/01/19(土) 21:49:50普通の言語ではグローバル変数とかインスタンス変数に書き込んだりするけど、
そんなどこで変更されるかわからないようなアブナイことしなくても
(a,s) -> (b,s)の形で持ちまわればいいよね、ってのがStateモナドなんだから、
普通は変数を使う処理を考えればおのずから例はでてくるんじゃないか?
0462デフォルトの名無しさん
2008/01/20(日) 08:17:57「普通は変数を使う処理」の大部分はHaskellでStateモナドを使わずに綺麗に書ける。
だから混乱するんだと思うが。
0463デフォルトの名無しさん
2008/01/20(日) 19:37:59禿言うなヽ(`Д´)ノ
0464デフォルトの名無しさん
2008/01/20(日) 20:55:16hageにも人権をヽ(`Д´)ノ
0465デフォルトの名無しさん
2008/01/22(火) 10:36:580466デフォルトの名無しさん
2008/01/23(水) 15:17:31いったいどういうデータ構造にするのが一番効率がいいのかね
2次元リストとか、Mapとか、いろいろあると思うが・・・
0467デフォルトの名無しさん
2008/01/23(水) 15:44:00よく使われるのは1次元配列とbit board
0468デフォルトの名無しさん
2008/01/24(木) 12:50:260469デフォルトの名無しさん
2008/01/24(木) 19:11:50ソース見てみたけど何か難しそうだ
0470デフォルトの名無しさん
2008/01/24(木) 23:03:190471デフォルトの名無しさん
2008/01/29(火) 13:51:050472デフォルトの名無しさん
2008/01/29(火) 13:58:35実際に使ったことはないけど
つttp://hackage.haskell.org/packages/archive/pkg-list.html#cat:Interfaces
0473デフォルトの名無しさん
2008/01/29(火) 14:11:30おお!ありがとうございます。
試してみます
0474デフォルトの名無しさん
2008/01/30(水) 15:37:30C言語で
int hoge(void) {
int x,i;
for(x=0, i=0; i<100000; i++) {
x=x+i;
}
return x;
}
をHaskellで書く場合は再帰で書くほうが良いのか、foldlで書くほうが良いのか分かりません。
他にも書き方があるかもしれませんが、一番メジャーなループの書き方を教えてください。
0475デフォルトの名無しさん
2008/01/30(水) 16:03:590476デフォルトの名無しさん
2008/01/30(水) 16:09:440477デフォルトの名無しさん
2008/01/30(水) 16:16:33俺は、再帰でない書き方をすぐに思い付かなかったときだけ再帰を使ってる
その例なら迷わずsum [0..100000]だな
0478474
2008/01/30(水) 16:19:09ありがとうございます。
その場合、リストはどのように処理されるのでしょう?
つまり、1000番目の要素を足しているときに、999番以下の要素はもはや必要ないわけですけれど、
sum関数が終了するまでメモリに記憶されているのでしょうか?
0479デフォルトの名無しさん
2008/01/30(水) 16:29:10どこからも参照されていないから、いつでもGCされうる状態
実際にメモリ上に残っているかどうかはGCのタイミング次第
0480474
2008/01/30(水) 16:34:17ありがとうございます。
では逆に1000番目の要素を足しているときに、1001番目の要素はすでに生成されているのでしょうか?
足す直前に生成されるのでしょうか?
0481デフォルトの名無しさん
2008/01/30(水) 16:50:17> 1001番目の要素
とはどういうものを意識してる?具体的にkwsk
0482デフォルトの名無しさん
2008/01/30(水) 16:52:05処理系と最適化オプションに依る
素朴な遅延評価だと前者
sum [0..100000]
==> foldl (+) 0 [0..100000]
==> foldl (+) 0 (0:[0+1..100000])
==> foldl (+) (0+0) [0+1..100000]
==> foldl (+) (0+0) (1:[1+1..100000])
==> foldl (+) (0+0+1) [1+1..100000]
…
==> foldl (+) (0+0+1+2+...+100000) []
==> 0+0+1+2+...+100000
…
だけど、例えばghc-6.8.2で-O2だと、Integer用に特殊化されたsumの実装が使われて、
foldlの蓄積引数が積極評価されるので後者になる
0483482
2008/01/30(水) 17:08:24どっちの評価順でも、リスト生成は遅延される
ただし、素朴に遅延評価をやると足し算まで遅延するので、結果としてリストを走査し終わるまで足し算を開始できない
GHCの最適化は足し算を遅延させないようにするもの
0485デフォルトの名無しさん
2008/01/30(水) 17:56:59http://www.lambda-bound.com/book/lambdacalc/node21.html
0486デフォルトの名無しさん
2008/01/30(水) 18:22:54http://sourceforge.net/project/showfiles.php?group_id=168626
で6.8.1用のwxHaskellをダウンロードしてインストールし、
Windows XPでwxHaskellのサンプル(Minimal.hs)を
ghc --make Minimal.hs
としてコンパイルしてみたのですが、
出来上がったMinimal.exeをエクスプローラからダブルクリックで実行すると
目的のウインドウとコマンドプロンプトのウインドウの両方が表示されてしまいます。
コマンドプロンプトのウインドウはとても邪魔なのですが、
これが表示しないようにするにはどうすればよいのでしょうか?
さらに、実行ファイルを配布する際にDLLを付属するのは格好が悪いので、
DLLを使わないコンパイル方法はないものでしょうか?
0487486
2008/01/30(水) 18:29:59コンパイルオプションに-optl-mwindowsをつければよいのですね。
早とちりしてすみません。
後者の方はまだ解決していません。
0488486
2008/01/30(水) 19:01:48http://e.tir.jp/wiliki?hdn
> よく読んだら、「余分なデータの削除なるオプションで500KB弱になった」と書いてある。それらしいオプションは……
>
> --overlay=strip strip any extra data attached to the file [DANGEROUS]
>
> なんか、「DANGEROUS」って書いてあるんだが。
とありますが、ghc6.8.1ではそのオプションは削除されています。
http://e.tir.jp/wiliki?hdn
> stripと言えば、binutils付属のstripコマンドもあった。
> ...
> strip -s hsddd01.exe
> 2.3Mが1.1Mになった。バイナリの半分以上がシンボルでできていたのか……。
この方法はマニュアルの
http://www.haskell.org/ghc/docs/latest/html/users_guide/smaller.html
に言及されていました。
-funfolding-use-threshold0
というオプションをMinimal.hsのコンパイル時につけると逆に若干ファイルサイズが増えました。
0489デフォルトの名無しさん
2008/01/31(木) 12:20:45-profフラグ付でコンパイルしようとすると
Perhaps you haven't installed the profiling libraries for package bytestring-0.9.0.4?
と出て失敗してしまいます。(profフラグをつけなければ成功します)
対処方ご存知の方いらっしゃいますか?
つか、ByteStringに変更してさらに遅くなった俺涙目
0490デフォルトの名無しさん
2008/01/31(木) 17:57:26その--overlay=stripはupxのオプションだろ
>>489
そのbytestringパッケージはどうやってインストールした?
cabalなら、configureのときに-pオプションを付けないとプロファイル版ライブラリがインストールされない
0491デフォルトの名無しさん
2008/02/01(金) 02:37:31windows上でファイルのアンロックを明示的に行うにはどうすればよいのでしょうか?
ロックがかかったままのファイルに書き込みする必要があるのです。
0493デフォルトの名無しさん
2008/02/03(日) 17:41:55main = putStrLn "こんにちは、世界!"
% ghc hello.hs -o hello
% ./hello
...... ←[ここは文字化け]
UTF-8でソースを書いて、コンパイル&実行したのですが、
文字化けします。
ver6.6.1(Ubuntu7.10のバイナリパッケージを使用)なのですが、
UTF-8は使えないのでしょうか?
コンパイルオプションが必要ですか?
0494デフォルトの名無しさん
2008/02/03(日) 18:05:27>>5-6参照
0496デフォルトの名無しさん
2008/02/03(日) 21:46:49ふつケルの終わりのほうに超簡易Parsec実装の解説がある。
0497デフォルトの名無しさん
2008/02/05(火) 12:00:00たとえば
do { a <- return 1; Just 2 }
は
return 1 >>= (\a -> Just2)
なのはぎりぎりわかったような感じですが
3つ以上
do { a <- return 1; Just 2; return a }
だとどうなるのでしょうか?
0498デフォルトの名無しさん
2008/02/05(火) 12:13:230499デフォルトの名無しさん
2008/02/05(火) 12:29:01最初の一つだけ変換する
return 1 >>= (\a -> do Just 2; return a)
残ったdoも同じ規則で変換すれば良い。最終的には、
return 1 >>= \a -> Just 2 >> return a
0501デフォルトの名無しさん
2008/02/06(水) 15:33:19do { a <- return 1
; Just 2
}
って書くとemacsで見た目きれいにレイアウトできる。
>>=を使った場合、
return 1 >>= \a ->
Just 2
って書くときれいにレイアウトできる。
単に見た目の話だけど^^;;
0502デフォルトの名無しさん
2008/02/08(金) 00:28:19リファレンス見てたらそれっぽいのが・・・。
0503デフォルトの名無しさん
2008/02/08(金) 00:31:47(1::Int32)
0504デフォルトの名無しさん
2008/02/08(金) 11:53:24キャスト自体は無いから、いちいち関数を使う
数値型の変換ならfromIntegralとかfloorとか
ポインタの変換ならcastPtr
ダウンキャストみたいに、実行時のデータから型情報を復元するのはData.Typeable.cast
>>503の構文は、型推論の補助として型を指定してるだけで、変換してるわけじゃない
0505デフォルトの名無しさん
2008/02/08(金) 16:20:260506デフォルトの名無しさん
2008/02/08(金) 20:12:040507デフォルトの名無しさん
2008/02/08(金) 20:26:50忘れてた
変換前と変換後の型の内部表現が同じであることを前提として、問答無用で型を変換するのが
unsafeCoerce :: a -> b
Data.Typeableのキャストはこれをラップして安全にしたもの
0508デフォルトの名無しさん
2008/02/09(土) 14:13:19Haskellプログラムの実例が載ってる本というと、Craftになりますか?
ちょっと高価な本なので、買おうか迷ってます。
0509デフォルトの名無しさん
2008/02/11(月) 15:35:27http://research.microsoft.com/~simonpj/papers/history-of-haskell/index.htm
4.4 Declaration style vs expression style
0510デフォルトの名無しさん
2008/02/15(金) 19:30:200511デフォルトの名無しさん
2008/02/15(金) 19:31:040512デフォルトの名無しさん
2008/02/15(金) 19:33:20クレイスリ
0513デフォルトの名無しさん
2008/02/15(金) 20:04:550514デフォルトの名無しさん
2008/02/15(金) 20:32:570515デフォルトの名無しさん
2008/02/15(金) 20:35:58ドイツ語の規則に従って読んでる点で
クライスリーの方が信憑性はある
0516デフォルトの名無しさん
2008/02/15(金) 20:39:36Linuxをライナックスと読むのはおかしいですか
0517デフォルトの名無しさん
2008/02/15(金) 20:43:060518デフォルトの名無しさん
2008/02/15(金) 20:44:150519デフォルトの名無しさん
2008/02/15(金) 20:45:10それはそれで正しいと申すか
0520デフォルトの名無しさん
2008/02/15(金) 20:46:270521デフォルトの名無しさん
2008/02/15(金) 20:47:54これは米語読みだから、
金日正を「きんにっせい」と読むようなもの。
特に問題ない。
0522デフォルトの名無しさん
2008/02/15(金) 20:48:090523デフォルトの名無しさん
2008/02/15(金) 21:34:530524デフォルトの名無しさん
2008/02/15(金) 21:43:550525デフォルトの名無しさん
2008/02/15(金) 21:44:190526デフォルトの名無しさん
2008/02/15(金) 22:15:000527デフォルトの名無しさん
2008/02/15(金) 22:28:35頭の悪いHaskell厨増殖しすぎwwwwwwww
0528デフォルトの名無しさん
2008/02/16(土) 08:55:10Haskellコミュニティを大事にする積もりがあるなら、間違ってると思うところを指摘してやれよw
0529デフォルトの名無しさん
2008/02/17(日) 21:01:38http://www.nicovideo.jp/watch/sm2336941
伊藤静「じゃあ、次もwww」
後藤邑子「斬ったほうがいい?www」
伊藤「次は斬る?www」
後藤「どうするww」
伊藤「ペンネーム『心が綺麗な天使』から頂きましったww(フンッwww) 私はこの日本に住むのにはピュアすぎます。どのようにしたら天使のような私がこの今の日本に馴染めるのでしょうか?」
後藤「.........ウザい」
二人「キャッハハハハハwwwww」
伊藤「ちょほんとさあ、大丈夫?www」
後藤「おい天使、おいおい自称天使ww」
伊藤「自分が天使だと思ってること自体がちょっと間違ってんじゃないの?っていうねwww」
後藤「うん。ね。ちょっと軽く(精神病院に)通院してみたほうがいいんじゃないの?www もしくは、今の日本に馴染めるようにちょっと汚れちゃえよwwww」
伊藤「それかもう日本出て行ったらいいんじゃないの?www」
後藤「天使が住める国にwwwwwww なんかエルフの国とかに行ったらいいんじゃないの?wwww」
伊藤「妄想の中とかに(プフッww)行っちゃえばいいんじゃないのwww」
後藤「コワイヨーwwwコワイヨーwwwww」
二人「クックックックwwww」
0530デフォルトの名無しさん
2008/02/18(月) 09:51:500531デフォルトの名無しさん
2008/02/18(月) 12:06:05ffiが実装された時点でピュアじゃねーよ。
これからはHaskellを純粋関数型言語なんて呼ぶのはやめようぜ。
0532デフォルトの名無しさん
2008/02/18(月) 12:16:090533デフォルトの名無しさん
2008/02/18(月) 12:28:40おっと、そんなこと言っちゃうのか?
純粋でない例が一つでもあれば、それは純粋じゃないんだよ。
0534デフォルトの名無しさん
2008/02/18(月) 12:39:56でも一々「ほぼ純粋な関数型言語」とか言うのか?
0535デフォルトの名無しさん
2008/02/18(月) 12:48:31純粋なんて言葉をつけるのはおこがましい。
0536デフォルトの名無しさん
2008/02/18(月) 12:52:230537デフォルトの名無しさん
2008/02/18(月) 12:57:120538デフォルトの名無しさん
2008/02/19(火) 08:11:48ttp://builder.japan.zdnet.com/news/story/0,3800079086,20367512,00.htm
0539デフォルトの名無しさん
2008/02/19(火) 11:08:19SchemeやMLは副作用無しじゃI/Oができないし。
0540デフォルトの名無しさん
2008/02/20(水) 12:44:17よく落ちる糞公式だな
0541デフォルトの名無しさん
2008/02/21(木) 21:11:23http://pc11.2ch.net/test/read.cgi/dtm/1194648279/216
0542デフォルトの名無しさん
2008/02/21(木) 21:29:530543デフォルトの名無しさん
2008/02/21(木) 22:42:17Cで作ったファイル並みに小さくするコンパイルオプションとかってないですかね?
0544543
2008/02/21(木) 22:43:03haskellで作った実行ファイルが巨大化する傾向がある、といいたかったのです。
0545543
2008/02/22(金) 20:08:040546デフォルトの名無しさん
2008/02/22(金) 21:22:260547デフォルトの名無しさん
2008/02/22(金) 21:29:57・GHCの最新版を使う
・最適化オプションを有効にする
・strip
くらいじゃないか?
あとUPXとかで圧縮するのが有効というのを読んだ
0549デフォルトの名無しさん
2008/02/23(土) 00:47:37そもそもなんで実効ファイルが巨大化するのか調べた上での質問なら答えは直ぐに見つかるんだけどな
0550デフォルトの名無しさん
2008/02/23(土) 00:49:21jhcとかyhcならば判らないですけども。
0551デフォルトの名無しさん
2008/02/23(土) 08:40:01Windowsの場合は、サードパーティが使える標準配布方式がないから、
静的リンクするか、インストーラー配布形式が必要になって、
それでこういう質問が増えるんだろうね。
お決まりの開発環境を使わないと、配布しづらい。
0552デフォルトの名無しさん
2008/02/23(土) 13:39:300553デフォルトの名無しさん
2008/02/23(土) 17:07:48ダイナミックリンクでごまかしてたりするけど
機能持たせた言語の実行ファイルサイズが膨らむのはトレードオフ
0554デフォルトの名無しさん
2008/02/24(日) 07:49:130555デフォルトの名無しさん
2008/02/24(日) 12:24:2610分くらい探したけど
0556554
2008/02/24(日) 19:38:46ことですかorz
そんな難しいものも少なそうなのでいいのかな
0557デフォルトの名無しさん
2008/02/24(日) 19:51:21現状では、ある程度関数型言語でのプログラミングの経験をつんだ人が
Haskellを触るという感じなので、
言語仕様を見たらわりとすぐに使えるという人向きの文書しか出回っていない。
そういう意味では初心者はとっつきにくいかもしれないね。
0558デフォルトの名無しさん
2008/02/24(日) 20:19:53なめやがって!!
マジ切れそうだ
0559デフォルトの名無しさん
2008/02/24(日) 20:47:32お騒がせしました
0560デフォルトの名無しさん
2008/02/24(日) 22:59:49wwwwwwwww
0561デフォルトの名無しさん
2008/02/25(月) 01:50:160562デフォルトの名無しさん
2008/02/25(月) 01:58:360563デフォルトの名無しさん
2008/02/25(月) 02:08:330564デフォルトの名無しさん
2008/02/25(月) 20:06:50知ってるか?高卒の生涯賃金って高卒の半分なんだぜwww_?
中卒なんてもってのほか
可哀想にお前ら
そんな俺はもう内定貰ってこのスレいますけどねw
0565デフォルトの名無しさん
2008/02/25(月) 20:18:49> 高卒の生涯賃金って高卒の半分なんだぜwww_?
> 高卒の生涯賃金って高卒の半分なんだぜwww_?
> 高卒の生涯賃金って高卒の半分なんだぜwww_?
> 高卒の生涯賃金って高卒の半分なんだぜwww_?
> 高卒の生涯賃金って高卒の半分なんだぜwww_?
> 高卒の生涯賃金って高卒の半分なんだぜwww_?
> 高卒の生涯賃金って高卒の半分なんだぜwww_?
> 高卒の生涯賃金って高卒の半分なんだぜwww_?
> 高卒の生涯賃金って高卒の半分なんだぜwww_?
> 高卒の生涯賃金って高卒の半分なんだぜwww_?
> 高卒の生涯賃金って高卒の半分なんだぜwww_?
> 高卒の生涯賃金って高卒の半分なんだぜwww_?
> 高卒の生涯賃金って高卒の半分なんだぜwww_?
> 高卒の生涯賃金って高卒の半分なんだぜwww_? > 高卒の生涯賃金って高卒の半分なんだぜwww_?
0566デフォルトの名無しさん
2008/02/25(月) 20:20:52再帰的ですねwwwwww
chingin x = chingin x / 2
こんな所でしょうか。
ちなみにスタックオーバーフローしましたが何か。
0567デフォルトの名無しさん
2008/02/25(月) 20:22:51http://society6.2ch.net/test/read.cgi/gline/1190374317/
0568デフォルトの名無しさん
2008/02/25(月) 20:26:570569デフォルトの名無しさん
2008/02/25(月) 20:43:02せっかくHaskellなんだから
chingin = chingin / 2
でいいよ
解は0とNaNと±Infと⊥だな
0570デフォルトの名無しさん
2008/02/25(月) 21:39:370571デフォルトの名無しさん
2008/02/26(火) 10:33:530572デフォルトの名無しさん
2008/02/26(火) 15:30:47> 0/0
NaN
> 0/0 == 0/0
False
> 1/0
Infinity
> 1/0 == 1/0
True
> 1/0 == 1/0/2
True
0573デフォルトの名無しさん
2008/02/26(火) 15:32:370574デフォルトの名無しさん
2008/02/26(火) 17:18:37undefined
と
undefined / 2
は、どっちも同じ結果になる
0575デフォルトの名無しさん
2008/02/28(木) 14:35:340576デフォルトの名無しさん
2008/02/28(木) 15:44:34このスレ的にはここ
ttp://planet.haskell.org/
0577デフォルトの名無しさん
2008/02/29(金) 21:06:53自分、関数型はハジメテでちょっと戸惑いがあったんですが、SICPを読んでみたら
何か分かってきました。
Haskellは今のところそういう文脈というか、経緯を知っている人たち向けってこと
なんでしょうかね。
0578デフォルトの名無しさん
2008/02/29(金) 21:12:23他の関数型は、SML入門をちょっとwebで読みあさった経験しかなかった
0579デフォルトの名無しさん
2008/02/29(金) 23:45:490580デフォルトの名無しさん
2008/02/29(金) 23:54:200581デフォルトの名無しさん
2008/03/01(土) 00:03:120582デフォルトの名無しさん
2008/03/01(土) 01:50:01C++のconcept(次の標準で入る)とHaskellのtype classは同じ。
自分は
雑多なLisp→Common Lisp→Miranda, CLOS, ML, C++→Haskell, Scheme, C++
0583デフォルトの名無しさん
2008/03/01(土) 02:00:01そうですね。
関数型言語での再利用とオブジェクト指向言語での再利用では
毛色が全く違うので戸惑うでしょうね。
0584デフォルトの名無しさん
2008/03/01(土) 02:03:51LispやMLの方がCプログラマには分かりやすいでしょう。
0585デフォルトの名無しさん
2008/03/01(土) 02:20:11Haskellはそういう知識を得ることが楽しい人向けの言語。
先に知っていても、必要だと思ってそこで勉強しても、どっちでもいいと思う。
まあとにかく世界の広がる言語だと思う、Haskellは。
Schemeも面白い。
0586デフォルトの名無しさん
2008/03/01(土) 02:25:30一応一通り検索して解説を読んでみたんですがいまいち概念を把握できてないです
使う分には困らないんですが
0587デフォルトの名無しさん
2008/03/01(土) 11:56:49圏論の基礎
0588デフォルトの名無しさん
2008/03/01(土) 12:12:57つ >>421
0589デフォルトの名無しさん
2008/03/01(土) 15:05:15順:うるさい死ね メールすんな殺すぞ
母:ごめんね。おかあさんはじめてめーるしたから、ごめんね
順:うるさいくたばれ、メールすんな
母:ちゃんとご飯食べてる? お金送りましょうか?
順:うんありがとう。かあさんこそ体とか大丈夫?
0590577
2008/03/01(土) 19:22:00自分はLisp系知らずにHaskellやろうとして、map、fold、zipWithなどのリスト操作が
最も基本的なものとして扱われているのがピンときませんでした。
色々文書読んだりした後で、SICPを読んでみたら凄い分かってきましたよw。どうも
そういう文脈にある人々向けにドキュメントなどが作成されているなぁと。JavaやC#
とかが、C、C++の文脈を知っている人向けのドキュメントが多いのと同じでしょうかね。
0591デフォルトの名無しさん
2008/03/02(日) 01:21:53コレクション周辺でサポートされてるよね?
ただgeneric function系じゃないと、
ちょっと趣きが違うから戸惑うのかも知れないが。
0592デフォルトの名無しさん
2008/03/02(日) 04:50:00まず、今までループで処理してたところを全部再帰で考え直してみようよ。
再帰処理の部分を一般化して関数にできないかどうか考えてみようよ。
0593デフォルトの名無しさん
2008/03/02(日) 04:50:390594577
2008/03/02(日) 08:02:16ありますけど、理科系研究の実習用プログラムとかではない限り、あまり
使われないんじゃないかと思います。実際、言語の入門書類でも大きくは
扱われませんよね。
>>592
再起はそんなに戸惑いはありませんでした。どちらかと言えばループが
手続きの部分として扱われるのに対して、関数型ではそういう書き方は
あまりしない(醜いコードとなる)ってことですね。
>>593
そうです。すごい良書だと思います。
0595デフォルトの名無しさん
2008/03/02(日) 10:43:26> 実際、言語の入門書類でも大きくは扱われませんよね。
入門書は年々数が増えていっていると共に、
糞本の割合が増えていっているから、
入門書一般の常識はいまや非常識といっていい状態。
本格的に取り組む入門書は嫌われるから。
関数型言語、特に本場の本は良書が多くてそういう心配はないんだけど。
0596デフォルトの名無しさん
2008/03/02(日) 10:51:29本屋の数は、日本に人間の指の数ぐらいしか無いんではなかろうか。
他は次々と出る駄本の新刊を並べてるだけ。
0597デフォルトの名無しさん
2008/03/02(日) 10:53:220598577
2008/03/02(日) 11:26:03自分はSICP読んで、何でもっと早くに手に取らなかったのか、と後悔してます。
>>597
Rubyのそういった機能は関数型由来のものですよね。C言語系列の手続き型
にはあまり登場しないんじゃないかと思います。
0599デフォルトの名無しさん
2008/03/02(日) 12:03:410600デフォルトの名無しさん
2008/03/03(月) 23:34:310601デフォルトの名無しさん
2008/03/06(木) 13:53:14ttp://ha6.seikyou.ne.jp/home/yamanose/haskell/home.html
web上の日本語の入門文書で、言語全体をカバーしてるのは初めてじゃないだろうか
0602デフォルトの名無しさん
2008/03/06(木) 18:12:31なぜに自転車屋のホームページ?w
ラジオ部 って何?w
モナドに関して、あえて説明しないってのは、入門としてはありかもね。
0603デフォルトの名無しさん
2008/03/06(木) 23:38:42普通のHaskellが妥当かな?
0604デフォルトの名無しさん
2008/03/07(金) 08:55:560605デフォルトの名無しさん
2008/03/07(金) 09:07:55つ http://www.cs.nott.ac.uk/Department/Staff/gmh/monparsing.ps
0606602
2008/03/07(金) 13:57:47手続き言語的にHaskellを解説してるように思えるな…。
こういう入門書でHaskellを学ぶ人が多くなると、
オブジェクト指向の時みたいに混乱しそう…。
初心者のオレでも?なコードがある…。
0607606
2008/03/07(金) 15:35:46>>601 でなくて、>>601 で参照してる↓だった
関数型プログラミング言語 Haskell 早巡り
http://ha6.seikyou.ne.jp/home/yamanose/haskell/INTROHUG.HTML
0608デフォルトの名無しさん
2008/03/11(火) 17:08:280609デフォルトの名無しさん
2008/03/11(火) 21:39:33自分、Craft読み終えたばかりでモナドも入り口しか知らない…
道は遠いなぁ
0610デフォルトの名無しさん
2008/03/15(土) 18:58:13フルに最適化の掛かったコードのプロファイルを取るにはどうすればいいんだ
0611デフォルトの名無しさん
2008/03/15(土) 19:14:50最適化ありとなしなら違うだろうけどそれぐらいなら大差つきそうな感じもしないし
だいたいでいいんじゃない?
0612デフォルトの名無しさん
2008/03/15(土) 19:55:01いや、一番内側のループにGHC.IOBase.>>の呼び出しやらunboxing/reboxingやらが残るんだ
もともと最適化で余計なものが全部消えることに期待しているソースなので、影響が大きい
実際、プロファイル版だと通常版の7倍くらい時間が掛かる
もちろんプロファイルのオーバーヘッドもあるだろうけど、別のソースだと3倍くらいで済むので、
最適化がうまく効かないことの要因が大きいと思う
0613デフォルトの名無しさん
2008/03/17(月) 13:44:150614デフォルトの名無しさん
2008/03/17(月) 16:47:240615デフォルトの名無しさん
2008/03/18(火) 09:56:500616デフォルトの名無しさん
2008/03/18(火) 21:37:58とやった時に生成される
test.hi
test.o
test.manifest
この3つのファイルを生成させなくする方法ってないですか?
0617デフォルトの名無しさん
2008/03/18(火) 21:52:22manifestファイルの生成は-fno-gen-manifestで抑止できる
ただし多少の副作用がある。詳しくはマニュアル参照
oとhiの生成を止めるのは多分無理。これなしじゃ分割コンパイルできないし
ファイルが残るのが嫌なら、ghcを実行した後にoとhiを削除するスクリプトでも組めばいい
0618デフォルトの名無しさん
2008/03/18(火) 22:10:49ありがとうございます
スクリプト書いて我慢することにします。
0619デフォルトの名無しさん
2008/03/19(水) 20:13:49¥ 11,554 (税込)
ペーパーバックでこれって…。何でこんな高いの?
0620デフォルトの名無しさん
2008/03/19(水) 21:11:09文章はもちろんコードが素晴らしいです。
0621デフォルトの名無しさん
2008/03/19(水) 21:19:32需要と供給の関係じゃない?
0622デフォルトの名無しさん
2008/03/19(水) 21:33:24Craftとかと比べるとあんまり売れ筋じゃないってこと?
0623デフォルトの名無しさん
2008/03/19(水) 21:47:52「関数プログラミング(using Miranda)」はもっと安いYO!i
0624デフォルトの名無しさん
2008/03/19(水) 22:32:200625デフォルトの名無しさん
2008/03/19(水) 22:54:32円高なんだから.comの書店から輸入すれば安いYO!
0626デフォルトの名無しさん
2008/03/20(木) 13:46:58どの辺が違うの?
0627デフォルトの名無しさん
2008/03/20(木) 13:48:34Mirandaスレ逝けYO!
0628619
2008/03/20(木) 13:57:36ついさっき届いたんだが・・・チョっw、Craftとかよりも紙が安っぽいwww
これ、11,554円か・・・。頑張って自分のモノにしないとなw
0629デフォルトの名無しさん
2008/03/22(土) 14:32:26これらは、全て「遅延評価」を評価戦略におくプログラミング言語であり、「純粋関数型言語」と呼ばれるグループです。
SASL系のMiranda???イミフ。
0630デフォルトの名無しさん
2008/03/22(土) 19:31:56これらは、全て「副作用による状態の更新」を実行の基礎とするプログラミング言語であり、「手続き型言語」と呼ばれるグループです。
Algol系のC???イミフ。
0631デフォルトの名無しさん
2008/03/22(土) 19:39:51http://sourceforge.net/project/showfiles.php?group_id=73133
0632デフォルトの名無しさん
2008/03/22(土) 23:22:00直訳で不精評価とか?
0633デフォルトの名無しさん
2008/03/22(土) 23:37:010634デフォルトの名無しさん
2008/03/22(土) 23:45:230635デフォルトの名無しさん
2008/03/23(日) 00:00:200636デフォルトの名無しさん
2008/03/23(日) 00:20:120637デフォルトの名無しさん
2008/03/23(日) 00:53:220638デフォルトの名無しさん
2008/03/23(日) 10:58:060639デフォルトの名無しさん
2008/03/23(日) 11:43:24\a b -> a*b + a/b
を書くにはどうすればいいですか?
一般に,同一の引数を複数回使うような関数はどう定義すればいいですか?
さらに例えば2引数a, bを取って,それらを複数回使い,
その場所が構文木の深さで並べたとき交互に入り混じるような関数はどう定義すればいいですか?
\a b -> a + exp(b + exp a)
みたいな.
* idとかを使って形式的に同じ深さにする(例えば snd(id b, id a) + exp(id b + exp a) とする)
* 2変数関数に同じ引数を与えるようなapplyをあらかじめ定義しておく
(そう言えばSコンビネータは S f g x => f x (g x) でxが2回出てくるなぁ...)
が鍵かなーと思ってますが,一般にはどうすればいいのか.
0640デフォルトの名無しさん
2008/03/23(日) 13:18:34ap :: (a -> b -> c) -> (a -> b) -> a -> c
liftM2 (.) :: (a -> b -> c) -> (a -> d -> b) -> a -> d -> c
どっちも便利
0641デフォルトの名無しさん
2008/03/23(日) 13:51:22k = \ x y -> x
i = \ x -> x
-- f = \ a b -> a * b + a / b
f = ((s ((s (k s)) ((s ((s (k s)) ((s (k k)) (k (+))))) ((s ((s (k s)) ((s ((s (k s)) ((s (k k)) (k (*))))) ((s (k k)) i)))) (k i))))) ((s ((s (k s)) ((s ((s (k s)) ((s (k k)) (k (/))))) ((s (k k)) i)))) (k i)))
0642デフォルトの名無しさん
2008/03/23(日) 14:37:060643デフォルトの名無しさん
2008/03/23(日) 14:43:080644デフォルトの名無しさん
2008/03/23(日) 14:46:420645デフォルトの名無しさん
2008/03/23(日) 14:59:03> SASL系のMirandaって何?
Turner大先生の作った言語がSASL→KRC→Miranda
http://en.wikipedia.org/wiki/Miranda_%28programming_language%29
Mirandaは売り物じゃなければもっと普及したと思う。
0646デフォルトの名無しさん
2008/03/23(日) 19:45:21全く違います。
Unitは値ですがvoidは値ではありません。
0647デフォルトの名無しさん
2008/03/23(日) 21:22:47勉強しなおしますい
0648デフォルトの名無しさん
2008/03/23(日) 21:26:41void 式を入れる変数が存在しない点が Unit とは大きく違う点か。
0649デフォルトの名無しさん
2008/03/23(日) 21:46:560650デフォルトの名無しさん
2008/03/23(日) 21:57:000651デフォルトの名無しさん
2008/03/23(日) 22:36:570652デフォルトの名無しさん
2008/03/23(日) 22:51:430653639
2008/03/24(月) 00:09:11Control.Monad.Instances って関係あるんですか?
つーか Control.Monad の ap や liftMn は (Monad m) => ... m a -> ... な感じでモナド専用なのでは?
>>641
トランスレータ乙w
Wikipediaに載ってる変換アルゴリズムには
> In general, the T[ ] construction may expand a lambda term of length n to a combinatorial term of length Θ(3n).
とありますが.
まぁSKIがあれば不可能な訳ではない,と...
R. Bird先生とかの論文で習うしかないのかなー
0654デフォルトの名無しさん
2008/03/24(月) 00:11:010655デフォルトの名無しさん
2008/03/24(月) 00:19:180656デフォルトの名無しさん
2008/03/24(月) 01:13:02\a b -> a*b + a/b
を入れたら
ap (ap . ((+) .) . (*)) (/)
が返ってきた
\a b -> a + f (b + g a)
だと、
ap ((.) . (+)) ((f .) . (+) . g)
0657初心者修業中
2008/03/24(月) 04:17:08「クイズとしては面白いけど無理に使う必要はない」
という事ですよね?
0658デフォルトの名無しさん
2008/03/24(月) 07:52:47使うに値すると思ったときだけ使えばいい
0659デフォルトの名無しさん
2008/03/25(火) 04:01:380660デフォルトの名無しさん
2008/03/25(火) 04:21:26それほど無茶を言ってないと思えるよ。
プログラム変換(人力)で成果挙げてるからね。
0661デフォルトの名無しさん
2008/03/26(水) 00:32:30http://codepad.org/
コードを書いて実行した時のURLを記録しておけば、
実行結果も一緒にさらす事が出来て幸せです。
0662デフォルトの名無しさん
2008/03/26(水) 04:41:110663デフォルトの名無しさん
2008/04/01(火) 12:06:11stringparamっていうプログラムって何でしょうか?これが無いせいでhtmlドキュメントが生成できません
xmlproc関係のものだと言う気はするんですが、検索しても見付かりません
入手方法など情報お願いします
0664デフォルトの名無しさん
2008/04/01(火) 12:20:150665デフォルトの名無しさん
2008/04/01(火) 21:14:03どうやら原因はMakeの中で上手くxsltproc関連の変数が設定されてないのが原因でした
0666デフォルトの名無しさん
2008/04/05(土) 01:33:37うまく動作しません。何がいけないのでしょうか?
import System.Timeout
main = do a <- timeout (3*10^6) getLine
print a
0667デフォルトの名無しさん
2008/04/05(土) 02:07:19俺の環境(Linux x86 ghc-6.8.2 base-3.0.1.0)だと動いたよ
windowsだとHandleからの入力でブロックするときにselectを使ってないから、そのせいかも
0668デフォルトの名無しさん
2008/04/05(土) 19:56:39書いた論文とかありますか?
PARSEC使いたいのですが
どうにも曖昧で
0669デフォルトの名無しさん
2008/04/05(土) 20:15:35I Love Ruby本
0670デフォルトの名無しさん
2008/04/05(土) 20:50:09つ "The marriage of effects and monads"
つ "Tackling the awkward squad: monadic input/output, concurrency, exceptions, and foreign-language calls in Haskell"
ググればPDF手に入る
0671デフォルトの名無しさん
2008/04/05(土) 20:56:19>>670
Tackling...はIOモナドについての論文じゃないか?
0672デフォルトの名無しさん
2008/04/05(土) 21:02:170673デフォルトの名無しさん
2008/04/05(土) 21:06:05群について知りたがってる奴に整数を教えるようなものだ
0674デフォルトの名無しさん
2008/04/05(土) 21:08:14あとkindとかって数学の眠い本永遠と
読まないと理解できないかな?
圏とかまじで数学本気でやってねーから解らん
0675デフォルトの名無しさん
2008/04/05(土) 21:18:11「Maybe Int」型の式は存在するけど単なる「Maybe」型の式は存在しないとか、
「Maybe Maybe」っていう型は不正だとか、そういう次元の話
0676デフォルトの名無しさん
2008/04/05(土) 21:21:18>>668は知りたくなるんじゃないかな?
知らなくてもPARSEC使えるけどね。
0677デフォルトの名無しさん
2008/04/05(土) 21:28:50背景とか基礎的な内容知りたく
ならない?
ならない、そうですかそうですか.....
0678デフォルトの名無しさん
2008/04/05(土) 21:41:01Programmingって毎年出てるの?
0679デフォルトの名無しさん
2008/04/06(日) 01:49:14"Monadic parser combinators"ってテクニカルレポートが
仕組みやモナドの解説が分かりやすく書いてあってよかった。
0680デフォルトの名無しさん
2008/04/06(日) 09:06:14勉強しているところです。
この板の書き込みもそうですし、実際に出版されている本の数や内容など見ると、まだ
Haskellのような言語は研究者レベルの言語なんでしょうか。
個人的には今後アプリがマルチプロセスに対応せざるを得ないとか、複雑性が上がる
中で処理の信頼度を一層高める必要がある中で、Haskellのような言語がある時期から
一気にパラダイムシフトを引き起こすのじゃないか、とか妄想していますが、単なる
妄想ですかねw
0681デフォルトの名無しさん
2008/04/06(日) 09:25:48その意味で、Haskellは既に研究レベルの言語ではない
一方で、今のHaskell利用者に占める研究者や学生の割合はそれなりに高いだろうし、
Haskellが研究の道具として使われてるのも事実だから、その意味で研究者の言語だ
0682デフォルトの名無しさん
2008/04/06(日) 09:59:31遅延評価のHaskellから、
> ある時期から一気にパラダイムシフトを引き起こすのじゃないか
ってのはちょっと難しいだろうね。
> 研究者レベルの言語
こういう考え方はよくわからない。
自分の腕を上げるために必要なことは学べばいいだけなんで。
0683デフォルトの名無しさん
2008/04/06(日) 10:01:57代入ができなくても別に困らない、というのも分かる
分からないのは遅延評価
原則的にはeagerにして必要なときだけ明示的に遅延するのでは駄目な例ってないすか
0684デフォルトの名無しさん
2008/04/06(日) 10:10:05> 遅延評価のHaskellから、
> > ある時期から一気にパラダイムシフトを引き起こすのじゃないか
> ってのはちょっと難しいだろうね。
これはどういう意味でしょうか?
0685デフォルトの名無しさん
2008/04/06(日) 10:12:07駄目ってことはないんじゃないか?
Haskellは、原則的には遅延で必要なときだけ明示的にeagerという立場だから、
Haskellコードを、デフォルトがeagerな言語に翻訳するのは機械的な書き換えで済む
どっちをデフォルトにするのが便利かは議論の分かれるところじゃないだろうか
0686デフォルトの名無しさん
2008/04/06(日) 10:16:32「つまらない」そこが駄目
0687680
2008/04/06(日) 10:24:01SICPなんかだと、参照透過性と遅延評価をStreamの項で関連付けて
いたりしますが、その辺へのこだわりではないんでしょうか?
0688デフォルトの名無しさん
2008/04/06(日) 10:33:23本があるはずだけど
あれみれば遅延評価背景わかるはず
本の名前が解らん
0689デフォルトの名無しさん
2008/04/06(日) 11:17:06http://research.microsoft.com/~simonpj/papers/slpj-book-1987/index.htm
これ?
lazy evaluationの正当化は194ページにちょっとあるだけかな
0690デフォルトの名無しさん
2008/04/06(日) 11:23:03おーそれそれ
あとどれだったかなぁ
0691デフォルトの名無しさん
2008/04/06(日) 19:27:55・Introduction to Functional Programming Using Haskell
http://www.amazon.co.jp/exec/obidos/ASIN/0134843460/
・Haskell: The Craft of Functional Programming
http://www.amazon.co.jp/exec/obidos/ASIN/0201342758/
0692デフォルトの名無しさん
2008/04/06(日) 20:25:11自分はCraftを先に読みました。Craftは所謂Haskell言語の入門書だと思います。
Introduction〜はHaskellの入門というよりも、関数型言語の原理原則を中心に
展開する書物ですね。自分は今読んでる途中です。
どちらもよい本だと思います。
0693デフォルトの名無しさん
2008/04/06(日) 20:25:18欧米だとどっちを先に読めって言われてるの?
0694デフォルトの名無しさん
2008/04/06(日) 20:28:170695デフォルトの名無しさん
2008/04/06(日) 20:46:40俺の恩師のイギリス人のじいちゃん先生
だと、今の若い人間には退屈すると
長続きがしないだろう。好奇心だけでは
どうしても無理だろう。といって、Craftを
読んで言語を理解しなさいと言われたなぁ
0696デフォルトの名無しさん
2008/04/08(火) 00:14:53俺以外に、5人しかいないだろ?
0697デフォルトの名無しさん
2008/04/08(火) 03:08:190698デフォルトの名無しさん
2008/04/08(火) 03:13:05「圏論について勉強するといいよ」って返されるんだもん
そしてwikipediaで圏論の説明見てわからず涙目になる俺
0699デフォルトの名無しさん
2008/04/08(火) 04:11:203000人じゃなかった?
0700デフォルトの名無しさん
2008/04/08(火) 06:33:590701デフォルトの名無しさん
2008/04/08(火) 10:04:01そのうち何人が実際にソフトウェアを記述するかといったら100人未満だと思うよ
0702デフォルトの名無しさん
2008/04/09(水) 00:19:34Haskellで書くと面白いんだけど
Arrowが良くわからん
あれが必要ななんでどうまくつかいこなせない
0703デフォルトの名無しさん
2008/04/09(水) 06:49:340704デフォルトの名無しさん
2008/04/09(水) 08:26:47「よくわからないArrowが必要なせいで、うまく使いこなせない。」
0705デフォルトの名無しさん
2008/04/09(水) 18:22:440706デフォルトの名無しさん
2008/04/09(水) 18:38:510707デフォルトの名無しさん
2008/04/09(水) 18:42:170708デフォルトの名無しさん
2008/04/09(水) 18:48:550709デフォルトの名無しさん
2008/04/09(水) 20:42:39ギブ・ミー・モナド
0710デフォルトの名無しさん
2008/04/10(木) 11:30:08Arrowが必要なのは、Arrowベースのテストツールかなにかを
使ってるからなんだろうけど、なに使ってるの?
0711デフォルトの名無しさん
2008/04/10(木) 21:50:55作ってるのw
0712デフォルトの名無しさん
2008/04/11(金) 11:39:160713デフォルトの名無しさん
2008/04/11(金) 11:56:430714デフォルトの名無しさん
2008/04/11(金) 23:23:30ほかの言語にモナドの考え方を応用したようなライブラリが、もっとあってもいいと
思うんだけどな。副作用嫌いな人は喜ぶと思うんだけど。そうでもないのかね。
0715デフォルトの名無しさん
2008/04/11(金) 23:36:10すんごいマイナーだけど
0716デフォルトの名無しさん
2008/04/12(土) 01:17:350717デフォルトの名無しさん
2008/04/12(土) 01:19:07http://www.valuedlessons.com/2008/01/monads-in-python-with-nice-syntax.html
0718デフォルトの名無しさん
2008/04/12(土) 02:47:54つ http://okmij.org/ftp/Computation/monadic-shell.html
0719デフォルトの名無しさん
2008/04/12(土) 21:48:14http://slashdot.jp/developers/article.pl?sid=08/04/06/2313251
---
Java(16479件)、C++(8080件)、C#(7780件)、JavaScript(6749件)、
Perl(5710件)、PHP(2641件)、Python(1408件)、COBOL(1207件)、
Ruby(769件)、Lisp(33件)といった感じらしい。
とりあえずJavaとC/C++/C#、あとJavaScriptを覚えれば、
当分仕事には困らないようである。COBOLのしぶとさも目立つ。
ちなみにHaskellやOCamlの求人は10以下だったそうだ。
---
0720デフォルトの名無しさん
2008/04/12(土) 23:28:5110年後には残ってない気もするが。
0721デフォルトの名無しさん
2008/04/13(日) 00:54:40どんな仕事だ?
0722デフォルトの名無しさん
2008/04/13(日) 02:47:10単に列記されてるのカウントしてるだけじゃねーの?
0723デフォルトの名無しさん
2008/04/13(日) 03:03:37研究用じゃないよな
0724デフォルトの名無しさん
2008/04/13(日) 03:05:42誰でも簡単にできる楽しい作業です。
初心者歓迎。
0725デフォルトの名無しさん
2008/04/13(日) 08:25:340726デフォルトの名無しさん
2008/04/13(日) 08:30:480727デフォルトの名無しさん
2008/04/13(日) 09:21:12True
0728デフォルトの名無しさん
2008/04/13(日) 10:27:420729デフォルトの名無しさん
2008/04/13(日) 11:00:54フルタイムやパートタイムの非常勤プログラマーを雇うことがあるから、
Haskellはその類いかも知れない。
0730デフォルトの名無しさん
2008/04/13(日) 11:10:29www.janestcapital.com
0731デフォルトの名無しさん
2008/04/13(日) 13:02:12いいと思うけどな。手続き型で出やすい不具合をどう防ぐか、
無駄の無い記述をどう実現するか、とか勉強になること多いと思うよ。
0732デフォルトの名無しさん
2008/04/13(日) 13:08:30具体的にどういうこと?
0733デフォルトの名無しさん
2008/04/13(日) 13:11:08コーディングする気力が萎えて来るとか…
0734デフォルトの名無しさん
2008/04/13(日) 13:18:35どこの国かは言えんが
topでGHCかりかり動いているみたことある
0735デフォルトの名無しさん
2008/04/13(日) 13:25:200736デフォルトの名無しさん
2008/04/13(日) 13:30:55Intelのスレッドライブラリもラムダ標準実装
C#も次期バージョンのサポート予定
Javaはかすだけどサポートするらしい(いらねw
0737デフォルトの名無しさん
2008/04/13(日) 13:56:04C++ 自体がイラネ
0738デフォルトの名無しさん
2008/04/13(日) 14:04:04いや、単純に(再)代入が許されない世界で、再起を使うとか、リストデータを
編集してそこから必要な情報抜くとか。そういうの訓練すると影響あるんじゃない
かなぁ。
手続き型だと「要するにこれはどういう処理か」って考えずにずらずらと手続きを
書き連ねていって、目的のデータを何とか作ってしまう、とかなりがちだけど、
その辺が意識変わると思うんだけどね。
0739デフォルトの名無しさん
2008/04/13(日) 14:12:31通常の手続き型に慣れると
そうぞうすらしない奴も多いから
F言語はシンプルな世界観を持つ
ためにはある程度知る必要があると
おもふ
別に変態的に知る必要はまったくないけど
それよりCraf本読むのに6時間かけてまだ
6章しか読めん俺はおわっとる
0740デフォルトの名無しさん
2008/04/13(日) 17:52:54VBで既に導入されてなかった? >λ式
0741デフォルトの名無しさん
2008/04/13(日) 17:53:270742デフォルトの名無しさん
2008/04/13(日) 20:29:34するがどうなんだろうか。だったらF#とかでいいじゃないか?って気がするけどな。
実はF#への移行の布石だったりして。
0743デフォルトの名無しさん
2008/04/13(日) 20:58:22どっちにしろ、まともな高水準言語なら無名関数の類はあって当然で、統一感とか気にしてる場合じゃない
次は代数的データ型とパターンマッチに相当するものが入るといいな
0744デフォルトの名無しさん
2008/04/13(日) 23:12:29私が言葉尻に拘ってるのかも知れないが、なぜ?
0745デフォルトの名無しさん
2008/04/13(日) 23:22:47上であがってる古い関数言語の実装の
論文読んでみなよ何が要素として定義
されていて必要なのかわかるから
0746デフォルトの名無しさん
2008/04/13(日) 23:27:35でもC++とかには(少なくとも現在の規格では)無いわけだし、
実際無名関数みたいな仕組みは無くてもプログラムを組むことはできるし、
それらの事実を踏まえた上で>>744は>>743が「あって当然で」と言っているその考えを聞きたいんだと思うんだが。
あった方がプログラミングが綺麗になる部分もあるのは当然の話だが。
0747デフォルトの名無しさん
2008/04/13(日) 23:29:40モダンな言語は取り入れる傾向にあるとでも読み換えたら。
0748デフォルトの名無しさん
2008/04/13(日) 23:47:26OOが無くても手続きはできるし
アジャイルがなくてもそれ相当のことはいくらでもできる。
Cで、どんな手段でもOKならfor_each構文を作ることもできる
結局、ラテン語やその他の自然言語がどんどん変革していったように
プログラミング言語も変わっていくだけだと思うよ
ただそこには、今まで苦労した結果を簡単に置き換えることで
本当の問題にどれだけ注視して取り組めるようすることを
追求しているだけだと思うよ。リスクの低減と開発効率の上昇
自然言語に対する機械言語の仕様変更とイディオムの変更は
とてつもなく早いのでそれに対する拒否反応や疑問は常時出てしまうけど
それは仕方のないことだろうし。まぁ慣れてくれ
0749デフォルトの名無しさん
2008/04/14(月) 00:34:46> でもC++とかには(少なくとも現在の規格では)無いわけだし、
今もあるぞ、制限が多いだけで。
C++0xで言語自身に組み込みになってより強力になる。
0750デフォルトの名無しさん
2008/04/14(月) 01:01:340751デフォルトの名無しさん
2008/04/14(月) 02:45:24くだらないが重要な利点があります
0752デフォルトの名無しさん
2008/04/14(月) 08:38:210753デフォルトの名無しさん
2008/04/14(月) 08:52:250754デフォルトの名無しさん
2008/04/14(月) 17:18:28いくつかはGHCにも実装されてるし
0755デフォルトの名無しさん
2008/04/14(月) 20:34:05自然数なんかもλ式で表現する、つまり「全ては関数なり」という一貫
した思想に基づいて設計されてるわけでしょ?
C#やJavaなどのオブジェクト思考言語って、値が全てなんだよね。
値を操作するために関数がある。そこにクロージャとかって、何か
意味があるのかね。
0756デフォルトの名無しさん
2008/04/14(月) 20:41:20オブジェクト指向言語で関数オブジェクトを扱えるのは別に
おかしな事じゃない。関数型言語でオブジェクト指向する事も
出来るし。
0757デフォルトの名無しさん
2008/04/14(月) 20:47:01>自然数なんかもλ式で表現する、つまり「全ては関数なり」という一貫
>した思想に基づいて設計されてるわけでしょ?
これがそもそも勘違い
例えばHaskellのIntは関数じゃない
C#やらJavaScriptやらにクロージャがあって役に立つのは事実
例を知りたければ適当に検索すればいくらでも見つかると思う
0758デフォルトの名無しさん
2008/04/14(月) 21:04:05それはそれで使いでがある。
SICPをやってみればわかるけども。
0759デフォルトの名無しさん
2008/04/14(月) 21:24:38それってUtility的なものでしょ?
どうも変な感じするけどなぁ。
0760デフォルトの名無しさん
2008/04/14(月) 21:36:49オブジェクト指向が値が全てと言うのは勘違いだし、クロージャも
みんな昔から便利に使っている。それだけ。
0761デフォルトの名無しさん
2008/04/14(月) 21:50:02小学生の議論してんなよ
0762デフォルトの名無しさん
2008/04/14(月) 21:51:03いや、俺が感じるというか、計算モデルがそもそも違うと思うんだけどね。
まぁ、いいかw
0763デフォルトの名無しさん
2008/04/14(月) 21:53:29いかにも知ったかぶった感じで話すやつら。
0764デフォルトの名無しさん
2008/04/14(月) 21:54:570765デフォルトの名無しさん
2008/04/14(月) 21:55:00アクター理論とかはどうなの?
0766デフォルトの名無しさん
2008/04/14(月) 21:57:480767デフォルトの名無しさん
2008/04/14(月) 22:15:57背中がむずがゆくなります。
0768デフォルトの名無しさん
2008/04/14(月) 22:19:300769デフォルトの名無しさん
2008/04/14(月) 22:21:280770デフォルトの名無しさん
2008/04/14(月) 22:22:470771デフォルトの名無しさん
2008/04/14(月) 22:23:400772デフォルトの名無しさん
2008/04/14(月) 22:28:210773デフォルトの名無しさん
2008/04/14(月) 22:30:060774デフォルトの名無しさん
2008/04/14(月) 22:30:130775デフォルトの名無しさん
2008/04/14(月) 22:37:10Haskellでの実装の話しろよ。
0776デフォルトの名無しさん
2008/04/14(月) 23:05:510777デフォルトの名無しさん
2008/04/17(木) 07:30:06多いかな?という感じがします。型に関係する部分とか
特に。
これってHaskellerの間で議論があったりするんでしょうか。
比べてはいけないんでしょうけど、Schemeのようなシンプルさ
で同じような型チェックができたら最高なんですが。
0778デフォルトの名無しさん
2008/04/17(木) 08:25:11ML系のオブジェクト指向が入ってないのをやってみてはどうでしょうか。
0779デフォルトの名無しさん
2008/04/17(木) 10:31:090780デフォルトの名無しさん
2008/04/17(木) 18:26:40たぶんCaml liteの方。でなきゃSML。
0781デフォルトの名無しさん
2008/04/17(木) 21:15:56ぐちぐちうぜーこと言ってるなら
使うな辞めろうぜーんだよ
お前のチラ裏報告なんて誰も
求めてねぇよ
さっさと消えろよ
0782デフォルトの名無しさん
2008/04/17(木) 21:39:09厳格な型付けをする言語では避けて通れないんじゃないの。むしろ、それを望む人には
必要不可欠かと。
0783デフォルトの名無しさん
2008/04/17(木) 22:47:46runhaskellの引数にプログラムを書いて実行する方法はありますか?
たとえばrubyだと
$ ruby -e "print 'abc'"
のように書くことが出来ますよね。
同じような使い方をHaskellでしたいんです。
0784デフォルトの名無しさん
2008/04/18(金) 05:22:47Hugsだと多分無理
0785デフォルトの名無しさん
2008/04/19(土) 20:56:38かわいいw
0786デフォルトの名無しさん
2008/04/19(土) 23:48:13と
Introduction to Functional Programming Using Haskell
カバーしてる内容全然違う?
0787デフォルトの名無しさん
2008/04/20(日) 00:32:17数学分からない人は絶対に読むべきじゃないです。
0788デフォルトの名無しさん
2008/04/20(日) 00:36:37ここ数年の少年ジャンプの面白さを
発見するよりは簡単なはずだが?
0789デフォルトの名無しさん
2008/04/20(日) 00:44:07「型推論のHindley-Milner type inference」とかでピンと来るならいいんじゃね。
0790デフォルトの名無しさん
2008/04/20(日) 00:46:080791デフォルトの名無しさん
2008/04/20(日) 05:25:060792デフォルトの名無しさん
2008/04/20(日) 07:19:160793デフォルトの名無しさん
2008/04/20(日) 08:26:360794デフォルトの名無しさん
2008/04/22(火) 09:45:15main = do cs <- getContents
putStr cs
というサンプルがあったのだが,このまま打ち込んでも
The last statement in a 'do' construct must be an expression
と出る.どうすれば...?
0795デフォルトの名無しさん
2008/04/22(火) 12:09:38二行目の先頭にちょうど10個のスペースを入れてる?
0796デフォルトの名無しさん
2008/04/22(火) 15:58:12ttp://www.ice.nuie.nagoya-u.ac.jp/~h043078b/wiki/wiki.cgi?page=%CA%B8%CB%A1%BB%F6%B9%E0+-Haskell-#p19
0797デフォルトの名無しさん
2008/04/22(火) 20:41:46Emacsを使ってるのですが,するとEmacsの自動インデント
機能に難ありということなのでしょうか...
0798デフォルトの名無しさん
2008/04/22(火) 22:51:23Emacsはよく知らんが、Tabをスペースにかえればいいんでないの?
0799デフォルトの名無しさん
2008/04/22(火) 22:55:19http://pc11.2ch.net/test/read.cgi/tech/1174211797/
213 :デフォルトの名無しさん:2007/04/07(土) 18:00:15
すいません。emacsのhaskell-modeでプログラムしているんですが、
インデントの方法に関して質問があります。
例えば、次の様なソースがあった時、
import System
import System.IO
main = do
putStrLn $ "Woud you like some coffee?(y/n)."
hFlush stdout
c <- getChar
if c == 'y'
then putStrLn "Yes,please."
else putStrLn "No,thank you."
thenやelseの前でTabキーを押すと、if式と同じインデントになってしまうのですが、
それだとコンパイルエラーになってしまいます。なので、今はスペースでインデントを
付けています。Tabキーで正しくインデントさせる方法がありますでしょうか?
0800デフォルトの名無しさん
2008/04/22(火) 22:56:16http://pc11.2ch.net/test/read.cgi/tech/1174211797/
215 :デフォルトの名無しさん:2007/04/07(土) 19:31:19
>213
明示的に {} を使うという方法はあるにはあるが。
do { putStrLn $ "Woud you like some coffee?(y/n)."
; hFlush stdout
; c <- getChar
; if c == 'y'
then putStrLn "Yes,please."
else putStrLn "No,thank you."
}
のようにすると綺麗にインデントできる。
まぁ私は手で空白を入れたり一行にしちゃったりする方が多いけれど。
216 :デフォルトの名無しさん:2007/04/08(日) 17:57:02
>>215
レスありがとうございます。
{}を使う方法か、手動でインデントをあわせる方法の2通りという事ですね。
他の方はどうやってインデントさせているのか疑問に思っていたのですが、
その疑問が解消されました。
0801デフォルトの名無しさん
2008/04/24(木) 02:56:480802デフォルトの名無しさん
2008/04/24(木) 03:05:240803デフォルトの名無しさん
2008/04/26(土) 11:40:21再帰的な型を使うと
data Tree a = Leaf a | Branch [Tree a]
型チェックが甘いと感じます。
例えば [Leaf 1, Branch [Leaf 2, Leaf 3]] のように
ネストする深さが揃っていないものを禁止したいときはどうすればいいでしょうか?
0804デフォルトの名無しさん
2008/04/26(土) 13:16:15素朴に導入する静的な型推論が決定不能になるんじゃなかったっけ
0805デフォルトの名無しさん
2008/04/26(土) 13:17:480806デフォルトの名無しさん
2008/04/26(土) 14:19:40深さを表す数値をパラメータにできれば解決するわけですね
0807デフォルトの名無しさん
2008/04/26(土) 20:55:55余談だけど、Haskell の型推論に実装されていないもので、決定可能なものにはどんなのがあるの?
0808デフォルトの名無しさん
2008/04/26(土) 21:45:39様相型は研究以外では見ないような気もする。
0809デフォルトの名無しさん
2008/04/27(日) 08:45:01> {-# LANGUAGE GADTs #-}
この手の型を表現するためのよくあるトリック。名前は知らない
> data TrimmedRose a = ZeroTR a | SuccTR (TrimmedRose [a])
> flattenTR :: TrimmedRose a -> [a]
> flattenTR (ZeroTR x) = [x]
> flattenTR (SuccTR ts) = concat (flattenTR ts)
> testTR = do
> print $ flattenTR $ SuccTR $ SuccTR $ ZeroTR [[1, 2], [3, 4, 5]] -- => [1,2,3,4,5]
> print $ flattenTR $ SuccTR $ SuccTR $ SuccTR $ ZeroTR [[[1, 2], []], [[3, 4], [5], [6, 7]]] -- => [1,2,3,4,5,6,7]
GADT拡張があれば依存型もどきが使えるから、それを使う方法もある
> data Zero = Zero
> data Succ n = Succ
> data RoseN a n where
> Leaf :: a -> RoseN a Zero
> Branch :: [RoseN a n] -> RoseN a (Succ n)
> flattenRN :: RoseN a n -> [a]
> flattenRN (Leaf x) = [x]
> flattenRN (Branch ts) = concat $ map flattenRN ts
> testRN = do
> print $ flattenRN $ Branch [Branch [Leaf 1, Leaf 2], Branch [Leaf 3, Leaf 4, Leaf 5]] -- => [1,2,3,4,5]
> --print $ flattenRN $ Branch [Leaf 1, Branch [Leaf 2, Leaf 3]] -- error
0810デフォルトの名無しさん
2008/04/27(日) 12:09:57名指しと必然性とかについて研究するのん?
0811デフォルトの名無しさん
2008/04/27(日) 13:24:380812デフォルトの名無しさん
2008/04/27(日) 15:22:50Church数を使うのかw
コンパイル時の処理と実行時の処理を別々の言語で記述するというと
Schemeのマクロに似てる
0813デフォルトの名無しさん
2008/04/27(日) 16:21:36リアルで使う人がいるなんて信じられない!
0814デフォルトの名無しさん
2008/04/27(日) 17:12:46それから、整数をラムダ項でエンコードしてる訳じゃないので、チャーチ数じゃなくてただのペアノ式自然数だな
0815デフォルトの名無しさん
2008/04/28(月) 14:29:00WindowsのwriteProcessMemoryに該当する関数って実装されていないんでしょうか?
デバッガを作っているのですが、
他プロセスのメモリを弄る機能がどうしてもHaskellのみで作ることができません・・・
0816デフォルトの名無しさん
2008/04/28(月) 14:52:43のpokeProcessMemoryってのが該当するんじゃない?よくわからんけど。
0817デフォルトの名無しさん
2008/04/28(月) 15:24:35これです
見落としていました
ありがとうございます
0818デフォルトの名無しさん
2008/04/28(月) 15:40:580819デフォルトの名無しさん
2008/04/28(月) 15:44:190820デフォルトの名無しさん
2008/04/28(月) 15:45:58googleに電話してくる
0821デフォルトの名無しさん
2008/04/28(月) 16:05:36日本万歳!!!
0822デフォルトの名無しさん
2008/04/28(月) 16:15:15悪気はなかったんです。
0823デフォルトの名無しさん
2008/05/01(木) 16:43:38とわくわくしながらソースみたらアクションがひたすら列挙されてますた
0824デフォルトの名無しさん
2008/05/01(木) 17:36:28調べたサイトにアクセスしてもつながりません
どこか落とせる場所はありませんか?
0825デフォルトの名無しさん
2008/05/01(木) 18:31:58Functional Reactive Programmingあたりを使って遊べるゲームを作ったら注目されると思うよ
>>824
残念だけどHaskell.orgの復旧まで待つしかない気がする
0826デフォルトの名無しさん
2008/05/01(木) 19:24:11そうですか
いつからつながらなくなってるんですか?
そんなマイナーな言語じゃないんだからはやく復旧してほしい…
0827デフォルトの名無しさん
2008/05/01(木) 19:36:060828デフォルトの名無しさん
2008/05/01(木) 19:45:03Haskell を咎めるわけではないけど、間違いなくマイナーに区分される言語。
0829デフォルトの名無しさん
2008/05/01(木) 20:00:57見方によっては十分メジャーだし、見方によってはどうしようもなくマイナー
0830デフォルトの名無しさん
2008/05/01(木) 20:44:380831デフォルトの名無しさん
2008/05/02(金) 12:03:100832デフォルトの名無しさん
2008/05/03(土) 02:15:27効果は激減されるらしい
0833デフォルトの名無しさん
2008/05/03(土) 02:28:230834デフォルトの名無しさん
2008/05/06(火) 11:49:23ghcで -optl -mwindows つけてコンソール表示しないようにしたら、 putStrLn とか print で落ちる……
こういうもんだっけ?無視してくれないのかな
0835デフォルトの名無しさん
2008/05/06(火) 12:46:45ただ、Cでもprintfなんかのライブラリ関数はエラーを返さないから、
Haskellの振る舞いも改善の余地があるかも
0836デフォルトの名無しさん
2008/05/06(火) 12:57:00と思ったんだがfreopenに相当する関数がないね。
0837デフォルトの名無しさん
2008/05/06(火) 13:03:520838デフォルトの名無しさん
2008/05/06(火) 19:08:01環境の設定の仕方がわかりません
どこか参考になるサイトってありませんか?
0839デフォルトの名無しさん
2008/05/06(火) 19:35:570840デフォルトの名無しさん
2008/05/06(火) 20:37:390841デフォルトの名無しさん
2008/05/06(火) 20:59:05>>836
>>837
よっしゃできた!これでHaskelでゲーム書くです。サンキュです
main = do
withCString "output.txt" (\fn -> do
fd <- open fn ({-_O_RDWR-}2 .|. {-_O_CREAT-}0x0100) {-_S_IWRITE-}0x0080
dup2 fd 1
putStrLn "Hogehoge"
)
foreign import ccall "io.h _open" open :: CString -> INT -> INT -> IO INT
foreign import ccall "io.h _dup2" dup2 :: INT -> INT -> IO INT
0842デフォルトの名無しさん
2008/05/06(火) 21:22:51サーバの設定のことなら、特別なことは何も必要ないよ
ネイティブコンパイルしたバイナリを使うなら、Cで書いたcgiを使う手順と同じだし、
hugsとかのインタプリタを使うなら、Perlで書いたcgiを使う手順と同じ
ただし、Cと比べてクロスコンパイルはかなり面倒だと思う
コンパイルするなら、サーバ機と同じアーキテクチャ/OSを使うのがお勧め
0843デフォルトの名無しさん
2008/05/06(火) 21:33:06>>842
ありがとうございます
c言語で作るのと同じ手順を勉強しときます
0844デフォルトの名無しさん
2008/05/06(火) 22:30:202007/01/12 simonpj による STM 解説記事
http://www.jmuk.org/diary/2007/01/12/2
>Simon Peyton Jones という Haskell のほうの偉いひとが、
>何かの本に STM の解説記事を書くことになったということで、コメントを求めています。
Beautiful concurrency
http://haskell.org/haskellwiki/Talk:SantaClausProblemV2
>I am writing a chapter for a book called "Beautiful code", edited by Greg Wilson.
>The chapter is a tutorial about Software Transactional Memory in Haskell.
Beautiful Code: Leading Programmers Explain How They Think
http://www.amazon.co.jp/dp/0596510047/
>出版社: Oreilly & Associates Inc (2007/6/26)
ビューティフルコード
http://www.amazon.co.jp/dp/4873113636
>出版社: オライリージャパン (2008/4/23)
> 24章 美しきかな、並列 (405〜428ページ)
0845デフォルトの名無しさん
2008/05/06(火) 23:14:20正味、408から417までが前説
418から428がサンタさん問題を扱った実装と
まとめ
0846デフォルトの名無しさん
2008/05/07(水) 12:30:17どなたかお助けを
(++) = foldr (\a b -> (a:) . b) id
このラムダでbは関数を受けるらしいんですけど、(++)の二つの引数はともにリストなのにどこから関数が出てくるんでしょうか?
0847デフォルトの名無しさん
2008/05/07(水) 13:01:01foldr :: (a -> b -> b) -> b -> [a] -> b
だけど、b -> [a] の部分は引数を与えてないよね。
もっと分かりやすい例を挙げるとすれば、
plus :: Int -> Int -> Int
plus x y = x + y
という足し算の関数を定義したとして、
数字を1増やす関数succは
succ :: Int -> Int
succ = plus 1
というように定義することができるんだよ。
引数の一部を与えて新しい関数を作ることが出来るっていう機能だよ。
0848846
2008/05/07(水) 13:43:30>引数の一部を与えて新しい関数を作ることが出来るっていう機能だよ。
C++ STLのbindの様な物ですよね
これは分かるんですが
>だけど、b -> [a] の部分は引数を与えてないよね。
bの部分はidが a -> a だから引数を与えていないのと同じという意味ですか?
その上でb -> [a]の部分に引数を与えていないことがラムダの中に影響を及ぼすのはどういう仕組みなんでしょうか
0849デフォルトの名無しさん
2008/05/07(水) 17:09:08> foldr _ z [] = z
> foldr f z (x:xs) = f x (foldr f z xs)
だけど?
> foldr (\a b -> (a:) . b) id [1] [2]
という簡単な例で説明すると、まず評価されるのは
> foldr (\a b -> (a:) . b) id [1]
の部分。「foldr :: (a -> b -> b) -> b -> [a] -> b」に当てはめると
(a -> b -> b) == (\a b -> (a:) . b)
一つ目のb == id
[a] == [1]
になる。これを実際に手で評価してみる。
> foldr (\a b -> (a:) . b) id [1]
> (\a b -> (a:) . b) 1 (foldr (\a b -> (a:) . b) id [])
> (\a b -> (a:) . b) 1 id
(\a b -> (a:) . b)のbは「id」という関数になる。これで
>このラムダでbは関数を受けるらしいんですけど、(++)の二つの引数はともに
>リストなのにどこから関数が出てくるんでしょうか?
というのはわかるだろう。
0850デフォルトの名無しさん
2008/05/07(水) 17:18:23foldrは関数と初期値とリストを与えると(初期値と同じ型の)結果が返る関数だけど、
ここでは初期値として関数idを与えているだけ
当然、foldrの結果も関数になるし、foldrに与えるラムダも関数を受けなきゃならない
(++) :: [z] -> [z] -> [z]
foldr :: (a -> b -> b) -> b -> [a] -> b
とするなら、ここではaにzが対応し、bには([z] -> [z])が対応する
0851849
2008/05/07(水) 17:33:14>foldr (\a b -> (a:) . b) id [1]
だと
> ((1:) .id)
になるはず。これは「:」が関数であることを考えれば、「数値のリストの先頭に
1を加える」関数であることがわかるはず。実際に
> ((1:) .id) [2]
とすれば[1, 2]が返ってくる。
> foldr (\a b -> (a:) . b) id
というのは、いってみればリストを引数にとって、「そのリストを自身の引数であるリストの
先頭に加える」という別の関数を返す関数。
0852846
2008/05/07(水) 18:10:23脳が手続き型から抜け出せないのか、いまいち頭の中でうまくHaskellの表現を展開できません。
これからは分からなくなったら一つずつ書いていこうと思います
レスくれた方々、大変丁寧で分かりやすい説明ありがとうございました。
0853デフォルトの名無しさん
2008/05/07(水) 19:48:590854デフォルトの名無しさん
2008/05/07(水) 20:45:53手続き型やってる人がいきなりfoldrとか言われてもピンとこないんじゃない
ですかね。
0855デフォルトの名無しさん
2008/05/07(水) 22:57:48今日やっと10章までいった
ほんとう俺終わってる
士ぬぽ
0856デフォルトの名無しさん
2008/05/07(水) 23:29:50貧乏なんで暗号技術大全とProgrammingGems6とSICPで迷うぜ
0857デフォルトの名無しさん
2008/05/07(水) 23:37:06かわいいおにゃのこだったら
買ってやったのに残念だったな青年
0858デフォルトの名無しさん
2008/05/08(木) 00:10:26原文PDF
0859デフォルトの名無しさん
2008/05/08(木) 00:16:06暗号技術大全は買う価値なし。
0860デフォルトの名無しさん
2008/05/08(木) 01:36:44schemeとかcamlには魅力を感じない…
0861デフォルトの名無しさん
2008/05/08(木) 04:13:140862デフォルトの名無しさん
2008/05/08(木) 07:04:46基本構文は単純だし、覚える基本関数なんか数えるくらいしか
無い。そこから色んな話題が展開されるところがSICPの面白い
ところなんだな。その知識はダイレクトにHaskellでも役に立つ。
0863デフォルトの名無しさん
2008/05/08(木) 07:32:19Schemeで書くとめんどくさい事を
haskell はすっきり書けるんだなと思う。
0864デフォルトの名無しさん
2008/05/08(木) 07:36:58発売禁止書籍だろ
読むな
0865デフォルトの名無しさん
2008/05/08(木) 07:37:320866デフォルトの名無しさん
2008/05/08(木) 07:48:06むしろ言語を勉強する目的ならば、Haskellはシンプルで徹底していて、OCamlやSchemeよりいいんじゃないかなぁ。
Haskell勉強して、ラムダ計算勉強するのでok
0867デフォルトの名無しさん
2008/05/08(木) 11:20:40やりたいようにやったらいい。
0868デフォルトの名無しさん
2008/05/08(木) 20:41:090869デフォルトの名無しさん
2008/05/08(木) 22:24:05それって数理証明が難しいってだけだよね?
まさか利用することまで難しいとかDQNなこと
言ってないよね?
0870デフォルトの名無しさん
2008/05/09(金) 00:00:41ConcurrentなActor ModelのCPSは利用が難しいJK。
0871デフォルトの名無しさん
2008/05/09(金) 00:35:40具体的かつ簡単な問題ていじしてちょ?
リンクでいいちょよ
0872デフォルトの名無しさん
2008/05/09(金) 06:16:06Haskell勉強していて本によく関数の証明が出てきますよね。
あと、この関数はこういう定理に基づいて、こう変形できるとか。
これって手続き型言語の本ではお目にかからないものだと
思います。ライブラリの知識よりも、そういう数学的な発想と
いうか、ある関数を見て、別の書き方に変換できる能力の
ほうが大事なんでしょうか。
0873デフォルトの名無しさん
2008/05/09(金) 06:33:110874デフォルトの名無しさん
2008/05/09(金) 07:40:32論文の数式見てアルゴリズム実装できりゃ
実用上十分なわけで
つうかHaskell駄本の証明は簡単だろ
解らないなら使うな以上
0875デフォルトの名無しさん
2008/05/09(金) 08:01:32再帰を使ったプログラムは証明しやすいという利点がある。
ループを使ったプログラムは簡単には証明できない。
872が具体的にどのような証明のことを言っているのかわからないけど、
本では、その利点を示すために、もしくは、形式的手法の需要性を訴えるために
証明も付記しているんだろう。
0876デフォルトの名無しさん
2008/05/09(金) 08:26:32分からないだの難しいだのなんて一言も書いてないだろ。
なんだこいつ。
0877デフォルトの名無しさん
2008/05/09(金) 08:58:250878デフォルトの名無しさん
2008/05/09(金) 13:35:39面白いと思ったらやればいい
ただそれだけのこと
0879デフォルトの名無しさん
2008/05/09(金) 17:29:420880デフォルトの名無しさん
2008/05/09(金) 17:42:55プログラミング言語の問題じゃない。
0881デフォルトの名無しさん
2008/05/09(金) 18:30:470882デフォルトの名無しさん
2008/05/09(金) 19:00:35教えて君を嫌うあまり
自分も対教えて君的な対応しかできなくなってる馬鹿回答者がいるな
0883デフォルトの名無しさん
2008/05/09(金) 19:50:490884デフォルトの名無しさん
2008/05/09(金) 19:51:08お前みたいなやつ、学校のクラスに一人はいたよなぁ・・
こういうやつは決まって内向的で友達少なくて欝気味なんだよな。
しかも人望がないくせにリーダーやりたがって、最終的には失敗するんだよ。
近くにいたくないタイプw
0885デフォルトの名無しさん
2008/05/09(金) 20:09:33findWindowで取得したHWNDからopenProcessで使うProcessIdを取得したいんですが、
その間の処理のための関数が見つかりません。
Win32apiのGetWindowThreadProcessIdに該当する関数は用意されていないのでしょうか?
だとしたら中途半端すぎると思うのですが。
findWindow :: String -> String -> IO (Maybe HWND)
openProcess :: ProcessAccessRights -> BOOL -> ProcessId -> IO ProcessHandle
readProcessMemory :: PHANDLE -> ForeignAddress -> Int -> IO (ForeignPtr a)
0886デフォルトの名無しさん
2008/05/09(金) 20:17:10ソース読め
読んでも解らないなら使うな以上
0887デフォルトの名無しさん
2008/05/09(金) 20:34:46win32パッケージはみんなが日常的に使うものって訳じゃないし、中途半端なところがあっても不思議じゃない
足りない部分があるならパッチを送るのがいいと思うよ
ちなみに、特定の関数のラッパがライブラリに含まれてるか知りたいときは、
ソースを落としてforeign import宣言をgrepするのがお勧め
0888デフォルトの名無しさん
2008/05/09(金) 20:36:52はい?見当違いですね。
0889デフォルトの名無しさん
2008/05/09(金) 20:38:31具体的な例が簡単なら利用が難しいとは言わないだろ常考w
0890デフォルトの名無しさん
2008/05/09(金) 20:41:07私には君がそのレスを嬉々として書いている様が一瞬で頭に浮かんだのだが、
ちょっとここで落ち付いてもう一度考えてほしい。
そのレスをすることに何の意味があるのかを。
あ、オナニーですね、わかります。
解らないなら使うな以上(笑)
読んでも解らないなら使うな以上 (笑)
0891872
2008/05/09(金) 20:41:25自分は手続き型しか経験が無かったので、プログラムが意図した動きを
するかをテストするという発想はあっても、証明するという発想はありません
でした。
それが、Haskell本ではよく出てくるので、アプリケーションの信頼性を「証明」
するということが重要なのかな、と思ったのです。
別にそんなこと一々しないんですかね。或いは、ツールで検証できたりする
んでしょうか。
0892デフォルトの名無しさん
2008/05/09(金) 20:43:03相手にする価値無いからほっといた方がイイ!
0893デフォルトの名無しさん
2008/05/09(金) 20:47:27読め
使うな
以上
登録したら気分爽快w
0894デフォルトの名無しさん
2008/05/09(金) 20:49:540895デフォルトの名無しさん
2008/05/09(金) 20:50:23プログラム全体の正しさを証明するのは難しすぎて(良くても面倒すぎて)実際的じゃない(少なくとも今は)
だから、Haskellでもテストは手続き型言語の場合と同様に重要で、テストに代わるものは無い
ただし、限定された状況では形式的な証明が有効なことはある
Ordのインスタンスを書いたとき、それがちゃんと全順序になっていることを証明するとか、
自分で書いた書き換え規則(これはGHC特有の機能だけど)の正しさを証明するとか
0896デフォルトの名無しさん
2008/05/09(金) 20:51:380897デフォルトの名無しさん
2008/05/09(金) 21:44:25「xxxという法則を満たすものをyyyとみなすといろいろ便利なことがあ
ります」
という謎掛けのような言い回し、なんだかいろいろなものを一つの枠組みで処
理することを表してるんかなあと思っていたんだけど、今日ひらめいた。
あんまり好きじゃない言葉をあえて使うけど、
モナドっていわゆるデザインパターンの一種と考えておk?
0898デフォルトの名無しさん
2008/05/09(金) 21:47:46デザインパターンとはまた違うね。
モナドをデザインパターンとみなすならありとあらゆるアルゴリズムとデータ構造がデザインパターンだといわれてしまう。
0899デフォルトの名無しさん
2008/05/09(金) 21:58:16その通りで、「モナド式のインタフェースを与える」というのが一種のデザインパターンになってる
ただし、メタな慣習に留まらずに、「Monad」というクラスを通じて言語内でこの仕組みを活用できるから、
いわゆるデザインパターン(対応する概念がコード中に直接現れない)とは少し違う
>>898
モナドはアルゴリズムでもデータ構造でもないけど、なんでそうなる?
0900デフォルトの名無しさん
2008/05/09(金) 22:01:31アルゴリズムとデータ構造だろ。
0901デフォルトの名無しさん
2008/05/09(金) 22:07:20個々のモナドならそうだな
俺は>>897を読んで、個々のモナドについてじゃなく
Monadクラス(あるいはモナドという考え方)についての話題だと解釈した
Monadクラスはデータ構造でもアルゴリズムでもないってのは認めるよな?
0902デフォルトの名無しさん
2008/05/09(金) 22:27:03クラスとは?
型クラスのこと?
データ構造に過ぎないと思うが。
デザインパターンというのはもっとラフなもの、たとえばプログラマーの設計におけるノウハウのようなものを言うんだよ。
モナドはノウハウじゃないよね。
0903デフォルトの名無しさん
2008/05/09(金) 22:40:16型クラスのこと
型クラスはいかなる構造も表さないだろ
データ構造は個々のインスタンスだ
モナドはノウハウだと言えると思う(少なくともそういう側面がある)
ライブラリを設計する時に、特定の機能をモナドとして公開するという選択肢を知っていると便利だという意味で
ただ、Haskellでのモナドは単なるノウハウにとどまらず、実際にコード上で型クラスとして利用できる
(つまりliftMとかmapMみたいな、任意のモナドについての関数を書ける)
という点で、典型的なデザインパターンとは違うから、それを>>899の4行目に書いた
0904デフォルトの名無しさん
2008/05/09(金) 22:43:590905デフォルトの名無しさん
2008/05/09(金) 23:22:25モナドなんかの定義は
GHCの神様の論文みりゃいいだろ
数式的にこみいっているなら
圏とかその辺の簡単な英語の
教科書読めばいいだろ
そもそも、偉そうで大して
何も功績のない黄色猿の説明の
真似事を真に受けるから混乱するんだよ
他の分野と違って日本語で発信した
情報を改良していった分野じゃねーから
日本語の情報なんて読むだけ無駄なんだよ
0906デフォルトの名無しさん
2008/05/09(金) 23:26:04>>895
Haskellの関数と仕様を与えて、関数がその仕様をみたすことの証明をする支援ツールがある。
名前はAgda
このツールによって証明された関数は、仕様を満たすことが保証されるので、テストが必要ない。
このようなツールは証明支援系(Proof Assistant)、定理証明系(Theorem Prover)などと呼ばれている。
0907デフォルトの名無しさん
2008/05/09(金) 23:27:45>>895
Haskellの関数と仕様を与えて、関数がその仕様をみたすことの証明をする支援ツールがある。
名前はAgda
このツールによって証明された関数は、仕様を満たすことが保証されるので、テストが必要ない。
このようなツールは証明支援系(Proof Assistant)、定理証明系(Theorem Prover)などと呼ばれている。
0908デフォルトの名無しさん
2008/05/09(金) 23:42:37通信相手が異常なデータを送ってきたときどうなるかとか、
そういうのってテストするのが一番の近道だと思うんだけど、どうなんだろ。
0909デフォルトの名無しさん
2008/05/09(金) 23:56:05その程度の組み合わせと遷移なら
spinでいいだろボケカス
0910デフォルトの名無しさん
2008/05/10(土) 00:16:29Agdaの存在は知ってたけど、現実の問題に対してテストの代わりになるの?
0911デフォルトの名無しさん
2008/05/10(土) 00:36:17こんな感じ?
0912872
2008/05/10(土) 08:40:16おお、こういうツールがやはりあるんですね。ありがとうございます。
Haskellというとコンパクトな記述とかがクローズアップされますけど、
参照透過性にこだわりを持つ言語ということで、テストではなくて
証明が可能な場合が多い、というのは刺激的だと思います。
>>908
テストと証明では質的な違いがありますよね。テストはどこまで行っても
信頼できる「と思われる」の積み重ねであって、絶対に間違いがあっては
いけないシステムの場合、テストは凄いコストかかるんじゃないでしょうか。
証明可能で、しかもツールでそれが検証できれば凄いコストが減らせます。
一般的な実用化を進めるに際して、重要な要素だと思います。
0913デフォルトの名無しさん
2008/05/10(土) 09:58:38Haskellで証明が可能な場合が多いのではなく、すべての関数について証明をすることができる。
もちろん非常に難しいものもあるが。
再帰関数は証明が簡単である事が多いという事実もある。
>>908
形式的な証明は常に必要な訳ではない。今すぐ使いたいシステムで、多少のバグは許容される場合は、
形式手法は向いていない。
しかし、不具合が許されないシステム開発においては、テスト行程に莫大な予算がかかってしまう。
[参考] UFJ銀行のシステム統合↓
http://itpro.nikkeibp.co.jp/article/OPINION/20080423/299886/
これは、システム開発にCOBOLやJavaなどを使っているためである。
0914デフォルトの名無しさん
2008/05/10(土) 11:09:27訂正
x すべての関数について証明する事ができる。
もちろん、正しくないことは証明できない。
0915デフォルトの名無しさん
2008/05/10(土) 12:02:59『不具合が許されないシステム開発においてはHaskellで開発すればよい』
と言ってるのか?
0916デフォルトの名無しさん
2008/05/10(土) 12:15:50数式化するときってみんなどうしてる?
0917デフォルトの名無しさん
2008/05/10(土) 12:24:27というところまで考えると、
やっぱりテストは必要だと思う。
0918デフォルトの名無しさん
2008/05/10(土) 12:31:30その通り。
しかし現実的には以下のような問題があり、大企業で今すぐ導入する事は難しい可能性がある。
- 過去に作った巨大なシステムがJavaなどで作られている。
- 偉い人(責任者や、クライアント) がHaskellや形式手法などの技術に関する知識を持っていない。
- 関数型言語ができるエンジニアが世界的に見ても少数である。
これからシステムは複雑になっていく一方で、不具合に対するリスクや、
テストにかかるコストが上がっていくのならば、形式手法を用いた開発がより求められるかもしれない。
実際に関数型言語を第一言語として、金融関係のシステム開発を行っている会社がニューヨークに存在する。
http://www.janestcapital.com/
0919デフォルトの名無しさん
2008/05/10(土) 12:38:52そうなの?
0920デフォルトの名無しさん
2008/05/10(土) 12:39:16確かに仕様を厳密に読む能力がないといけない。それは契約書などで契約を結ぶのと似ている。
契約を結ぶ両者が契約書の記述をきちんと読んで判定しないと契約はうまくいかない。
テストが必要である事は変わらないかもしれないが、テストだけでは100%の保証をする事はできない。
形式手法によって、テストのウェイトを減らし、信頼性を増やす事ができるかもしれない。
0921デフォルトの名無しさん
2008/05/10(土) 12:39:21形式的意味論や型推論を
使って手続きと関数型を
クロス変換できるといいんだよなぁ
>>918作ってよ
0922デフォルトの名無しさん
2008/05/10(土) 12:46:07共用体のような型を多用するとコンパイルが簡単に通るようになる。
けど実行時にエラーが出る。
何故そんな書き方が許されるのかというと、そうしないと書けないこともあるから。
そういうコードは静的なチェックができない。
0923デフォルトの名無しさん
2008/05/10(土) 12:49:49例えばGHC↓
http://www.haskell.org/ghc/
0924デフォルトの名無しさん
2008/05/10(土) 12:50:23ttp://www.sagisou.sakura.ne.jp/~la/img/rn189_02.jpg
ttp://www.sagisou.sakura.ne.jp/~la/img/rn189_03.jpg
ttp://www.sagisou.sakura.ne.jp/~la/img/rn189_04.jpg
0925デフォルトの名無しさん
2008/05/10(土) 12:51:20HaskellでGoogle検索したときとかに、人材募集の公告を出している会社だね。
0926デフォルトの名無しさん
2008/05/10(土) 12:53:120927デフォルトの名無しさん
2008/05/10(土) 13:08:04うんこ絵まだ〜?
0928デフォルトの名無しさん
2008/05/10(土) 13:14:00,.--、、
,:' ゙ヽ、
/ ,,.-‐-- 、..ユ_
/レ´ `ヽ、
, ´_ ,:''´ ̄`ヽ. ゙ヽ.
,:',r´ ゙ヽ::i 「`''‐-、 ヘ
lイ j:{ ト 、 `ヽi
|{ (__)、_ __,.ノ′ ヽ、 l
{,.ゝ-‐' __|_,,..二_ ヽ. l ,;ァ
,..,r‐、| ,r'´_,..-─--ヾ、 ヘ.ム' j
| } | l. |リ k‐''''゙゙´フ ヽ ノ/ ス二ニ
| j | ヽ! { `'''゙´ ,,,... ゝ=-、_∠c'ン-‐''´‐
| j^l| ヽ-ヽ. ゙゙"´ ,,,;;;' ,ノノク
j' 丿/レ´) ヽ、_,.-1;;;;; _.ィ//,.-‐─=
{'´ i'ノ / _,.!-‐',ィ,イ,r'´
0929デフォルトの名無しさん
2008/05/10(土) 13:25:57ET言語なんかがその方向なんジャマイカ?
http://alohakun.blog7.fc2.com/
0930デフォルトの名無しさん
2008/05/10(土) 13:39:13それって学会発表聞いた限り
CAD関係の数値データの変換程度
しかできないって記憶があるけど
今は分散トランザクションとか扱えるまで
成長してきたのかな?
0931デフォルトの名無しさん
2008/05/10(土) 13:45:310932デフォルトの名無しさん
2008/05/10(土) 13:49:00アルゴリズムを数式化する方法について
教えてほしいぉ
0933デフォルトの名無しさん
2008/05/10(土) 13:52:40俺、商売のチャンス見つけちゃってる?
0934デフォルトの名無しさん
2008/05/10(土) 13:58:360935デフォルトの名無しさん
2008/05/10(土) 14:06:14競走相手は、学者だぞ。
MOT(技術経営:Management of Technology)は参考になるかも。
0936912
2008/05/10(土) 21:22:55なるほど。自分はHaskell学習中で、BirdのIntroduction〜を読んでるの
ですが、最終章に証明アプリみたいなのが出てきますよね。
これを見て凄く感動しましたw。こういうのがHaskell開発の統合環境のような
ものでサポートされれば、関数選択して簡潔な表記へ変換とか、色んなことが
可能なんじゃないか。ユニットテストも全く違った形で、凄い精度よくできるん
じゃないかと思ったんですね。
0937デフォルトの名無しさん
2008/05/10(土) 22:08:32Communicating and Mobile Systems: The Pi-Calculus
0938デフォルトの名無しさん
2008/05/10(土) 22:29:440939デフォルトの名無しさん
2008/05/10(土) 22:52:18サイボウズラボ
http://pc11.2ch.net/test/read.cgi/prog/1209262884/l50
611 名前: た 投稿日: 2008/05/10(土) 13:26:19
ね、分散システムとかの基礎本、
いいの知ってたら教えてちょ。
613 名前: 仕様書無しさん 投稿日: 2008/05/10(土) 14:08:26
>>611 Communicating and Mobile Systems: The Pi-Calculus
0940デフォルトの名無しさん
2008/05/11(日) 00:58:05π-calculus 超入門
http://web.yl.is.s.u-tokyo.ac.jp/kobalab/kadai99/picalc.html
0941デフォルトの名無しさん
2008/05/11(日) 00:59:220942デフォルトの名無しさん
2008/05/11(日) 03:07:18ごちそうさまでした
0943デフォルトの名無しさん
2008/05/12(月) 01:55:140944デフォルトの名無しさん
2008/05/12(月) 19:49:49compilation IS NOT required
test.o(.test.o(.text+0x46):fake: undefined reference to
`cgizm3001zi1zi5zi2_NetworkziCGI_runCGI_closure'
0945デフォルトの名無しさん
2008/05/12(月) 19:50:52>>944のようなエラーが出てきた場合はどのような対処をすればいいですか?
0946デフォルトの名無しさん
2008/05/12(月) 20:24:000947デフォルトの名無しさん
2008/05/12(月) 20:45:09F#はその点どうなんだ?
・一応関数型言語
・でもHaskellほど純粋じゃない
・M$開発なのもあって、使い始めてる企業もぽつぽつ
・.NET
0948デフォルトの名無しさん
2008/05/12(月) 23:13:20例えば、ttp://ujihisa.nowa.jp/entry/83b42ba2e2
のプログラムはrunghcで動かす時はリストの一部が出力されますが、ghcでコンパイルして
動かすと何も出ないですよね?
無限リストなんかを処理が終わった部分から逐次出力する、というのはどうすればいいんでしょうか?
runghcの場合は大丈夫なのですがコンパイルして実行すると駄目です。
0949デフォルトの名無しさん
2008/05/13(火) 00:06:02こんなふうに書き換えると最初の値だけは出力されるね。
GHCの実装の詳細までは知らないですが……
main = mapM_ (print . love) [0..10]
love :: Int -> Bool
love 0 = True
love k = love (k-1) && love 1
0950デフォルトの名無しさん
2008/05/13(火) 06:08:25標準出力のバッファリングを無効にすればいい
import IO
main = hSetBuffering stdout NoBuffering >> ...
0951デフォルトの名無しさん
2008/05/13(火) 07:55:25F#でも同じだろ。
静的型付け言語だし、再帰でプログラミングするし。
ただ、現状ではHaskellやOCamlの方が、証明支援ツールが充実している。
0952デフォルトの名無しさん
2008/05/13(火) 09:52:53定理証明支援系で証明できることはどうせたかが知れており、
これは業種にもよるので断言できないが、実際に保証したいことはまず
証明できない。できたとしても時間かかりすぎ。仕様が変更されれば
証明に要した労力も無駄。費用対効果の面から魅力を感じられない。
自動、半自動的な検証は当然大いに利用したいが、モデル検査はちょっと
おおげさ。やはり言語に付属している型検査、型推論が妥当な手段になる。
企業側が関数型言語を選ぶのにはいくつか理由があるが、結構重要視されて
いるのが、関数型言語を書ける人間を集める方が、Javaで集めるより、
当たりが多いという事実。もちろんそういう意味では機械証明ができる人材は
歓迎される。まあ、面接や2chのスレを見てる限り、これももうすぐ成り立た
なくなるだろうけど。
0953デフォルトの名無しさん
2008/05/13(火) 16:05:23> これは業種にもよるので断言できないが、
> 実際に保証したいことはまず証明できない。
まあ断言していいと思うよ。
0954デフォルトの名無しさん
2008/05/13(火) 21:20:59これで衛星軌道に乗せる
プログラムの証明やろうとして
職失ったしなw
今は曰く有りだから関わらん方が
いいよ。趣味でどうしてもとかいう
好奇心旺盛な変態はいいと思うが
0955デフォルトの名無しさん
2008/05/13(火) 22:10:41>いくつか関数型言語を使う企業を見たり、経験しているが
可能ならば、具体例きぼんぬ。
0956デフォルトの名無しさん
2008/05/13(火) 22:16:39それは、計算機で数学の証明ができない、ということと等価なんでしょうか?
0957デフォルトの名無しさん
2008/05/13(火) 22:17:51実際にHaskellやOCamlを使っているところは、単純に静的型チェックによる安全性を重要視してるんじゃない?
Javaなんかも静的型チェックがあるけど、HaskellやOCamlはもっと安全で、でも、Javaほど冗長じゃない
っていうのが普通に便利だと思うけど。
0958デフォルトの名無しさん
2008/05/13(火) 22:24:01答えはNo.
できるけれども、現状では、難しすぎて実用的でないということ。
定理証明支援器は使うためにラムダ式の厳密な扱いができないとダメだし、ツールの使いやすさも
まだまだ発展途上。
0959デフォルトの名無しさん
2008/05/13(火) 22:28:21定義してる部分を見るしかないの?
0960デフォルトの名無しさん
2008/05/13(火) 22:42:53働いたり内部に首を突っ込んで詳しく聞いたのは外資金融系数社、大手、小規模含む。ocaml 2社、Haskell 2社。
全社をあげて取り組んでいたり、一部プロジェクトチームだけだったり。これ以上は勘弁。
他にも外資金融数社でF#などの採用を考えているという話。金融ではこれからの十年は関数型じゃないか?という噂。
金融じゃないが東大でもHaskellを使ってspin-outした若者達がいたよね。
>>956
あまり関係ありません。
証明を書けたとしても通常は時間が掛かりすぎて、問題自体が変化するなど、労力=給料に見合わない、ということです。
証明スクリプトを自在に書けるほどの人材なら、基本デザインに参加させることで安全性を向上させるほうがよいです。
>>957
まあ、そのとうり。
偏見かもですが、以上の会社/プロジェクトではオブジェクトは人間による静的解析を
難しくするのでどこでも人気ありませんでした。
0961デフォルトの名無しさん
2008/05/13(火) 22:45:19がいまいちわかってない
練習問題5個ちょうだい
0962デフォルトの名無しさん
2008/05/13(火) 22:49:12955ではないですが、もう少しお聞きしたいのですが、金融系で関数型というのは、
どういう部分で使ってるんでしょうか?リスク管理とかのシステムは割と金融工学
とかの人たちが多い印象があるんですが、そういう部分でしょうか。
0963デフォルトの名無しさん
2008/05/13(火) 22:52:05関数型言語を使う企業情報サンクス。
知らないだけで、けっこう使われているのね。
0964デフォルトの名無しさん
2008/05/13(火) 22:52:17基本的にはそう。aの型だけ見れば分かることもあるけど
別にこれはHaskell特有の事情じゃなくて、例えばCでも、
a(b, c, d)
という式を見ただけではbやcやdが関数かどうかは分からない
0965デフォルトの名無しさん
2008/05/13(火) 22:53:27> 働いたり内部に首を突っ込んで詳しく聞いたのは外資金融系数社、大手、小規模含む。ocaml 2社、Haskell 2社
日本の会社ですか?
0966デフォルトの名無しさん
2008/05/13(火) 22:53:30式を値として使うってどういうこと?
0967デフォルトの名無しさん
2008/05/13(火) 22:54:37ひょっとしてビジネスロジックの計算部分だけとかそういうオチ?
0968デフォルトの名無しさん
2008/05/13(火) 23:01:27って奴です日本語の意味は知りません
0969デフォルトの名無しさん
2008/05/14(水) 00:02:11投資額2500億円、開発工数11万人月
三菱東京UFJ銀行は2007年8月までにサブシステムの開発と単体テストを終え,
9月から今日に至る8カ月間,接続テスト,総合テスト,最終確認テストと,
ひたすらテストを重ねてきた。
↓
UFJ システム統合 テスト不十分
http://www.nhk.or.jp/news/t10014535911000.html#
0970デフォルトの名無しさん
2008/05/14(水) 00:14:17素朴な感覚として、数千人が従事したシステム開発で間違いが
あってはならない、というのは無理な相談だと思うが…。
関数型言語はそういう点でも期待されてるのかね。
0971デフォルトの名無しさん
2008/05/14(水) 00:18:04海外の堅いシステム系の人に
質問したことあるけど結局金の問題
偉い人はたかがパソコンずらーっと並べて
金勘定させるのになぜこんなに金かかるんだ
安くしろ他社を出し抜けと思っているだけなんだよ
0972デフォルトの名無しさん
2008/05/14(水) 02:25:38フィボでどこまでけいさんできるのか?して300000でシステムが不安定になったよ。^^;
でも落ちなかったところが偉い。
0973デフォルトの名無しさん
2008/05/14(水) 07:27:12全社をあげて取り組んでいるところは基本インフラは全部関数型。
といってもトレーダーに関数型言語を習わせるわけにもいかないし、
シミュレーションコアはC/C++な所もある。
大手だと既存インフラがあるので一部を強化、置き換える形で導入。
Quantsは基本的に言語理論知らないので、Quantsが関数型使おう
ということはまずない。よほど意識の進んだ頭のおかしいQuantsとか、
ITの人がプロジェクトとして始める。うまくいったり、理解を得られず
失敗したり。そういう意味ではリスキー。
Quantsの悪口を言うと言語理論どころか計算量も知らない奴とか、
C++早い、マンセーとか言いながら構造体をコピー渡ししたりとか
大手にもいるの。なので、気をつけて関数型で書けば、もとの
プログラムより早くなっちゃたりする。実はそういう業界。
>>965
日本にある会社はごく一部。全部外資。日本企業は知らね。
>>967
Haskellを採用している所は遅いからそうかもわからんね。
0974962
2008/05/14(水) 11:10:58ありがとうございます。基本インフラに関数型ってのは驚きですね。
それを売りにしようとしている企業なんでしょうか。
てっきり金融商品の価格設定計算だったり、リスク管理部門の計算
システムかと思ってました。デリバのリスク管理とかHaskellなんかが
向いてそうだなぁと。
0975デフォルトの名無しさん
2008/05/14(水) 11:14:08具体的なコードがみたいな
0976デフォルトの名無しさん
2008/05/14(水) 12:27:220977デフォルトの名無しさん
2008/05/14(水) 13:11:50アーランの会社だろ
0978デフォルトの名無しさん
2008/05/14(水) 17:35:53不安定になるなら落ちたほうがまだマシだろw
0979デフォルトの名無しさん
2008/05/14(水) 17:45:010980デフォルトの名無しさん
2008/05/14(水) 19:15:44どっかに就職してね
0981デフォルトの名無しさん
2008/05/14(水) 19:17:01どこに?
0982デフォルトの名無しさん
2008/05/14(水) 19:18:51千葉にオフィスがあるみたいだね。
http://ocaml.janestcapital.com/
http://rikunabi2009.yahoo.co.jp/bin/KDBG00200.cgi?KOKYAKU_ID=2715900001&MAGIC=
0983デフォルトの名無しさん
2008/05/14(水) 19:23:05Haskellでローレベルな解析するツールがどれだけ充実してるんだか。
0984デフォルトの名無しさん
2008/05/14(水) 19:24:33Network.CGI と Text.Html あたりじゃない?
どっちも使ったことはないけど。
0985デフォルトの名無しさん
2008/05/14(水) 19:57:55よくわかりません
例題を4題くだされ
0986デフォルトの名無しさん
2008/05/14(水) 20:20:560987デフォルトの名無しさん
2008/05/14(水) 21:22:31>>966
>>968
>>985
何がよくわからないのかよくわかりません。
0988デフォルトの名無しさん
2008/05/14(水) 21:49:39http://www.sato.kuis.kyoto-u.ac.jp/~igarashi/class/isle4/mltext/ocaml005.html
0989デフォルトの名無しさん
2008/05/15(木) 09:55:180990デフォルトの名無しさん
2008/05/15(木) 19:44:33関連スレ
・関数型言語Part IV
http://pc8.2ch.net/test/read.cgi/tech/1083649982/
・【数学者】Haskellはクソ言語【オナニー】
http://pc8.2ch.net/test/read.cgi/tech/1128011645/
・純粋関数型言語Concurent Clean
http://pc8.2ch.net/test/read.cgi/tech/1075629340/
・関数型言語ML(SML, OCaml, etc.), Part 5
http://pc11.2ch.net/test/read.cgi/tech/1186292994/
・Lisp Scheme Part21
http://pc11.2ch.net/test/read.cgi/tech/1207300697/
【入門】Common Lisp その4【質問よろず】
http://pc11.2ch.net/test/read.cgi/tech/1201402366/
・Emacs Lisp 3
http://pc11.2ch.net/test/read.cgi/tech/1191875993/
0991デフォルトの名無しさん
2008/05/15(木) 19:46:48>>18 のリンク先も欲しいな
0992デフォルトの名無しさん
2008/05/15(木) 21:18:28・栄光のグラスゴーHaskellコンパイルシステム利用の手引き バージョン6.8.2
http://www.kotha.net/ghc_users_guide_ja/
も欲しいかも。
0993デフォルトの名無しさん
2008/05/15(木) 21:33:19http://www.haskell.org/bio.html
レス数が950を超えています。1000を超えると書き込みができなくなります。