関数型プログラミング言語Haskell Part8
3 :
デフォルトの名無しさん :2007/10/30(火) 20:28:50
2
・日本語の扱いについて Haskell98によると、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でリテラルを直に 書くことはできない。 (続く)
(続き) 3.最近の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)が正しく動作しない。
7 :
1 :2007/10/30(火) 20:33:11
テンプレはここまで。 前スレが終わってからしばらく建ってなかったので建てました。 初めてスレ建てしたので、行き届かないところがあったらごめんなさい。
8 :
デフォルトの名無しさん :2007/10/30(火) 21:15:53
乙一
9 :
デフォルトの名無しさん :2007/10/31(水) 01:00:13
一乙
4日くらい前にHaskell初めてふつけるは2回読んだんだけどモナドのとことかがよくわかんないレベルの俺が練習のためにcatコマンドの各オプションの関数作ってみた
ttp://uproda11.2ch-library.com/src/1141095.hs.shtml PASS:mu
であげてみたので、「この手続き脳が!」とか「貴様はなんもわかっちゃいねぇ!」とかってアドバイスしてくれると嬉しいです
あとフリーポイントスタイルの関数定義で
hogehoge = abc $ def $ ghi
hogehoeg = abc.def.ghi
↑がダメで↓がOKなのが何故なのか理解できない
.は関数合成用で$は部分適用用なの?Hoogleとかみてもよくわかんなかった
>>10 直した方がいいところはいろいろあるけどまずは簡単なところを一つ。
combinateStr = zipWith (++)
Preludeモジュールに入っている関数を一通り読んでおくと勉強になるよ。
abc $ def $ ghi は abc(def (ghi)) と書くのと同じなので、 ghiがdefの引数になってしまう。 一方abc . def . ghi は \ x -> abc(def(ghi x))
>>10 headとか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
createLineNumber n ls = snd $ mapAccumL f n ls where f n "" = (n, "") f n line = (n+1, fillSpace 6 n ++ ":" ++ line)
mapAccum*の引数順と渡す関数の戻り値の順序が覚えられねえ
>>13 よくわかんねー ためしに↓をコンパイルしてみたら怒られなかった件 …アレ?
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ってなんだ…
>>17 それはabc,def,ghiが全部a->a型だから通る。
例えばdef, ghiの型がInt -> Intだったらdef $ ghiってのは
引数がInt型の関数defにInt->Int型の引数ghiを突っ込むことになるので
Int ≠ Int->Intってことで型エラーになる。
>>17 foldrは演算子を使ってリストを潰したいときに使う。
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とかと一緒。
>>18 今夜うちにきて妹をファックしていいぜ
>>19 よくわからんからあとでよく考えてみる…
>>20 なんか使いこなせば幸せになれる代物らしいことは分かった
お前らありがとな
またスレに話題がないときにでも構ってくれ ノ
>>20 どれもfoldrよりfoldr1のが楽そうだな
>>23 maxの例はそうだけど、それ以外は空リストでも問題なく扱えるfoldrの方が使いやすくないか?
26 :
デフォルトの名無しさん :2007/11/01(木) 12:49:18
Haskellオワタ・・・
所詮おもちゃ言語か
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では文字列のメモリ効率が悪すぎるから、あまり大きな文字列は扱えない。
オワタもなにも既出なんだが。 今頃気づいたのか?
100MBのソースコンパイルってすげーなw 誰かsequenceの説明してくれないか? モナドがなんで便利そうなのかイメージ的にはわかったんだけど、なんでもいいけどなんかモナドをリストにして扱いたいのの具体例が思いつかね
説明ってsequenceが何をするか分からんってこと? sequence [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]]
30 :
デフォルトの名無しさん :2007/11/02(金) 01:07:34
>>29 sequence自体が何をするのかはわかるんだけど…
google code明日にでも漁ってみるよ
分からないのは、たとえばその例だと
putStr "Hello world"で済むじゃんいらないじゃんみたいな
リストモナドに総当たりうんぬんはすごく幸せそうに見えるわ
>putStr "Hello world"で済むじゃんいらないじゃんみたいな うん。だからsequenceの真価が発揮されるのはリストの内容や要素数が実行時まで決まらないときだ。 なんか人為的な例だけど、 g :: Int -> IO (Maybe (IO ()) という関数があるとする。これは何か動作を実行するんだけど、それは失敗するかもしれなくて、 そのときはNothingを返す。成功した場合は後で後始末をしなきゃいけない。そのために(Just 後始末)を返す。 gを0から9までを引数にして実行して、それが終わったら全部後始末をしたいとしよう。これはsequence_を使って do cleanups <- liftM catMaybes $ mapM g [0..9] sequence_ cleanups と書ける。
>>31 むずかしーな…
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)) じゃダメなの?
>>33 getStdGenはIOモナドだけどtake 3 (randoms g)はモナドじゃないから
return (take 3 (randoms g))にしないとだめ。
main = getStdGen >>= return . take 3 . randoms >>= (print :: [Int] -> IO ())
そっか! でも\gが勝手に型推論されていい感じになったりはしないのか? あと(print :: [Int] -> IO ()) もよくわからんから明日勉強してみるよ!
質問です。 前スレで↓のような宣言が書かれていたのですが、 これはどのような実装で使うことができる構文なのでしょうか? type Hoge' = { h in Hoge | (one h) < (two h)}
>>28 sequenceはモナドができるまでのHaskellのIOに使われていたもので、
現在ではレガシーです。
>>36 その書き込みに対して「それはどういう方言?実装ある?」という
質問があったけどその後誰も反応しなかったところを見ると
ガセだったじゃないのかな。
またhaskell.org落ちてやがる 管理どうなってんだ
マニュアルの日本語訳も早くこーい
HaskellってGPL?
GHCとかHugsは非GPL。
どうせコンパイラいじる気がないから何でもいい
ちょっとお前ら教えてくれよ
>>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とかは使っても参照透明なままなのか?
2は型がInt -> IO Stringで、最後をreturn(show(ns::[Int]))にせないかん。 3は型がInt -> IO [Int] で、最後をreturn(take n (randoms g))にせないかん。
それ
>>34 でも教えてもらったな… 俺わかってないな…
(・´ω`・)ぅーん
49 :
デフォルトの名無しさん :2007/11/06(火) 22:35:47
letのところは無視してdo構文の各行を最終的な型だけで見てやったら それぞれこんな感じになって、 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。
>>49 読んだ 少し分かったような分からないような…?
YOUはIOモナドを使った関数も参照透明だよって言ってるけど
標準入力読んだときとか乱数生成したときとか同じ引数あげても同じ値が返ってくるとは
限らないじゃん それって困るんじゃないの? って思うの
>>50 >>49 の説明と合わせたらちょっと分かったかも
そーいえばリストもモナドなんだったっけ
例示してくれた1.2.3.の例はHaskellとして正しい文法なん?
言いたい意味はわかるけどそういう書き方があるの?
前スレ952が教えてくれたサイトやら見てみたけどわかんない…
>>51 randomRIO :: (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 ...
としても意味が変わらないことが保証される。これが参照透過性。
文法として正しいわけねぇじゃん。あくまで説明用。
>>52 アクションやら動作うんぬんとかいうことかー
変数に束縛して使ったときに動作が実行されて〜〜みたいな?
main = do
rnd <- randomRIO(0,3)
putStr $ show (rnd :: Int)
とかすると束縛したときはアクションですけどshowに渡るときにはいつの間にか数字ですよみたいなごまかし方(?)なのか?
ていうかghcでコンパイルしたあと実行すると処理が帰ってこないんだけどghciでmain呼ぶとちゃんと表示される罠 意味わかんね
>>53 だってわかんなかったんだもん いぢわるー
>>54 do記法で
rnd <- randomRIO (0, 3)
と書くと、rndが束縛されるのは数値Intであって動作IO Intじゃない。
矢印の右辺と左辺は別物。というかこの行だけ取り出すのは無意味。
do式全体で、「randomRIO (0, 3)を実行し、その結果がrndならばputStr $ show rndを実行するという動作」と読む。
慣れるまではdo記法をほどいて
randomRIO (0, 3) >>= (\rnd -> putStr $ show rnd)
に戻して考えるようにした方が分かりやすいかもしれない。
俺の手元ではコンパイルしたのもちゃんと動いたよ。
>>55 ( ´3`)<よくわかんなーい
乱数を生成する動作を返す関数があって、その動作が実行されてモノホンの数値になる瞬間がある気がするんだけど気のせいなのか?
ちなみに
The Glorious Glasgow Haskell Compilation System, version 6.6.1
ghc test.hs --makeでコンパイルしてtest.exe実行→処理帰ってこない
>>56 いや、Haskellプログラムは最初から最後まで動作をこねくりまわしてるだけで、
いつ実行されるかという話はあまり関係ない。
「ジャガイモの皮を剥く」というレシピと「茹でる」というレシピから
「ジャガイモの皮を剥いて茹でる」というレシピを合成する、という次元のことをやってる。
この作業をするとき、実際にいつレシピに基づいて料理が行われるかを気にする必要はない。
実際には、プログラムを起動すると即座にmainが「実行」されはじめて、
それに必要な分だけ「評価」が起こる訳だけど。
なるほどー レシピは完成品を作っちゃくれないってか
こねくり回し方を想像できない人は素人
Haskellの素人なのか園論の素人なのか数学の素人なのかなんの素人なのかさえ分からない俺はキングオブ素人 今日もまたわからないことがいっぱいでした…
この場合は処理系の素人
ちなみに、園論ではなく圏論(けんろん:category theory)
その・さとしさんが提案
ハスケルルでメシ食ってる人いんの?
本業でやってる人はおそらくいない。(研究者除く)
カリーでメシ食ってるのならいる
GHC 6.8.1でコンパイルし直しただけで本当にプログラムが二割高速化してワラタ それから-O2をつけた場合のコンパイル速度が六倍になったけど、これは-fasmがデフォになったおかげだな
お前ら コマンドライン引数から複数のテキストファイル名を取得してその中身を標準出力に出力するプログラム書いてみてくれ IO [String]が…[]外れねぇよチクショウorz
import System.Environment main = do args <- getArgs mapM_ dump args where dump file = do content <- readFile file putStr content こんなの?
そんなの… 俺とてつもなく頭悪い気がしてきた('A`)
>>71 のを短く書けばこんな感じ
import System.Environment
main = getArgs >>= mapM_ ((putStr =<<) . readFile)
>>71 のをArrowで書けばこんな感じ
mapA :: 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みたいに便利な関数は早く標準ライブラリに入れてほしい
>>74 モナドと組み合わせると恐ろしく単純にかけるようになる
main = getArgs >>= mapM_ (readFile >>> putStr)
>>75 Kleisliをつけたり外したりがいらないか?
まあ、>>>の正体は f >>> g = g . f だからなぁ。
arrowベースのIOってないもんかね
Haskellで開発会社をやりたいという夢を持つ自分はタダのバカですか?
実行しようとしない点でバカです。
部下がpoint-free styleで1000行くらいのバグ入りコードを提出 という悪夢を見てしまった
>>83 現在適当な粒度の関数に分解する鶴を開発中です
>>70 素直にλを残した方が分かりやすいわな。
main = getArgs >>= mapM_ (\a -> readFile a >>= putStr)
87 :
79 :2007/11/11(日) 19:39:30
しかし、Haskellなどの関数型言語専門会社っていうのは憧れます。 自分はまだ初心者でチュートリアル勉強している段階ですけど、この世界が 広がったら素晴らしいなぁと本気で思ってますよ。 私の現在の妄想は、最近メジャーになってきたWebサービスの関数型版。 住所 -> GoogleMapAPI -> 天気予報 -> 天気マーク付き地図
バカっつーか、中学生臭い
>>87 それは俗に言う「マッシュアップ」というやつではないか?
関数型言語と関係なくそこら辺の奴でも作れるぞ。
そうだな
ただのマッシュアップだな
masuidriveのブログとか見るといいような気がするよ
そして
>>71-77 ,86の諸氏よありがとう
よく理解できないから明日色々試してみるわ…
Haskell挫折しそう… 書いてて楽なのは分かるんだけど…分かるんだけど…
91 :
79 :2007/11/12(月) 07:08:04
いや、マッシュアップを関数型でやってるのを見たいんだけど。 もうあるの?
プロシンあたりで誰か発表してるかも〜 とか無責任に書いてみる
>>86 そこまで来たらやっぱりこう書きたくなる
main = getArgs >>= mapM_ ((>>= putStr) . readFile)
好みが分かれるもんだな 俺はラムダ抽象が嫌いなのでwhere節を使う
>>94 お前の好みはhaskellには不向きだな。
そうか?俺がHaskell好きな理由の一つがこれなんだが
where節みたいにローカル変数を使った後に定義できる言語は他にはCleanくらいしか知らない
それに嫌いって言っても使うことは結構ある。
>>86 みたいな例なら迷わずwhereを使うってだけで
>>96 関数の内部で関数を定義できる言語はいくらでもある。rubyとか。
それは知ってる。でも関数を「使った後に定義」はできんだろ
使った後に定義ってどういう意味?
>>99 ソースコード上で定義が参照よりも後に現れること
f x = g -- ここでgを使う
where
g = 2 -- ここでgを定義
int main(char args[][]){ owata(); } void owata(){ writefln("\(^o^)/"); }
使った後に定義してるわけじゃないけど、遅延評価が便利って言いたいわけね。
105 :
96 :2007/11/12(月) 21:32:27
>>102 遅延評価はあまり関係ないと思う。あくまでコード上に現れる順序の問題
極端な話、正格な言語で
f x = y where y = 2
が
f x = let y = 2 in y -- このletは正格
の構文糖なだけでも俺には十分
Lisp 系だったらその手の構文糖は作り放題だけどね。 実際、昔 ELisp でそんな感じの macro 自作して使ってたし。
はいはい自慢はいいですよ
108 :
デフォルトの名無しさん :2007/11/13(火) 00:18:43
興ざめするから自慢とか言わないでくれよ…
なら、自己満
初心者です。 今、いろんなテキスト漁って勉強中ですが、モナドのところ見てて不思議に思いました。 これって、早晩知らなくてもHaskellが書けるようになったりするんじゃないのでしょうか。 今はまだ途上なので、透過参照を維持できるように云々と理論的な面が表に強く出て ますけど、近いうちに標準のAPIからは隠蔽されていくということはないですか?
111 :
デフォルトの名無しさん :2007/11/13(火) 19:37:31
それなら良いわ
>>110 歴史的にはどうか知らんが、モナドは参照透過性のために仕方なくあるわけじゃなくて、
道具として積極的に使われてる。だからHaskellでモナドが使えなくなることは考えられない。
モナドを知らなくてもIOを書けると良い、という話なら、現状でもできると思う。
質問です
>>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だけが表示されるんだよね
エロい人なぜだか教えてください
>>110 モナドを使わないと、実用的なHaskellのプログラムは書けない。
モナドの理論的な側面を詳しく知らなくとも、モナドを使うことはできる。
結論:
モナドの理論的な側面は今は無視して、モナドを使ってHaskellのプログラムを書けばよろし。
理論的なことは後から少しずつ覚えていけばよろし。
>>114 だってそれa.txtは標準入力に与えられてるもんよ
c:\Users\aiueo> main c:\a.txt c:\b.txt こーやれ
ちょっとお前ら聞きたいんだけどさ
なんで
>>86 みたく書くんだ?
main = mapM_ (\a -> putStr =<< readFile a) =<< getArgs
でよくね?モナド使わないときとモナド使うときで読む方向違うのってやりにくくね?
なんか理由あんの?おせーておせーて
俺も時々下から順に実行されるdoが欲しくなる
>>113 >>115 ありがとうございます。"モナド"という言い方がよくありませんでした。Maybeとか
リストのモナドは仰るように積極的に使われていると自分も思いました。
ただ、IOモナドがよく分からんのですね。特にIORefとか。この手のものは、単に
透過参照性を維持するためのテクニックと見えてしまいます。
>>123 処理系とそのバージョンは?
Control.Arrowをインポートしたかどうか。
いや、明らかに型が合わんだろ… readFile :: String -> IO String putStr :: String -> IO String (>>>) :: (Arrow a) => a b c -> a c d -> a b d instance Arrow (->)
126 :
125 :2007/11/13(火) 21:49:19
間違えた putStr :: String -> IO () ね
>>121 参照透過性を壊さないでIOを実現するに当たって、現状よりマシなインタフェースがあるってこと?
>>124 無理やりコンパイル通せばこうなるぞ。
main = getArgs >>= mapM_ (readFile >>> (>>= putStr))
Kleisli使うのは俺はパスw
129 :
デフォルトの名無しさん :2007/11/14(水) 01:19:08
2次関数が苦手だったから関数言語なんて滅びてほしい
釣られないぞ
a -> IO b は Kleisli IO a b と同じ構造をもつんだけど、Haskell のnewtypeが違う型として扱ってしまうために、
>>75 のように楽天的にはいかないんですな
だからといって 型シノニムで定義できるわけでもないので、しょうがないんだけど
これでどうよ! main = getArgs >>= mapM_ (readFile >=> putStr)
入門HaskellのP104にあるインスタンス宣言について質問なんですが instance (Eq a) => Eq (Maybe a) where の(Eq a) => はどうして必要なんでしょうか?
>>133 中身が比較できないとMaybeも比較できないじゃん
具体的には、
instance (Eq a) => Eq (Maybe a) where
Nothing == Nothing = True
Just a == Just b = a == b -- このa==bが意味を持つことを保証しないといけない
_ == _ = False
>>134 Maybe aとaを同一視してましたorz
わかりやすい説明ありがとうございました。
do cs <- getContents hoge <- getContents putStr hoge ↑のような式を>>=を使って書き直した場合、どのような式になるのでしょうか?
>>136 getContents >>= \cs ->
getContents >>= putStr
138 :
136 :2007/11/14(水) 20:05:49
すいません do cs <- getContents hoge <- getContents putStr hoge じゃなくて do hoge <- getContents cs <- getContents putStr hoge の間違いでしたorz
>>138 getContents >>= \hoge ->
getContents >>= \cs ->
putStr hoge
このケースでは(>>=)を使う旨みはないね。
この場合、 A. getContentsを2回やってからputStr B. putStr hogeをやるために1個目のgetContentsをやって2個目のは保留 のどっちの動作になるんだっけ。 遅延評価的にはBだよね?
>>140 IO動作は上から順に(厳密には>>=の左辺から右辺へ)実行される
getContentsの動作は特殊で、読み込み自体は文字列が必要とされるまで遅延される
だから、順序としては、
1. 1個目のgetContentsが実行され、ハンドルがセミクローズされる。遅延読みのため即座にリターン
2. 2個目のgetContentsが実行され、ハンドルがセミクローズ状態なので例外発生
で、putStrは実行されない
そういう風な動作になるのか。ちょっと勘違いしてた。Thanks
ここってクロスコンパイルネタはスレ違いですか?
ここしかないだろw
クロスコンパイルの場合、GHC(6.4.xや6.6.x)のMakefileって修正なしで通りますか? 依存関係を無視したり、更新情報を無視したり、 無いファイルを参照したり、必要なターゲットを生成しなかったりと 明らかに修正しなければならない部分が多々あるようですが
私の環境で6.6.1をクロスコンパイルする場合、少なくとも ホスト、ターゲットで共通 ・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という特殊な環境ということもありますが、 普通の環境ではすんなりクロスコンパイルできるのか疑問に思えました
147 :
143 :2007/11/15(木) 00:07:35
ちなみにOpenBSD-makeではなくGNU-makeを使用しています
Ubuntu上のemacs22+ghc6-6.1でHaskellのプログラムを色々試しているんですが C-c, C-lを実行するとよくEmacsが固まってしまって何の入力も受け付けなく なってしまいます。そのたびにkill -KILLをしているんですが 同じような症状の人はいないでしょうか?
debianですが、固まりませんね。
IORefについて質問です。 do ioref <- newIORef 0 modifyIORef ioref (+1) readIORef ioref >>= print という式の中でmodifyIORef ioref (+1)がiorefの値を変更している仕組みが どうしてもわかりません。予想としては ・modifyIORefを使うと引数の値を変更できると言語の根っこの部分で決められている という事かなと思っているんですが、この考えでいいんでしょうか?
>>150 C言語の例でよければ
*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回の初期化時の変更のみということで。
152 :
150 :2007/11/15(木) 08:04:34
>>151 つまりHaskellは、定数だけでなく、変更される変数の値を保存しておくための(つまり再代入可能な)
場所も用意しているということなんでしょうか?
>>152 実装上はその通り。GHCにはヒープ上に変更可能オブジェクトを置くための機構があるし、
多分Hugsも似たようなもの。
一方で、言語について「Haskellは〜用意している」という言い方をするのは誤解がある気がする。
実際、
>>151 の言うように、IORefを使っても(Haskellの普通の)変数の値が変更されることはないし、
言語の根幹に変更を迫るような拡張じゃない。
扱える型を限定すれば、自分で(ファイル入出力を使ったりして)IORefみたいなものを書くこともできる。
154 :
150 :2007/11/15(木) 13:37:19
>>153 よくわかりました。ありがとうございます。
今入門HaskellとふつうのHaskellの二冊を読みながら色々試しているんですが
もうちょっと詳しい説明が欲しいなと思うことがよくあります。
そこでプログラミングPerlのような
・どのようにHaskellでプログラミングするか
・Haskellはどういう理由でこういう風になっているのか
を解説した本が欲しいのですが、テンプレに載っている洋書で↑の内容に
合っている本はないでしょうか?
155 :
143 :2007/11/15(木) 13:54:41
Makefileを読む時間的余裕が無かったのでとりあえず find compiler/stage1 -name ¥*.o -exec rm {} ¥;して make -C compiler boot stage=1 && make -C compiler stage=1したら ビルド&インストールに成功したようです 後でパッケージを作って本インストールするつもりです 日本語のクロスコンパイルのドキュメントが少ないので 作業過程を簡単に書かせていただきたいと思います (需要は無いでしょうけど) うざったいと思われる方は「クロスコンパイル」をNGワードにしてください
>>154 ・どのようにHaskellでプログラミングするか
→『Haskell: The Craft of Functional Programming』
・Haskellはどういう理由でこういう風になっているのか
→『Introduction to Functional Programming Using Haskell』
かなあ。両方とも良い本だと思う。まだ全部読み切ってないけど。
157 :
150 :2007/11/15(木) 21:41:29
>>156 その二冊ですね。お金に余裕ができたら買ってみます。
話は変わるのですがHaskellのガベージコレクションは他の言語(java,ruby...)
と比べて動作する機会がほとんどないと思うんですがどうでしょうか。
変数の宣言時にしか値を入れられなくて、グローバル変数とスタック上に
載せられるローカル変数でほとんど全てが賄えるなら
どこからも参照されていないデータ(ガベージコレクタの対象になるデータ)
ができるなんてことはまずないと思うんですが・・・
>>157 そんなことはない。遅延評価のために何でもかんでもヒープに割り当てないといけないので、
Haskellは平均的な言語よりずっと多くゴミを出す。
GHCでコンパイルしたプログラムなら、+RTS -Sstderrオプションをつけて実行すれば
GCがどれくらい動いたかが分かる。
適当なプログラムで試してみたけど、約3秒の実行時間中にヒープから700MBほど確保し、
そのうち約9割は第0世代のGCで即座に捨てられてた。
具体的に数字出されるとびっくりするなw
160 :
デフォルトの名無しさん :2007/11/15(木) 22:47:23
俺もびっくりしたwww
700MB? 700mBの間違いじゃないのか
700*2^20 bytesね 741,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
やさしい Haskell 入門を今見ているんですが
4.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なんでしょうか?
>>162 これって瞬間最大メモリ使用量が700MBってこと?
うさのパソコンはメモリ256MB!
アプリ側がメモリ確保に成功しても、 OS側で本当に実メモリを消費したとは限らないから 調べないと分からないか。
>>164 アロケートされたメモリの数が700MBってことなのだが、実際はgeneration 0に割り当てられた少ないメモリが使いまわされているだけだから、メモリの使用量自体は少ないはず。
>>164 OSから確保したのが32MB
実際のヒープオブジェクトの総量が瞬間最大で13,955,072 bytes
コピーGCだからOSから確保した領域の半分以下しか貯められない
StateモナドでunsafeInterleaveIO的な関数って書けますか? do xs <- interleaveState $ sequence $ replicate 3 get sequence $ map set xs で get set get set get setの順になるようなやつ
unsafe禁止令
xs <- sequence $ replicate 3 $ interleaveState get の間違いか? どっちにしても無理だろ
モナドと代数的データ型に的を絞って詳しく扱ってるテキストはないでしょうか
foo >>= bar としたときに実際に>>=がどのインスタンスに定義されている>>=の処理を行うのか、 というのはどうやって決まるんでしょうか?
>>174 型推論。fooの型とbarの型とその式の使われ方が勘案される。
>>175 それはコンパイル時と実行時のどちらでされるものなんでしょうか?
・型推論自体はコンパイル時。 ・ただし、型クラスのディスパッチは実行時まで遅延される。 ・ただし、どのインスタンスについてのコードを生成すれば良いか静的に決まる場合は、 最適化の一環としてディスパッチを省略する。 こんな感じか。
179 :
174 :2007/11/17(土) 12:49:35
>>177 、178
なるほど、静的に型をチェックしつつ、動作は動的に決まるんですね。
ところで
数学パズル ものまね鳥をまねる―愉快なパズルと結合子論理の夢の鳥物語
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
この本を読んだことがある人いますか?関数プログラミングの土台の考え方がわかる本らしいんですが。
>>179 途中まで読んだだけだけどコンビネータの話。
S,K,I とか。Yコンビネータも出てきたかは覚えてない。
a 1 = "hoge" a 2 = 2 のような引数によって異なる型の値を返すことはOKなんでしょうか?
2種類の型のどちらかを返したい場合はEitherを使う。 a :: Int -> Either String Int a 1 = Left "hoge" a 2 = Right 2
185 :
182 :2007/11/17(土) 16:51:52
template haskellじゃなくてgeneric haskellだった・・
>>163 今日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)を遅延パターンにする、ってことじゃないかな。
>>163 明日からHaskell始めるつもりのド素人なんだけど、
関数の仮引数xがconstructor pattern(たとえばy:ys)の場合、
それはcase x of y:ys -> ...という形に変換される。
で、caseの条件式はWHNFまで評価されてしまうので、
遅延させたい時には使えない。
188 :
186 :2007/11/17(土) 23:31:58
>>188 あ、なるほどそういうことなのか。
ありがとう。無理して答えた価値あったわ。
189 :
163 :2007/11/17(土) 23:59:14
なんとなく理解できました。ありがとうございます。 Haskellの考え方に慣れるまでまだ時間がかかりそうですorz
sequence :: Monad m => [m a] -> m [a] sequence = foldr mcons (return []) where mcons p q = p >>= \x -> q >>= \y -> return (x:y) ↑のsequenceの定義を見るとfoldrが使われているんですが、それだと sequence [putStr "foo", putStr "bar"] の場合リストの後ろの方、 つまりputStr "bar"の方が先に評価されるのに、実際には fooの方が先に出力されてしまいます。どうして後ろからではなく、先頭から 評価されるんでしょうか?
式の評価順とIOモナドの実行順は別物。
sequence [A, B, C] = A `mcons` (B `mcons` (C `mcons` (return []))) = A >>= (\x -> (B `mcons` (C `mcons` (return []))) >>= \y -> return (x:y)) よってA, B, Cの順にエフェクトが出る。
>>178 Haskell今日始めた人なんだけど
その最適化の一環としてディスパッチが省略された場合ってのは
C++でいうとtemplateによってコード生成された状態と考えていいんですかね
main = putStr "hoge" >>= \x -> putStr "foo" >>= \y -> return x main = putStr "hoge" >>= \x -> putStr "foo" >>= \y -> return y main = putStr "hoge" >>= \x -> putStr "foo" >>= \y -> return "bar" ↑のように最後にreturnさえすればエラーにならずhogefooと出力されるということは、 IOモナドはMaybeモナドやListモナドと違って、最後に何を返すかではなく、 動作をどういう順に行うのかを決めるための仕組みだと考えればいいんでしょうか?
>>193 そんな感じ。
>>194 何を返すかによってmainの型が違う。
上の二例ではIO ()で、最後の例だとIO String。
両方コンパイルが通るのは、mainの型はIO αという形なら何でもよく、
生成されたα型の値は無視されることになってるから。
>>178 実行時にならないとどのインスタンスのコードが実行されるか
静的に決まらない場合ってどんな場合??
>>196 クラスのインスタンス一般に対して書かれた関数は全部そう。例えば、
double :: (Num a) => a -> a
double x = x + x
こんな関数を定義したら、これをコンパイルする時点ではどの(+)を使うべきか決まらない。
198 :
193 :2007/11/18(日) 13:56:54
>>197 その関数doubleに対して具体的に値を入れたときに
コード生成される(静的に生成?)んじゃないんですかね?
頭がC++脳なのでtemplateのことばっかり頭に浮かんでしまうんですがね…
>>198 少なくとも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のような小さい関数はインライン化されるので、ディスパッチが省略される可能性はある。
200 :
196 :2007/11/18(日) 14:27:36
>>199 なるほど、値(この場合Int)に依存してどういうインスタンスのコードが
実行されるかが決定する場合があるってことか
1:2:3:[] -> [1,2,3] ↑がこうなるのはわかるんですが 1:2:3 -> ? とやった場合はどんなデータができるんでしょうか?
202 :
186 :2007/11/18(日) 14:42:10
3はリスト型じゃないからエラーになるんじゃないかな?
あ、名前欄消すの忘れてた……
>>201 (:) :: a -> [a] -> [a]
>>201 やってみりゃいいじゃん。それで挙動に疑問があったらここでもう一度聞いてみな。
206 :
201 :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つになる理由は何故なんでしょうか?
>>206 GHCは型クラス周辺を微妙に拡張してるからそのせいだろう。
Haskell98では(Num [t])という文脈はありえない。
Hugsで :t 1:2 と入れたらエラーが出たし。
ghcはIOの実装も特殊なんだよなー
一応解説。 Haskellでは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]になる。
210 :
201 :2007/11/18(日) 16:16:46
やっと理解できました。ありがとうございます。
なるほど、どこかで instance Num [Int] のようなことが 書かれていないとも限らない、ということですか。
すいません 初歩的な質問でごめんなさい。 main = do cs <- getContents putStr.unlines $ lines cs これはコンパイル通るんですが main = do cs <- getContents putStr.unlines.lines cs これは通りませんでした…これって何故なんですか? てっきりlinesとunlinesというのは対になってるもんだと思ってたんですが…
putStr.unlines.lines $ cs なら通るよ。 関数適用とか演算子の優先順位の問題だね。 f $ g x == f . g $ x /= f . g x
うろ覚えだが関数抽象より関数適用のほうが優先されるので、 「putStr.unlines.lines cs」の部分が putStr.unlines.(lines cs) って解釈されるはず main = do cs <- getContents (putStr.unlines.lines) cs ならたぶん通る
二項演算子の周りにはスペースを入れようぜw
C言語で、関数と括弧の間にスペース空ける人?
いや、そこは詰める
まあ
>>215 をあまり真に受けないでくれ
(.) の周りにはスペースを入れない派なんだが f.g x.h のように関数が引数を持つ場合にやるとなんか微妙
関数合成が関数適用より優先度低いのが許せない。 こう決めた理由はあるの?
Haskellの解説文を読んでいて、どっかで見たことある書き方だなぁと 思ったら、数学の教科書とソックリです。 つまり、Haskellは数学ができる人向けってことでしょうか?
>>213-214 うお、通りました。ありがとうございます。
関数合成と関数適用の優先順位の問題だったんですね。
>>219 関数適用最強の原則を守るためじゃないか?
俺は現状で満足だ。
map (fromMaybe 0 . fst) xs
とか書けるし。
(f.g) x ↑↑うざい括弧
f.g $ xじゃね?
>>224 C言語風には f(g(x))
うざくない?
Stateモナドについて質問なんですが instance 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だけになる) という風になると考えていいんでしょうか?
229 :
227 :2007/11/19(月) 04:04:21
227ですが一応目処が立ちました。
>>228 それで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'
231 :
228 :2007/11/19(月) 10:59:03
うーん、難しい >>=が一つだけならなんとか頭で理解できるんですが>>=が二つ以上ならんでいたり do式で表されていたりすると脳味噌が追い付きませんorz
232 :
143 :2007/11/19(月) 23:12:23
*GHC-6.6.1のクロスコンパイルについて公式ページのwikiに書いてない部分* <ターゲット、ホストに共通> デフォルトサーチパスに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 する必要がある。 続く
233 :
143 :2007/11/19(月) 23:14:33
*GHC-6.6.1のクロスコンパイルについて公式ページのwikiに書いてない部分* 続き <ターゲット> いきなり/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をビルドするのはなかなかうまくいきませんね。
一度評価された式をもう一度評価しようとする場合って、再度最初から評価しなおすんですか? 例えば add x y = x + y という関数があって、一度 add 1 2 という式を評価した後もう一度 add 1 2 を評価しようとするとき、内部では律儀に 1 + 2 を行うんでしょうか?それとも add 1 2 = 3 みたいな式が内部で作られてたりするんでしょうか?
↑の場合は俺も知りたいです 俺が知ってるのは f x a b c = a*x*x + b*x * c という関数に対して f (1+2) 3 4 5 と呼び出した場合に1+2が1度しか評価されないことくらい…
236 :
デフォルトの名無しさん :2007/11/20(火) 10:20:01
>>234 Haskellの規格では規定されてないけど、普通は評価しなおす。
関数を全部メモ化していたら、救いようのないメモリリークが起こるはず。ただし、
map (\x -> x * add 1 2) xs
のようなコードが最適化されて
let _z = add 1 2 in map (\x -> x * _z) xs
になって、add 1 2が一回しか計算されない、という場合はある。
>>234-235 コンパイラのコンパイルオプションによっても動作が違うかな
import System.IO.Unsafe
f n=seq (unsafePerformIO $ putStrLn "hello") n
a=f 1+f 1
main=print a
のようなコードだとGHC6.6.1の場合で最適化なしの場合とありの場合でhelloの表示回数が違ったりする。
238 :
237 :2007/11/20(火) 11:44:46
追記 a=f 1+f 2 でも最適化ありで1回表示、 無しで2回表示でした。
質問なのですが、 ドラキュラとかが眠ってそうな感じの、棺おけ型のベッドというのは市販されているのでしょうか? 冬の暖房の時期に、部屋ごと暖めるのでは効率が悪いので、棺おけの中だけ温度調節できれば コスト安になると思ったのです。 また、フタをつけるので静かですし、明かりもシャットアウトできてよいと思うのです。
ドラキュラとかが眠ってそうな感じの、棺おけ型のベッドというのは市販されているのでしょうか? (計算をデフォルトで遅延させる機能のある、関数型のプログラム言語は市販されているのでしょうか?) 冬の暖房の時期に、部屋ごと暖めるのでは効率が悪いので、 (評価されない可能性のある式を正格に評価するのは効率が悪いので) 棺おけの中だけ温度調節できればコスト安になると思ったのです。 (必要になってから評価できれば計算コストを削減できると思ったのです。) また、フタをつけるので静かですし、明かりもシャットアウトできてよいと思うのです。 (一度評価されればメモ化されるので計算量が少なくなりますし、バグの混入もシャットアウトできてよいと思うのです。) 答え:Haskellは無料で公開されています こうですか!? わかりません!
感動した
質問です GHC6.8.1にはHGL入ってないんですか?
Windowsアプリ作っていて気づいたんだが、 Win32モジュールにはSetLayeredWindowAttributesのラッパは入ってないんだな・・ 自作するしかないんだろうか。
書いてパッチを送るんだ!
>>244 >書いてパッチを送るんだ!
いや、これってwindows2000以降の機能で、Win32モジュールに入れるべきかどうか正直迷うんだよね。
Windows2000以降のラッパをまとめたWin32exモジュールを作ったので公開しました。 ツッコミなどよろしく。
>>245 Windowsに詳しくないので間違ってたら済まんが、2000以降のみの関数も
普通にwin32パッケージに入ってないか?setConsoleCPとかfindFirstChangeNotificationとか。
>>246 どこに置いたかも書けよw
246はPeyton Jonesだ。 場所は、わかるだろ。
関数型言語はマルチコア時代にフィットしているという話を聞いたことがあります。 既存の流行している言語は対応できてないと。 これはどういう理由でしょうか?遅延評価とか、その辺のことを指しているんでしょうか。
知らんけどミュータブルな値があるとスレッドセーフにならないとかそういうへんの話じゃね?
251 :
デフォルトの名無しさん :2007/11/26(月) 23:23:18
MapReduce の「副作用が無ければ無限にスケールする」というのが 一人歩きしてるだけじゃないかな。実際には何をするにも副作用は あるし、MapReduce だって Reduce の作業はスケーラビリティが 殆ど無いか少ない。関数型言語には副作用が無いというのと同じ様な 勘違い。ただ副作用が無い=スケールする部分を奇麗に切り出せる のであれば有用ではある。
ああいう大規模データパラレルとマルチコアはあんまり関係ないじゃん。
>>249 の話は伝聞なんで雲を掴むような話だけど。
253 :
249 :2007/11/27(火) 11:48:13
ありがとうございます。透過参照性がスレッドセーフというのはよく分かります。 遅延評価っていうのは、別に関係ないんでしょうか。何かそっちの話を聞いた ことがあるんです。自分の初心者脳では、正格では無限のリソースを前提に した関数を書けないが、Haskellのような言語だと記述可能、とか思ったのですが、 ちょっと頭悪いですか?w
遅延評価や投機実行をうまく使えば、
CPUコアの利用効率を上げられますが、
それには頭のいいスケジューラが必要なわけで。
例えば、
http://www.fixstars.com/Grid/pukiwiki/index.php?MapReduce にプチ解説があるようなstragglersの問題。
ただ実行順序が規定されてないので、
工夫する余地がまだまだ残されているとは言えると思う。
Erlangのような言語が、あまりpure functionalじゃないとはいえ、
一通りの実績を上げていますし。
また、プログラマがスケジューラに自由を与えるような
プログラミングスタイルを強制されているという見方もあると思う。
F#のスレは毎日更新されてますが、こちらは静かですね・・・ 関数型で今イチバン売れ筋なのはF#なんですかね。
Haskell始めてから3週間目の今の感想。 ・概念的には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として結合されている部分は左から右。 普通の関数は右から左で思考が自然に切り分けられる。
・Monadでポイントフリースタイルをやろうとするとかなりキモくなるよね。 Arrowはまあ基本的にポイントフリーな感じがするし、普通の関数と分けられていいんじゃない? ・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が引数で来たときの名前の付け方とかおもいつかねえけど。 ・そろそろふつける買おうかな……。 ・初心者のくせに身の程をわきまえない長文失礼しました……
>>257 > ・Monadでポイントフリースタイルをやろうとするとかなりキモくなるよね。
もう少し他人のコードを読んでいくと感覚がつかめてくると思いますよ
モナドのリストを返す関数なんてそんなに使うか? しかし「モナドのリスト」って言い方は何か違和感あるな。 [IO]みたいなのを想像してしまう。
俺のポリシーではIOはmain内でしか使わない
>>258 把握。
>>259 ライブラリを見返してるけどそこまではなかったかも……。
初めて見たときに比べればそこまで疲れないし。
やっぱり慣れの問題なんだろうか。『モナドを返す関数』が普通の関数と同じ地位にいるのがイマイチだけど。
引数の数でバージョンがいくつもあったりするのもなんかいただけない。
でもやっぱり慣れれば気にならなくなるんだろうな……。
なんかJavaやったらCのポインタが理解できた時の気持ちを思い出した。(違うか)
モナドなんてステートとIOとリストとMaybe以外はほとんどつかわねーぜ
IORefもつかうか。
a0 -> a1 -> ... -> m bの形の関数を呼ぶのにはmonadic functionという名前が使えるはず。 日本語だと「モナドな関数」か。 俺のコードの大部分はモナドな関数になってるな。 普通の関数より書きにくいから嫌なんだが、変更に強いコードにするために仕方なく。
265 :
デフォルトの名無しさん :2007/12/08(土) 12:05:09
>>265 ポインタ同値をテストする関数eqがあったとすると、
let v = [1,2] in eq v v
はTrue。一方、vを展開して
eq [1,2] [1,2]
とするとFalseになるかもしれない。
参照透過って言うのはそもそも、こういう展開をしても
プログラムの意味が変わらないってことだから、
eqによって参照透過性が破られたと言える。
267 :
265 :2007/12/08(土) 12:37:55
>>266 おー!なるほど。わかりやすい説明ありがとう。
[1,2] が複数箇所に出現する場合、メモリ上に別々に配置されるかもしれないわけですね。
勉強になりました。
『A a』っていう表記が使われる場所によって Aは型構築子、全体は多相型、aはパラメータ Aはデータ構築子、全体はデータ構造、aはその中身 aは型クラスAのインスタンス、何かの型の一部 って変わるのがちょっとわかりにくいね。もうちっとなんとかならんか。
269 :
デフォルトの名無しさん :2007/12/09(日) 21:35:19
Haskell勉強してなくてよくわからないんですが、 乱数生成器をsplitしていくつかにしてseed固定で乱数を作れといわれました。 どう作ればいいんでしょうか? 初歩的な質問だったらすみません。
日本語でおk
無限リストって便利だけど、末尾を正格に要求する関数について型安全じゃないよね。 でも無限リスト型を再定義するとリストに関して作ったすべての関数について委譲関数を作んなきゃいけなくて現実的じゃない。 結局これは妥協するしかないのか?それともなんらかのテクニックで回避できる?
そう言えば、厳密に言うと無限ループでも型安全なんだな でも全域関数でない関数が厄介なことは事実だから、何か呼び名が欲しい
>>275 よくわかんないけど、チューリングの停止問題のこと言ってるの?
>>276 いや、Haskellには失敗し得る関数があるじゃん
例えば、headはリストが空の時例外を飛ばすし、
lengthは無限リストに適用されたら終わらない
一方で、例えばdropみたいに、引数に未定義値が含まれない限り、
あらゆる引数に対してちゃんと値をもどす関数もある
だからこの二つを区別できるように、短い呼び名があれば便利だな、ということ
「型安全」という言葉を使いたくなるけど、これは
>>274 の言う通り誤用だし
>>277 そういう一般的な関数のことを部分関数というんじゃないかね
>>278 全域関数も部分関数の一種だから、とか考えてたけどカジュアルに使う分には問題ないか
グダグダですまん
280 :
271 :2007/12/11(火) 19:46:50
いや、同じ構造のデータ型でも、 型システムで『無限リストかそうでないか』をカッキリ分けられたら、 そっちのほうが型安全にならないかな?と思って271を書いたんだけど。 たとえば幽霊型とか使ってそういうのが解決できないかとか思ったんだけど、 それじゃ現行の関数を活かせないし、あんまり意味ないなあ、と。
281 :
デフォルトの名無しさん :2007/12/12(水) 01:00:18
>>280 言いたいのは、型システムを使って、
無限リストのフロー解析をして、
プログラムの停止性、正当性などを知ることができないかってこと?
それならリストの有限性の抽象解釈をやるってことになると思うけれど。
282 :
271 :2007/12/12(水) 01:16:01
>>281 違う。返り値が無限リストの関数で、その関数の型を明示しておけば、
無限リストに対して使ってはいけない関数の引数にした時に型エラーになるようにしたい。
まあ無理っぽいのでもう諦めてるけどな。
※起こりえる全てのリストのうちどれが有限リストかを確かめることは 無限に長いリストに対して演算を行うことと同じ ってだれかが言ってた
だから誰も自動チェックしてくれって言ってるわけじゃないじゃない…… 静的に型推論してくれるんだから、 enumFromにInt a => a -> [a] Inf って書けるとして lengthに[a] Ltd -> Int みたいに指定したらコンパイルエラーになって欲しいとかそういう問題だって。無理だけど。
enumFromよりrepeatのほうが良かったな(repeat :: a -> [a] Inf) あとコンパイルエラーになって欲しいのは『length.repeat x』みたいな文脈な。
strictな言語なら、force/delayみたいに陽に指定するんだろうから、
>>281 の言うような方法も効果を挙げるだろうが、
lazyな言語だと、リストを生成する全ての関数が、
無限リストを返す可能性があるので
>>276 でFAだが。
[1..]が無限リストであることも、解析が必要になるし。
うまくできるケースもあるが、希少すぎる。
言葉の使い方間違ってるよな。
なんというか残念賞な言語だな。 関数言語としてのおいしいところは全てC#3.0に持っていかれてしまった。
それはギャグのつもりでいっているのか
293 :
Wadler :2007/12/12(水) 22:26:38
Haskell初心者です。 a->[a]という(型の)monad(仮にDとしましょう)をつりたくて困っています。 どなたか教えてください。 とくにDのmapFにあたる関数も教えていただけれありがたいです。
とりあえず、日本語でおkと言ってほしいのですか?
296 :
デフォルトの名無しさん :2007/12/12(水) 23:13:50
よくわからんが data D a = mkD (a -> [a]) instance Monad D where ... ってことか? あとmapFってなんだ?fmap?
>>297 mkDはなぜ先頭が大文字になってないんだ?
受理されないだろ。
なんなんだ? 近頃Haskellerの質の低下が激しすぎるぞ
昔からです
302 :
デフォルトの名無しさん :2007/12/13(木) 02:20:10
割と玉石混淆なイメージだね
暇つぶしで弄ってる学生がここで暇を潰しているイメージ
なんにしてもHaskellerが増えるのは喜ばしいことだ
rubyみたいになるぐらいなら少なくてもいい
少数精鋭投入ならこれでいいだろうけど 大人数投入用にコードもデータもブラックボックスにできる仕組み(命令型のオブジェクト指向同等?)誰か作らないのかな
大人数投入っていまどき流行らないよ 人海戦術でプログラミングする時代は終わった
>>308 ブラックボックス化ってどんなの?
カプセル化なら標準のモジュールシステムがあるけど
>>308 そんなにオブジェクト指向がやりたいなら
つ O'Haskell
でも、そもそもオブジェクト指向は型理論に包含されるものだから・・・
デバドラ屋と少数のhaskellerがいればたいていのプロジェクトは成功する ・・・夢を見た
>>308 そもそもhaskellにはオブジェクト指向は不要なんですよ。
というのも、関数の再利用できる範囲がCやらjavaやらとは桁違いに大きいのが特徴だからです。
315 :
デフォルトの名無しさん :2007/12/13(木) 21:20:25
Haskellでモジュールつかってカプセル化してコード書いている人あまりいないような気がするんだけど気のせいかな。
なにを根拠に?
>>315 そもそもhaskellを使って実用アプリを公開してる人があんまりいないんだから
仕方ないだろ。
Haskellって関数型言語の勉強用じゃないの?
それだけのための言語だとどうして思うのですか?
GHC 6.8.2が出てるね。 GHCiの機能追加がメインっぽい。
HaskellはOOじゃなくて、 generic programing指向だからなあ。 Genericsの世界では最強認定を受けてる。
OfficeがHaskellで書きなおされるまで俺はその有用性を認めない。
スケーリングのための言語じゃないんだよな 工場制手工業ならOOであることやポピュラリティ(みんなが使ってること)は必須だ。
別に必須じゃないし。 今流行ってること取り入れたってどうせちぐはぐになるだけ。
っていうかさ、人海戦術の奴隷商売に慣れすぎていて、理性的な考え方を失ったお猿さんですか?
ポピュラリティが必須というのは分かるけど、OOが必須というのはおかしくね? OOは一手法に過ぎないんだから、もっと良いものが知られればそっちが使われるようになるだろ
OOは現時点でのポピュラリティの1つって事ならわからなくもないけど、 わざわざ分けて必須って言うほどのものではないな。
つーか、OOはstableなlibrary構築にはいいんだけど、 意外とreusabilityが悪いから、 generic programmingが注目されているのが現状です。 Haskellのtype classとかC++のconceptみたいなやつ。 C++はtemplate/traitsでやってましたが、ちょっと非力なので、 Haskellのtype classそっくりの"concept"が入る事になりました。
実際これはOOと比べてどうなんだとか思ってたんだけど 実際使ってみたら意外とオブジェクト指向のメリット包含しててSUGEEとか思った
331 :
328 :2007/12/14(金) 15:35:51
日本語ですよ?
決して英語が読めないわけではないが、 不自然だ 読みにくい 目が痛い
理論はそのとおりなんだが、残念だがそんな理論を理解出来る人間は少数派なんだよ。 共産主義みたいなもん。高尚な理屈よりも明日パンが、今日のバグを潰せるかが問題なわけだ。 いいじゃない。Haskellは芸術的な小物を個人で作るのに向いてるってことで。
>>333 多数のバカよりも少数の優秀な人間でプログラミングしたほうが安く早くできます。
335 :
328 :2007/12/14(金) 17:08:28
>>335 不自然だ
読みにくい
目が痛い
お前は日本語文書の常識を勉強したほうがよさそうだな
どっちにしろ、今みたいに人気がなくて、そのせいでライブラリも 周辺環境も整っていない状況だと、小物を個人で作るのすら満足にできん。
wxhaskellが使いやすい が、6.8系用が出てない・・6.6系は非公式
いまだと.NETやJavaVMに乗せちゃえばライブラリ不足は一挙に解決だな。
>>339 普通にdarcs版をビルドできないか?
conceptの導入をもってHaskellはC++のサブセットになります つまりこれで全ての言語がC++のサブセットになるというわけです
本日をもってHaskellはウジ虫を卒業する 本日からHaskellはC++のサブセットである 兄弟の絆に結ばれる Haskellのくたばるその日まで どこにいようとC++は貴様らの兄弟だ 多くはベトナムへ向かう ある者は二度と戻らない だが肝に銘じておけ C++は死ぬ 死ぬために我々は存在する だがC++は永遠である つまり―――Haskellも永遠である!
初心者質問です。 test = flip fun1 . fun2 の場合、 1. test = flip (fun1 . fun2) 2. test = flip (fun1) . fun2 どっちの意味なんでしょうか。(.)が使用されている場合、flipが対象とする 関数がどこまでかかるか分かんなくなってしまいました。
(.)よりも関数適用のほうが優先度が高いから答えは一応 2.なんだけど、 括弧の付け方としては (flip fun1) . fun2 のほうが正しい。
347 :
345 :2007/12/15(土) 14:13:25
>>346 ありがとうございます。合成関数全体にかかるのかと思ってました。
もう少しいいでしょうか。
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されるところが理解できません。
(flip zipWith [0..] . ((,) .) . flip (,)) 0 から始める。まずこの式は(A . B . C) 0という形だからA (B $ C 0)に直せて、 flip zipWith [0..] ( ((,) .) $ flip (,) 0 ) これはflip A B Cという形だからA C Bと書き換えられて、 zipWith ( ((,) .) $ flip (,) 0) [0..]
349 :
345 :2007/12/15(土) 15:29:30
>>348 ありがとうございます。しかし、まだちょっと理解できませんw
1.第一引数"0"の部分適応を行う
2.flip する
の順番の根拠がよく分かりません。
(flip zipWith [0..] . ((,) .) . flip (,)) 0 "abc"
の第二引数が最後に適応されるのは何故でしょうか。
あと、これは変な質問なんですけど、
(flip zipWith [0..] . ((,) .) . flip (,)) 0 "abc"
の形を慣れた方は直接記述できちゃうんでしょうか。それとも、
zipWith ( ((,) .) $ flip (,) 0) [0..] "abc"
の形から変形させていく形でプログラム書いていくんでしょうか。
>>349 Haskellでは基本的にどんな順番で簡約しても結果は同じだから、分かりやすい順序でやっただけ。
もっと実装に即した順序でやることもできるけど、面倒なだけな気がする。
>の形を慣れた方は直接記述できちゃうんでしょうか。
俺はできない。読むのも二分くらい掛かった。
あ、でもそのnobsunという人は日常的にそういうコードを書いてるみたいだから、 たぶんすらすら書けるんだろう。
俺思うんだけどさ、デザインパターン中毒みたいにポイントフリー中毒ってあるんじゃないかなあ。 そーいうのって可読性犠牲にしてまでやるものなのか?
>>350 > Haskellでは基本的にどんな順番で簡約しても結果は同じだから、分かりやすい順序でやっただけ。
(flip zipWith [0..] . ((,) .) . flip (,)) 0 "abc"
自分がどうも腑に落ちないのは、どうして
zipWith ( ((,) .) $ flip (,) 0 "abc") [0..]
こうじゃないんだろう?ってとこなんですね。もちろん、こういう解釈だとダメなんですけど、
引数一つだけ取って、ある関数を返してから、次に行くってのがルールだったりするのかな、
と思ったのですが。
> 俺はできない。読むのも二分くらい掛かった。
そうですかw。いや、直感的に書ける人って凄いなぁって思ったんですが、なかなか
そういう人はいないんでしょうかね。
>>352 デザインパターン中毒はどうか知らんが、この書きかたには
記述が簡潔になるという利点があるんだから、別にいいんじゃないかと思う。
>>353 Haskellの関数は常に一引数関数で、多引数関数は
カリー化でエミュレートされているだけだということを思い出すべし。
(.)も両辺を一引数関数として合成するから、
(f . g) a b
と
f (g a b)
は等しくない。
些細なことだけど > (f . g) a b この括弧なんとかならないかな
>>354 > Haskellの関数は常に一引数関数で、多引数関数は
> カリー化でエミュレートされているだけだということを思い出すべし。
そうでしたw。
いやぁ、ありがとうございます。スッキリしました。
>>357 >>219 とは趣旨が違う
> (f . g) a b
この括弧はうっとうしいなぁと言ってるだけなんだよ。
$みたいに括弧省略したい
俺はその格好が好きだ
360 :
デフォルトの名無しさん :2007/12/15(土) 17:31:40
ML でも (foo o bar o baz o foobar) quux みたいに書くね
GHC 6.8.2 Windows版で、コンソールのコードページが英語のになるバグがようやく直ったな。
Parallel Haskellの拡張されてる点ってどんなとこ?
WindowsでGHCなんか使うやつはバカです
同感
windowsではGHC以外に何が一番いいの?
>>365 (疎結合の)クラスタ範囲にまで並列化する
(普通のマルチコア・マルチCPU(どっちも共有メモリ)範囲の(半)自動並列化ならGHC本体だけでもできる)
そんなハード持ってなければどっちみち関係ない
371 :
デフォルトの名無しさん :2007/12/17(月) 22:55:51
____ / \ / ─ ─\ 今年もあと一ヶ月だお・・・ / (●) (●) \ | (__人__) | ________ \  ̄ ./ .| | | ノ \ | | | /´ | | | | l | | | ヽ -一ー_~、⌒)^),-、 | |_________| ヽ ____,ノγ⌒ヽ)ニニ- ̄ | | | / ̄ ̄ ̄\ / ─ ─ \ / (●) (●) \. 俺はこの一年間何をしていたんだろう | (__人__) | 2chで浪費した莫大な時間を何か有意義なことに使っていたら・・・ \ ` ⌒´ / / \
このスレは相当に有意義だと思うんだけどな。 つうか基本的に専門スレしか見ない人も多いと思うんだが。 今年も大変勉強になりました。
いまさらだが、
>>96 JavaScriptでもできるな
(>>=´∀`)
そこで具体的な事じゃなく漠然と「有意義な事」って言葉しか出ないなら 2ちゃんやらなくても結果は一緒だったと思うんだよ
日頃から頑迷そうな意見乙
哲板から転載 読んだ人いる? 圏論による論理学 高階論理とトポス 清水 義夫 ISBN978-4-13-012057-9, 発売日:2007年12月中旬, 判型:A5, 232頁 内容紹介 20世紀後半,数学,計算機科学,論理学などの分野で採用されてきている圏論. 関数概念を基本として現象をとらえようというこの方法を, 関数型高階論理とトポスを題材にして丁寧に解説する. 論理学の観点を中心に,圏論の考え方を紹介するテキスト. 主要目次 序 第1章 関数型高階論理 第2章 トポス 第3章 トポスの基本定理 第4章 プルバック関手f *の右-随伴関与Πf 第5章 リミット、空間性トポス、限定記号 結び 付録1 A∧( ) ┤A⊃( )のイメージ的理解 付録2 各章の課題 主な記号一覧/索引
>>377 立ち読みしたが、俺らには全く関係ないよ
●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●● ●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●● ●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●● ●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●● ●●●●●●●●●●●●●●●●不合格●●●●●●●●●●●●●●●●● ●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●● ●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●● ●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●● ●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●● ●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●● これを見た人は確実に【不合格】です。これをコピペでどこかに1回貼れば回避できます。 これは本当です。やらないと一年無駄になります. 私も最初は嘘だと思ったんですが、一応コピペしました。それで第一志望に合格出来ました。 けどコピペしなかった友達がA判定とっていたのに、おちたんです。(慶応合格h.sさん) 俺はもうE判定で記念受験だったんだけど、コピペを10回くらいした途端に過去問が スラスラ解けるようになって、なんと念願の開成に受かりました。(開成合格r.kくん) これを今年の試験前に見てシカトしたら、入試でミスって最悪です。(n.aさん)
tasukete
>>378 関係ないことないだろ。
Haskellの型システムを理論的に理解する時など。
しみろん、懐かしいな…
すげー久しぶりに しみろん 見た…
liftM と fmap が一致しない場合ってあるの?
>383-384 東大OB乙
二ヶ月ほど前に撮った写真です
場所はバトルロワイヤルの撮影地にもなった
軍艦島での一枚です。
http://www.uploda.net/cgi/uploader1/index.php?file_id=0000278909.bmp 撮影し現像した物を
心霊写真がないかな〜っと面白半分で探していると
偶然にも一枚だけ物凄い写真が在りました
最初に見えたのは右下の子供の様な顔です
左にはボーっと立ち尽くし
こっちを見ている子供がうっすらと写っています
上部には青白い叫び顔があります
それだけではありません
探せば探すほど気持ち悪い顔があるのです
私は現在で約30ほどの顔を見つけました、全てこっちを見ています
探せば探すほどあまりにも出てくるので
気持ち悪くなり頭が痛くなりました
この写真ですが、ある友人に貸した所
夜に1時間程笑い声の様なものが聞こえてかなり
怖かったらしいです・・・
霊感がある方はぜひ鑑定をお願い致します。
因みに、スキャナーで高画質でスキャンした上で
見易いように画質調整をしています
ですのでファイルサイズが9MBにもなります・・・
ワロタ
390 :
デフォルトの名無しさん :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 と書けると思うんですが ポイントフリースタイルとなった最後の定義式を見て 理解しやすくなったとは思えないのです。 積極的に使うべきなのでしょうか。
わかりやすいほうでいいんじゃない? ごちゃごちゃしてるのがいやならポイントフリーで。
なんでもポイントフリーにするのは難読化への道を歩んでしまいかねん。 とりあえず二つ目のfirstNLines nみたいに普通に使ううちは 型を明示してれば分かりにくくなることも無いけど、 度を過ぎた奴はコードの修正とかも考えると扱いにくいわ読みにくいわでいろいろと面倒だし、 ポイントフリースタイルが時にはポイントレス(要領の悪い)スタイルといわれることもある ってHaskellWikiに書いてた 俺もflipとかドットとか使いまくったコードを読むのは嫌い。 でも書いてる奴からするとパズルみたいで楽しいんだろうなあ、とか。
393 :
389 :2007/12/31(月) 19:29:48
ポイントレススタイル・・・。 書くときは頭の体操になるかもしれませんが 読む方からすると大変ですよね。
ポイントフリースタイルにすると点 . がどんどん増えてぜんぜんポイントフリーじゃないよ(笑
map ($ 3) [(+1),((-)2),(/3),(*4)] とか書くと単純なことなのになんか愉快だよね、たしかに
なんだその記号だらけの読みにくい奇怪なコードは
あけましておめでとうございます。 今年は Haskeller になれるように頑張りまふ(`・ω・´)!!
俺もだ! 今年こそはHaskellマスターになる
399 :
デフォルトの名無しさん :2008/01/01(火) 11:08:26
400 :
デフォルトの名無しさん :2008/01/01(火) 17:35:39
>>394 ポイントって確か関数合成演算子じゃなくて「値」のことだったかと
まあそれを踏まえて言ってるのかもしれないけど
モナド難しいよ。 みんなエディタは何使ってる? Emacs が多いのかな。
現状まともにプログラミングできる環境がemacsしかない eclipseは使いづらいし、xyzzyのhaskell-modeはバグだらけだしwindowsでしか動かないし。
>>402 モナドなんてHaskellではただのデータ型なんだから、別に難しいことなんかないよ。
>>403 vim にもあるでしょ?俺は vim 使ってるよ
俺は、viはほとんど使えないんだ。 設定ファイルをちょこっと編集するぐらいなら使うが、深い使い方は覚えてない。
darcs2って今までのdarcsとどう違うの haskellの組み込み言語atomを詳しくおしえて
関数型初心者です。 今、SICPを少しずつ読んでるのですが、set!のようなものをHaskellがモナド化するのは 単に純粋であることに拘るからでしょうか。IORefみたいなものがset!に当たるかと思います が、副作用アリだぞ、ということを意識させる以上のメリットとかがよく分かりません。
>>409 プログラマに直接メリットはない。
メリットは最適化コンパイラを作るのが楽になること。
関数型言語をやる人の多くは、学生も含め研究者です。 研究テーマはプログラミング言語の中でも、 意味論やプログラム解析などが多く、 そういう研究では参照の透明性が非常に有益な性質です。 たとえば、Javaで盛んに研究されているエスケープ解析も、 初期の成果では、関数型言語で行われたものが多いです。 また参照の透明性を保つことは、実務プログラマにとっても大変有益で、 プログラムの簡明さを保つことにつながります。 良く理解すれば、他の言語でも使える一つの方法論を得たことになります。
C99のコンパイラ作ってくれ。
インタープリタで頼む。CなのにGCがオプションであったりとか。
CINTがあるじゃないか 現状どうなってるか全く知らないけど
>>410-411 そんな小難しい話しなくても、評価順の決まっていない言語で副作用を使うのが
どれだけ厄介か考えれば済むことじゃないか?
>>409 確かに純粋であることに拘っているからという点は大きい。
しかし、それだけではなく、例えば、
Haskellではリストを使ったプログラムを書いている途中でそれを非決定性計算と
みなしてプログラムの一部を書くとか、IOに限らずモナドを気軽に使う人もいる。
そのためモナド一般を扱う便利関数(mapMとかモナド変換子とか)が多く用意されている。
IOがモナドになっているとそういった便利関数が使えるので便利。
また、モナドになっていると読みやすさのためにコードをまとめたり
移動させたりといった操作が気軽にできる。
例えば副作用のある言語で
f x = x + y + (副作用のある式)
where
y = (副作用のある式)
とかやるとどの順番で副作用が現れるかとか、yはどのタイミングで
何回評価されるのかわからない。
Haskellであればそのような問題はないので気軽にwhereにコードを
まとめたりできる。
417 :
409 :2008/01/12(土) 11:02:27
皆さん、ご回答ありがとうございます。
>>415 そうなんですが、モナドはdo記法が可能で、これは実質手続き型の
記述ですよね。手続き型の記述が関数型言語内で可能だから、IOが
モナドになっていると思うのです。
>>416 モナド自体は演算のリレーということで分かるんですが、副作用の発生
する式をそうする理由は、上に書いたように、単に順番が保証されるのが
モナドである、という以上の理由は無い気がします。
どちらかというと、
>>410 さんの書いていることがメインなのでしょうかね。
モナドのおかげで、 CやSchemeよりコンパイラの最適化がより進むって事はないんで、 そこのところは誤解しないように。 参照の透明性から、プログラム変換しやすくなるので、 コンパイラの研究がやりやすいってだけ。
>>417 >単に順番が保証されるのがモナドである
違う。遅延処理ではg . f(x)でf → gと簡約されるかどうかがわからないのと同じように
¥x -> mf >>= mg でmf → mgと簡約されるかどうかはわからない。
モナド自体には「計算のリレー」の意味はあるけど「順番に実行する」意味はない。
IOモナドみたいな奴は、計算のリレーが示すその一連のIOアクションがmainに渡されたときに
(遅延しないHaskell処理系が)順番に実行することで「順次実行」を実現している。
IOがモナドになっているのは「計算がリレーの形になっている」ことを保障させるためだけ。
UnsafeInterleaveIOはIOモナドから出してすぐ入れるだけの処理だけどIOアクションが遅延するようになる。
これは計算のリレーを途中で切断したからその部分だけ順次実行できなくなったんだね。
これを使ってる関数にはgetContentsやinterleaveとかがある。
前に読んだことがある論文で、 HaskellのIOの実装に関する論文なんだが、 タイトルを忘れてしまった。 それらしい論文のタイトルを挙げてくれませんか?
423 :
421 :2008/01/12(土) 18:09:21
うぉー、一発的中! ご褒美に最近読んで面白かったHaskell論文のタイトルくれ
2組のタプルの値を交換する関数って 標準でありますか? exTuple (x,y) = (y,x) みたいな感じの。無いならいいんですが・・・。
無いと思う。強いて言えばuncurry (flip (,))だけど。
なるほど uncurry ですか。 flip (,) までは考えてたんですが ありがとうございます。
428 :
デフォルトの名無しさん :2008/01/14(月) 15:15:28
十進数 (e.g. [1,2]) を二進数 (e.g. [1,1,0,0]) に変換するプログラムを, foldl を用いて書け,という問題を連休中ずっと考えてるんですが, 脳味噌が手続き型で凝り固まっていてさっぱりわかりません. どうやって書くのか教えて頂けませんか.
429 :
デフォルトの名無しさん :2008/01/14(月) 15:19:02
手続き的になら書けるの?
教科書的に書こうとしてみたが、こんなんでいいか? import 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
>>430 教科書的なら一発でできる方法があるはずだ
433 :
デフォルトの名無しさん :2008/01/14(月) 20:36:34
ghc6.6のころはSystem.Console.Readlineってデフォルトではいってましたよね? 当方Windowsなんですが、 久しぶりにHaskellやろうと思って6.8.2をインストールしたんだけどSystem.Console.Readlineがない・・ 一年くらい前につくったインタプリタがビルドできないっす;; にわかなのでライブラリインストールもままならないのですが、cabal-installってWindowsでも使えますでしょうか?
n進数→十進数をfoldlでやるならわかるけど その逆は思いつかんなあ
435 :
デフォルトの名無しさん :2008/01/14(月) 22:12:17
重すぎて使い物にならないけどな
>>433 Haskellプログラム書くならHaskell98に準拠しないと互換性なくなるぜ?
>>430 428 では無いんだが
Just (mod x n, div x n)
ここって modDiv 使った方が速いのか?
そうすると
>>425 みたいなのを使うべき?
modDiv -> divMod だった。ごめん。
>>439 divMod 使う方が速いんじゃないかな。
かといって
>>425 は読みにくいから
Just (r,q) where (q,r) = divMod x n
でいいんじゃない。
なるほど、サンクス。
数が小さいと分かっている時: (なおかつ実行効率が必要なら) modとdivの計算コストは小さいから、 タプルを消費しないように書いた方がいい。
444 :
430 :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のコストが大きいな
無知でスマソ 末尾再帰ってことは $! を使ってるってこと? 良ければソースを見せて貰えませんか。
>>445 なぜか$!に慣れないので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)
今気付いたけど、toBaseN_loopのdivは片方modじゃないといかんな
そういうわけで
>>444 の結果は間違ってる
たかだか有限時間で終わる処理について実行効率など考える必要はない
神様キター!
>>448 人間が不快に感じるかどうかなんて些細な問題だよな
だったら数学やっててくれ。
>>448 512ビットの素因数分解だって有限時間でできますよ。
この宇宙は有限時間で終わりますか?
どなたか State モナドの使い方を 教えて貰えませんか?
使いどころが知りたいのか書きかたが知りたいのか
>>455 例が腐るほどWEB上にあるだろ
検索してみろよ
使いどころです。
>>458 入門書に載ってた例だけど、
・文字列を要素とする二分木が与えられたとき、その要素を整数に置換した木を得たい。
ただし同じ文字列は同じ整数に対応させること。例えば、
460 :
459 :2008/01/19(土) 19:40:19
途中送信御免 例えば、 (("hoge") "hage" (("fuga") "hage" ("fuga"))) という木なら ((0) 1 ((2) 1 (2))) にする。 手続き型言語なら、実行した置換を記録しながら木を左から走査していけば良いわけだが、 Stateモナドを使えばHaskellでも同様に書ける。逆にStateモナドを使わずに写像を引き回すのは面倒。
広範囲で変数を持ちまわるのに 普通の言語ではグローバル変数とかインスタンス変数に書き込んだりするけど、 そんなどこで変更されるかわからないようなアブナイことしなくても (a,s) -> (b,s)の形で持ちまわればいいよね、ってのがStateモナドなんだから、 普通は変数を使う処理を考えればおのずから例はでてくるんじゃないか?
>>461 「普通は変数を使う処理」の大部分はHaskellでStateモナドを使わずに綺麗に書ける。
だから混乱するんだと思うが。
(("nukege") "usuge" (("fuga") "usuge" ("fuga")))
オセロとか将棋とかの盤面のデータ構造についていつも迷うんだが、 いったいどういうデータ構造にするのが一番効率がいいのかね 2次元リストとか、Mapとか、いろいろあると思うが・・・
>>466 よく使われるのは1次元配列とbit board
ByteStringでのParsec実装が欲しいっす。
そういえばParsecがどうやって実装されてるか知らない ソース見てみたけど何か難しそうだ
普通にモナドじゃないの?
471 :
デフォルトの名無しさん :2008/01/29(火) 13:51:05
log4*的なロガーライブラリってないでしょうか?
>>472 おお!ありがとうございます。
試してみます
質問です。 C言語で int hoge(void) { int x,i; for(x=0, i=0; i<100000; i++) { x=x+i; } return x; } をHaskellで書く場合は再帰で書くほうが良いのか、foldlで書くほうが良いのか分かりません。 他にも書き方があるかもしれませんが、一番メジャーなループの書き方を教えてください。
まるで最低一種類は自力で書けるかのような言い方だな
どんな場合にも一番いい方法が存在するかのような言い方だな
>>474 俺は、再帰でない書き方をすぐに思い付かなかったときだけ再帰を使ってる
その例なら迷わずsum [0..100000]だな
478 :
474 :2008/01/30(水) 16:19:09
>>477 ありがとうございます。
その場合、リストはどのように処理されるのでしょう?
つまり、1000番目の要素を足しているときに、999番以下の要素はもはや必要ないわけですけれど、
sum関数が終了するまでメモリに記憶されているのでしょうか?
>>478 どこからも参照されていないから、いつでもGCされうる状態
実際にメモリ上に残っているかどうかはGCのタイミング次第
480 :
474 :2008/01/30(水) 16:34:17
>>479 ありがとうございます。
では逆に1000番目の要素を足しているときに、1001番目の要素はすでに生成されているのでしょうか?
足す直前に生成されるのでしょうか?
>>480 > 1001番目の要素
とはどういうものを意識してる?具体的にkwsk
>>480 処理系と最適化オプションに依る
素朴な遅延評価だと前者
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の蓄積引数が積極評価されるので後者になる
483 :
482 :2008/01/30(水) 17:08:24
分りにくい気がしたので補足 どっちの評価順でも、リスト生成は遅延される ただし、素朴に遅延評価をやると足し算まで遅延するので、結果としてリストを走査し終わるまで足し算を開始できない GHCの最適化は足し算を遅延させないようにするもの
484 :
474 :2008/01/30(水) 17:08:53
>>482 ありがとうございます。
とても参考になりました。
質問です。
http://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を使わないコンパイル方法はないものでしょうか?
487 :
486 :2008/01/30(水) 18:29:59
前者の問題は過去スレを検索して解決できました。 コンパイルオプションに-optl-mwindowsをつければよいのですね。 早とちりしてすみません。 後者の方はまだ解決していません。
488 :
486 :2008/01/30(水) 19:01:48
489 :
デフォルトの名無しさん :2008/01/31(木) 12:20:45
GHC6.8.2(Win)でbytestring-0.9.0.4をつかって -profフラグ付でコンパイルしようとすると Perhaps you haven't installed the profiling libraries for package bytestring-0.9.0.4? と出て失敗してしまいます。(profフラグをつけなければ成功します) 対処方ご存知の方いらっしゃいますか? つか、ByteStringに変更してさらに遅くなった俺涙目
>>488 その--overlay=stripはupxのオプションだろ
>>489 そのbytestringパッケージはどうやってインストールした?
cabalなら、configureのときに-pオプションを付けないとプロファイル版ライブラリがインストールされない
質問です。 windows上でファイルのアンロックを明示的に行うにはどうすればよいのでしょうか? ロックがかかったままのファイルに書き込みする必要があるのです。
492 :
489 :2008/02/01(金) 12:44:40
>>490 なるほど、ありがとうございます。
-p付でインストールしなおしてみます。
493 :
デフォルトの名無しさん :2008/02/03(日) 17:41:55
% cat hello.hs main = putStrLn "こんにちは、世界!" % ghc hello.hs -o hello % ./hello ...... ←[ここは文字化け] UTF-8でソースを書いて、コンパイル&実行したのですが、 文字化けします。 ver6.6.1(Ubuntu7.10のバイナリパッケージを使用)なのですが、 UTF-8は使えないのでしょうか? コンパイルオプションが必要ですか?
495 :
492 :2008/02/03(日) 18:44:28
>>493 どうもありがとうございます。
調べてみます。
>>469 ふつケルの終わりのほうに超簡易Parsec実装の解説がある。
497 :
デフォルトの名無しさん :2008/02/05(火) 12:00:00
do記法がどのように(>>=)変換されているのかがよくわからないです。 たとえば do { a <- return 1; Just 2 } は return 1 >>= (\a -> Just2) なのはぎりぎりわかったような感じですが 3つ以上 do { a <- return 1; Just 2; return a } だとどうなるのでしょうか?
仕様を読めれば仕様を読むのが一番早い
>>497 最初の一つだけ変換する
return 1 >>= (\a -> do Just 2; return a)
残ったdoも同じ規則で変換すれば良い。最終的には、
return 1 >>= \a -> Just 2 >> return a
500 :
497 :2008/02/05(火) 12:31:43
>>500 do { a <- return 1
; Just 2
}
って書くとemacsで見た目きれいにレイアウトできる。
>>=を使った場合、
return 1 >>= \a ->
Just 2
って書くときれいにレイアウトできる。
単に見た目の話だけど^^;;
Haskell でも型のキャスト出来るんかね リファレンス見てたらそれっぽいのが・・・。
>>503 キャスト自体は無いから、いちいち関数を使う
数値型の変換ならfromIntegralとかfloorとか
ポインタの変換ならcastPtr
ダウンキャストみたいに、実行時のデータから型情報を復元するのはData.Typeable.cast
>>503 の構文は、型推論の補助として型を指定してるだけで、変換してるわけじゃない
ダウンキャストに相当するのがあるのか。
unsafeCoerceはどうよ?
>>506 忘れてた
変換前と変換後の型の内部表現が同じであることを前提として、問答無用で型を変換するのが
unsafeCoerce :: a -> b
Data.Typeableのキャストはこれをラップして安全にしたもの
ふつうのHaskell読み終えて、WikiBookとか眺めてるんですけど、ある程度まとまった Haskellプログラムの実例が載ってる本というと、Craftになりますか? ちょっと高価な本なので、買おうか迷ってます。
Kleisliってなんて読むの?
クライスリーじゃないの?
クレイスリ に一致するページは見つかりませんでした。
クライスリーだって該当する記述が2chしかないじゃないかよ。
とりあえずドイツ語っぽい綴りを ドイツ語の規則に従って読んでる点で クライスリーの方が信憑性はある
TeXをテックと読むのはおかしいですか Linuxをライナックスと読むのはおかしいですか
おかしい
↑でもそういう風に読んでる人結構いるよ
大団円を大円団と勘違いしている人は それはそれで正しいと申すか
俺、小さいころミートボールとゲートボールの違いが分からなかった
>>516 これは米語読みだから、
金日正を「きんにっせい」と読むようなもの。
特に問題ない。
英語っぽっくウィヌックスで
クライスリーでおk?
別に何でもOK
数学板で聞いてみたら?
エルアイエヌユーエックスって読んでた・・・
527 :
デフォルトの名無しさん :2008/02/15(金) 22:28:35
>>527 Haskellコミュニティを大事にする積もりがあるなら、間違ってると思うところを指摘してやれよw
ゆりしー(´;ω;`)かわいそうです みなとらじお 君が主で執事が俺で 02
http://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」
Haskellのようなピュアな言語じゃ薄汚れた現実世界のアプリは書けないと言いたいのか?
>>530 ffiが実装された時点でピュアじゃねーよ。
これからはHaskellを純粋関数型言語なんて呼ぶのはやめようぜ。
別にffiも変なことしなけりゃ純粋さを壊さないだろ
>>532 おっと、そんなこと言っちゃうのか?
純粋でない例が一つでもあれば、それは純粋じゃないんだよ。
まあそうだ でも一々「ほぼ純粋な関数型言語」とか言うのか?
いや、ただの関数型言語だよ。 純粋なんて言葉をつけるのはおこがましい。
いや、でも滅多に副作用を使わないのは事実だし、重要な特徴じゃん
「モナディックI/Oを採用した関数型言語」でいいんじゃね
538 :
デフォルトの名無しさん :2008/02/19(火) 08:11:48
副作用無しでなんでもできれば純粋ってことでいいんじゃね。 SchemeやMLは副作用無しじゃI/Oができないし。
また公式落ちてるぞ よく落ちる糞公式だな
そのスレで既に十分突っ込まれてるじゃないか
haskellのプログラムは巨大化する傾向があるようですが、 Cで作ったファイル並みに小さくするコンパイルオプションとかってないですかね?
544 :
543 :2008/02/21(木) 22:43:03
すみません、言葉足らずでした。 haskellで作った実行ファイルが巨大化する傾向がある、といいたかったのです。
545 :
543 :2008/02/22(金) 20:08:04
とりあえず1/10ぐらいのサイズにしたいのです。
Cだって大きなプログラム作れば大きいだろ。
とりあえず ・GHCの最新版を使う ・最適化オプションを有効にする ・strip くらいじゃないか? あとUPXとかで圧縮するのが有効というのを読んだ
548 :
543 :2008/02/22(金) 22:16:46
昔のGHCならCのソース出力するオプションがあったらしいんだが,今はないのか? そもそもなんで実効ファイルが巨大化するのか調べた上での質問なら答えは直ぐに見つかるんだけどな
現状ghcではruntimeだけで200KBくらいになってしまうので無理かと。 jhcとかyhcならば判らないですけども。
libcや基本DLLよりずっと小さいよ。 Windowsの場合は、サードパーティが使える標準配布方式がないから、 静的リンクするか、インストーラー配布形式が必要になって、 それでこういう質問が増えるんだろうね。 お決まりの開発環境を使わないと、配布しづらい。
552 :
デフォルトの名無しさん :2008/02/23(土) 13:39:30
ghc だって libc に依存してるんでしょ
C++だってhello worldでもバカ正直にスタティックリンクすれば何百KBとかなったりするじゃん ダイナミックリンクでごまかしてたりするけど 機能持たせた言語の実行ファイルサイズが膨らむのはトレードオフ
Craft買って読んでますが、練習問題の解答ってどっかにありますでしょうか。
以前、IOモナド関連部分の回答を適当なワードでググった時はヒットしたよ 10分くらい探したけど
556 :
554 :2008/02/24(日) 19:38:46
つまり、ちゃんとした解答集のようなものは無いっちゅう ことですかorz そんな難しいものも少なそうなのでいいのかな
>>556 現状では、ある程度関数型言語でのプログラミングの経験をつんだ人が
Haskellを触るという感じなので、
言語仕様を見たらわりとすぐに使えるという人向きの文書しか出回っていない。
そういう意味では初心者はとっつきにくいかもしれないね。
また公式が落ちてやがる!!!!!!!! なめやがって!! マジ切れそうだ
すみません、こちらのファイアウォールのせいで公式につながらなかっただけでした・・・ お騒がせしました
wwwwwwwwwww
wwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
大卒で正社員じゃない奴ってこのスレに多そうだなw 知ってるか?高卒の生涯賃金って高卒の半分なんだぜwww_? 中卒なんてもってのほか 可哀想にお前ら そんな俺はもう内定貰ってこのスレいますけどねw
あいぉ(^ω^ > 高卒の生涯賃金って高卒の半分なんだぜwww_? > 高卒の生涯賃金って高卒の半分なんだぜwww_? > 高卒の生涯賃金って高卒の半分なんだぜwww_? > 高卒の生涯賃金って高卒の半分なんだぜwww_? > 高卒の生涯賃金って高卒の半分なんだぜwww_? > 高卒の生涯賃金って高卒の半分なんだぜwww_? > 高卒の生涯賃金って高卒の半分なんだぜwww_? > 高卒の生涯賃金って高卒の半分なんだぜwww_? > 高卒の生涯賃金って高卒の半分なんだぜwww_? > 高卒の生涯賃金って高卒の半分なんだぜwww_? > 高卒の生涯賃金って高卒の半分なんだぜwww_? > 高卒の生涯賃金って高卒の半分なんだぜwww_? > 高卒の生涯賃金って高卒の半分なんだぜwww_? > 高卒の生涯賃金って高卒の半分なんだぜwww_? > 高卒の生涯賃金って高卒の半分なんだぜwww_?
>高卒の生涯賃金って高卒の半分なんだぜwww_? 再帰的ですねwwwwww chingin x = chingin x / 2 こんな所でしょうか。 ちなみにスタックオーバーフローしましたが何か。
どうやら釣られてしまったようだ。。。
>>566 せっかくHaskellなんだから
chingin = chingin / 2
でいいよ
解は0とNaNと±Infと⊥だな
Nan = NanはFalseなんじゃないの?
何を言っているのかね
やってみた。 > 0/0 NaN > 0/0 == 0/0 False > 1/0 Infinity > 1/0 == 1/0 True > 1/0 == 1/0/2 True
⊥なんて解で出てくるの?
>>573 undefined
と
undefined / 2
は、どっちも同じ結果になる
関数型言語関連で購読おすすめのブログをいくつか教えてください
haskellerの皆さんって、元々はSchemeとか使っていたんでしょうか? 自分、関数型はハジメテでちょっと戸惑いがあったんですが、SICPを読んでみたら 何か分かってきました。 Haskellは今のところそういう文脈というか、経緯を知っている人たち向けってこと なんでしょうかね。
俺はC++から入った 他の関数型は、SML入門をちょっとwebで読みあさった経験しかなかった
Common Lisp -> OCaml -> Haskell
WebProg -> Haskell
C++ -> Haskell (あまりのパラダイムの違いに混乱中)
>>581 C++のconcept(次の標準で入る)とHaskellのtype classは同じ。
自分は
雑多なLisp→Common Lisp→Miranda, CLOS, ML, C++→Haskell, Scheme, C++
>>577 そうですね。
関数型言語での再利用とオブジェクト指向言語での再利用では
毛色が全く違うので戸惑うでしょうね。
関数型言語といっても、遅延評価が入るだけでかなり質が変わってきますよ。 LispやMLの方がCプログラマには分かりやすいでしょう。
>>577 Haskellはそういう知識を得ることが楽しい人向けの言語。
先に知っていても、必要だと思ってそこで勉強しても、どっちでもいいと思う。
まあとにかく世界の広がる言語だと思う、Haskellは。
Schemeも面白い。
モナドを学ぶのにオススメの書籍やwebサイトはありますか 一応一通り検索して解説を読んでみたんですがいまいち概念を把握できてないです 使う分には困らないんですが
母:順へ げんきですか。いまめーるしてます 順:うるさい死ね メールすんな殺すぞ 母:ごめんね。おかあさんはじめてめーるしたから、ごめんね 順:うるさいくたばれ、メールすんな 母:ちゃんとご飯食べてる? お金送りましょうか? 順:うんありがとう。かあさんこそ体とか大丈夫?
590 :
577 :2008/03/01(土) 19:22:00
なるほど、やはりLispからの方が多いんでしょうかね。 自分はLisp系知らずにHaskellやろうとして、map、fold、zipWithなどのリスト操作が 最も基本的なものとして扱われているのがピンときませんでした。 色々文書読んだりした後で、SICPを読んでみたら凄い分かってきましたよw。どうも そういう文脈にある人々向けにドキュメントなどが作成されているなぁと。JavaやC# とかが、C、C++の文脈を知っている人向けのドキュメントが多いのと同じでしょうかね。
map, reduceは他の言語でも、 コレクション周辺でサポートされてるよね? ただgeneric function系じゃないと、 ちょっと趣きが違うから戸惑うのかも知れないが。
>>590 まず、今までループで処理してたところを全部再帰で考え直してみようよ。
再帰処理の部分を一般化して関数にできないかどうか考えてみようよ。
SICPってMITの1年生用の教科書でしょ?
594 :
577 :2008/03/02(日) 08:02:16
>>591 ありますけど、理科系研究の実習用プログラムとかではない限り、あまり
使われないんじゃないかと思います。実際、言語の入門書類でも大きくは
扱われませんよね。
>>592 再起はそんなに戸惑いはありませんでした。どちらかと言えばループが
手続きの部分として扱われるのに対して、関数型ではそういう書き方は
あまりしない(醜いコードとなる)ってことですね。
>>593 そうです。すごい良書だと思います。
>>594 > 実際、言語の入門書類でも大きくは扱われませんよね。
入門書は年々数が増えていっていると共に、
糞本の割合が増えていっているから、
入門書一般の常識はいまや非常識といっていい状態。
本格的に取り組む入門書は嫌われるから。
関数型言語、特に本場の本は良書が多くてそういう心配はないんだけど。
古くても良書とされている入門書を店頭にわかりやすく並べている 本屋の数は、日本に人間の指の数ぐらいしか無いんではなかろうか。 他は次々と出る駄本の新刊を並べてるだけ。
Rubyなんかだとmapやinjectを使うのが当たり前かと思ったけど、そうでもないのか
598 :
577 :2008/03/02(日) 11:26:03
>>595 自分はSICP読んで、何でもっと早くに手に取らなかったのか、と後悔してます。
>>597 Rubyのそういった機能は関数型由来のものですよね。C言語系列の手続き型
にはあまり登場しないんじゃないかと思います。
使えないand/or使いたがらないand/or嫌悪する奴もまたいますな
and と or って左結合?
>>601 なぜに自転車屋のホームページ?w
ラジオ部 って何?w
モナドに関して、あえて説明しないってのは、入門としてはありかもね。
Parsecを理解できる書籍って 普通のHaskellが妥当かな?
ひらがなで書かないと書籍名に見えないw
606 :
602 :2008/03/07(金) 13:57:47
よく見ると
>>601 って、
手続き言語的にHaskellを解説してるように思えるな…。
こういう入門書でHaskellを学ぶ人が多くなると、
オブジェクト指向の時みたいに混乱しそう…。
初心者のオレでも?なコードがある…。
607 :
606 :2008/03/07(金) 15:35:46
最近のライブラリはほとんどarrowベースになってるんだなぁ・・・
>>608 自分、Craft読み終えたばかりでモナドも入り口しか知らない…
道は遠いなぁ
ghcに-prof -auto-allを付けると最適化が弱まるのはいやがらせか? フルに最適化の掛かったコードのプロファイルを取るにはどうすればいいんだ
>>610 最適化ありとなしなら違うだろうけどそれぐらいなら大差つきそうな感じもしないし
だいたいでいいんじゃない?
>>611 いや、一番内側のループにGHC.IOBase.>>の呼び出しやらunboxing/reboxingやらが残るんだ
もともと最適化で余計なものが全部消えることに期待しているソースなので、影響が大きい
実際、プロファイル版だと通常版の7倍くらい時間が掛かる
もちろんプロファイルのオーバーヘッドもあるだろうけど、別のソースだと3倍くらいで済むので、
最適化がうまく効かないことの要因が大きいと思う
wxHaskell 0.10.3 rc1が出てた。
wxHaskellをスタティックリンクする方法ありませんか?
615 :
デフォルトの名無しさん :2008/03/18(火) 09:56:50
Gtk2Hsと比べてどうなの?
ghc test.hs -o test とやった時に生成される test.hi test.o test.manifest この3つのファイルを生成させなくする方法ってないですか?
>>616 manifestファイルの生成は-fno-gen-manifestで抑止できる
ただし多少の副作用がある。詳しくはマニュアル参照
oとhiの生成を止めるのは多分無理。これなしじゃ分割コンパイルできないし
ファイルが残るのが嫌なら、ghcを実行した後にoとhiを削除するスクリプトでも組めばいい
>>617 ありがとうございます
スクリプト書いて我慢することにします。
Introduction to Functional Programming Using Haskell ¥ 11,554 (税込) ペーパーバックでこれって…。何でこんな高いの?
Bird大先生の書いた素晴らしい本なのでその価値はあります。 文章はもちろんコードが素晴らしいです。
>>621 Craftとかと比べるとあんまり売れ筋じゃないってこと?
>>619-620 「関数プログラミング(using Miranda)」はもっと安いYO!i
正直コードのぱっと見はSASL系のMirandaの方が好きだった。比Haskell
>>619 円高なんだから.comの書店から輸入すれば安いYO!
626 :
デフォルトの名無しさん :2008/03/20(木) 13:46:58
628 :
619 :2008/03/20(木) 13:57:36
っていうか、もう買っちゃったんだけどw ついさっき届いたんだが・・・チョっw、Craftとかよりも紙が安っぽいwww これ、11,554円か・・・。頑張って自分のモノにしないとなw
1966年にP.J.LandinがISWIMという言語を作ったのがその起源で、SASL, Mirandaという後継言語を経て、HaskellとCleanが生まれました。 これらは、全て「遅延評価」を評価戦略におくプログラミング言語であり、「純粋関数型言語」と呼ばれるグループです。 SASL系のMiranda???イミフ。
1954年にJ.BackusがFORTRANという言語を作ったのがその起源で, Algol, Cという後継言語を経て、C++とJavaが生まれました。 これらは、全て「副作用による状態の更新」を実行の基礎とするプログラミング言語であり、「手続き型言語」と呼ばれるグループです。 Algol系のC???イミフ。
遅延評価よりもしっくりくる言葉はないものだろうか 直訳で不精評価とか?
SASL系のMirandaって何?Haskellは何系なの?クワシク。
HaskellはMiranda系です
英語が難しくてよく理解できないのでつがw
Point-free styleで \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回出てくるなぁ...) が鍵かなーと思ってますが,一般にはどうすればいいのか.
Control.MonadとControl.Monad.Instancesをインポートするとこの二つが使える ap :: (a -> b -> c) -> (a -> b) -> a -> c liftM2 (.) :: (a -> b -> c) -> (a -> d -> b) -> a -> d -> c どっちも便利
s = \ x y z -> x z (y z) k = \ 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)))
返り値がユニットって他の言語で言うvoidの事ですか?
他の言語ってどの言語だよw
例えばcやJavaです
>>642 全く違います。
Unitは値ですがvoidは値ではありません。
全く違いますか・・・ 勉強しなおしますい
void 式は存在するし、C++ だと return 文にも渡せるが、 void 式を入れる変数が存在しない点が Unit とは大きく違う点か。
649 :
デフォルトの名無しさん :2008/03/23(日) 21:46:56
TAPLにはunitとCやJavaのvoidの使われ方は近いと書いてあるね。
使われ方は近いっていうのと概念が近いってのを混同せぬよう。
voidは引数として渡せないしな。
データ構造にも入れられない
653 :
639 :2008/03/24(月) 00:09:11
>>640 Control.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先生とかの論文で習うしかないのかなー
日本語でおk
instance Monad ((->) r) -- Defined in Control.Monad.Instances
lambdabotのplというプラグインが自動でポイントフリー変換をしてくれる \a b -> a*b + a/b を入れたら ap (ap . ((+) .) . (*)) (/) が返ってきた \a b -> a + f (b + g a) だと、 ap ((.) . (+)) ((f .) . (+) . g)
あの、結局、ポイントフリーは 「クイズとしては面白いけど無理に使う必要はない」 という事ですよね?
当然だ 使うに値すると思ったときだけ使えばいい
Birdの一派は「ポイントフリーの方がプログラムの本質が一層明らかになる」とか主張するんだよね
彼らの変形萌えぶりをみれば、 それほど無茶を言ってないと思えるよ。 プログラム変換(人力)で成果挙げてるからね。
Haskell のテストコード書いたり、簡単な実行したりコードさらしたりするにはここへカモン。
http://codepad.org/ コードを書いて実行した時のURLを記録しておけば、
実行結果も一緒にさらす事が出来て幸せです。
なんであんたあちこちで宣伝してんの?
GHCのドキュメントをMakeするときに必要な stringparamっていうプログラムって何でしょうか?これが無いせいでhtmlドキュメントが生成できません xmlproc関係のものだと言う気はするんですが、検索しても見付かりません 入手方法など情報お願いします
stringparamはプログラムじゃなくてxsltprocのコマンドラインオプションじゃないか?
なるほど、どもです どうやら原因はMakeの中で上手くxsltproc関連の変数が設定されてないのが原因でした
以下のコードでtimeout関数の動作確認をしたのですが、 うまく動作しません。何がいけないのでしょうか? import System.Timeout main = do a <- timeout (3*10^6) getLine print a
>>666 俺の環境(Linux x86 ghc-6.8.2 base-3.0.1.0)だと動いたよ
windowsだとHandleからの入力でブロックするときにselectを使ってないから、そのせいかも
モナドとかって解りやすく 書いた論文とかありますか? PARSEC使いたいのですが どうにも曖昧で
>>668 つ "The marriage of effects and monads"
つ "Tackling the awkward squad: monadic input/output, concurrency, exceptions, and foreign-language calls in Haskell"
ググればPDF手に入る
parsec使うのにモナドの知識は必要ないけどな
>>670 Tackling...はIOモナドについての論文じゃないか?
だったら何?
モナドについて知りたがってる奴にIOモナドの事を教えてもしょうがないだろ 群について知りたがってる奴に整数を教えるようなものだ
>>673 あとkindとかって数学の眠い本永遠と
読まないと理解できないかな?
圏とかまじで数学本気でやってねーから解らん
kindは全然難しいものじゃない 「Maybe Int」型の式は存在するけど単なる「Maybe」型の式は存在しないとか、 「Maybe Maybe」っていう型は不正だとか、そういう次元の話
パージングするとIOモナとの連携は付き物だから、
>>668 は知りたくなるんじゃないかな?
知らなくてもPARSEC使えるけどね。
知らなくても使えるんだけど 背景とか基礎的な内容知りたく ならない? ならない、そうですかそうですか.....
Trends in functional Programmingって毎年出てるの?
>>668 "Monadic parser combinators"ってテクニカルレポートが
仕組みやモナドの解説が分かりやすく書いてあってよかった。
自分は手続き型のメジャー言語を普段使っている人間ですが、最近関数型が話題になって 勉強しているところです。 この板の書き込みもそうですし、実際に出版されている本の数や内容など見ると、まだ Haskellのような言語は研究者レベルの言語なんでしょうか。 個人的には今後アプリがマルチプロセスに対応せざるを得ないとか、複雑性が上がる 中で処理の信頼度を一層高める必要がある中で、Haskellのような言語がある時期から 一気にパラダイムシフトを引き起こすのじゃないか、とか妄想していますが、単なる 妄想ですかねw
Haskellは、ある時期と言わず今、実用プログラムを(分野にも依るけど)書く上で有力な言語だと思うよ その意味で、Haskellは既に研究レベルの言語ではない 一方で、今のHaskell利用者に占める研究者や学生の割合はそれなりに高いだろうし、 Haskellが研究の道具として使われてるのも事実だから、その意味で研究者の言語だ
>>680 遅延評価のHaskellから、
> ある時期から一気にパラダイムシフトを引き起こすのじゃないか
ってのはちょっと難しいだろうね。
> 研究者レベルの言語
こういう考え方はよくわからない。
自分の腕を上げるために必要なことは学べばいいだけなんで。
immutableにするとスレッドセーフになるのは分かる 代入ができなくても別に困らない、というのも分かる 分からないのは遅延評価 原則的にはeagerにして必要なときだけ明示的に遅延するのでは駄目な例ってないすか
>>682 > 遅延評価のHaskellから、
> > ある時期から一気にパラダイムシフトを引き起こすのじゃないか
> ってのはちょっと難しいだろうね。
これはどういう意味でしょうか?
>>683 駄目ってことはないんじゃないか?
Haskellは、原則的には遅延で必要なときだけ明示的にeagerという立場だから、
Haskellコードを、デフォルトがeagerな言語に翻訳するのは機械的な書き換えで済む
どっちをデフォルトにするのが便利かは議論の分かれるところじゃないだろうか
687 :
680 :2008/04/06(日) 10:24:01
>>683 SICPなんかだと、参照透過性と遅延評価をStreamの項で関連付けて
いたりしますが、その辺へのこだわりではないんでしょうか?
1988年?ぐらいの関数言語を実装するための 本があるはずだけど あれみれば遅延評価背景わかるはず 本の名前が解らん
>>691 自分はCraftを先に読みました。Craftは所謂Haskell言語の入門書だと思います。
Introduction〜はHaskellの入門というよりも、関数型言語の原理原則を中心に
展開する書物ですね。自分は今読んでる途中です。
どちらもよい本だと思います。
>>691 欧米だとどっちを先に読めって言われてるの?
片方が初級で片方が中級、とかではないですね。
>>693 俺の恩師のイギリス人のじいちゃん先生
だと、今の若い人間には退屈すると
長続きがしないだろう。好奇心だけでは
どうしても無理だろう。といって、Craftを
読んで言語を理解しなさいと言われたなぁ
このすれの住人って 俺以外に、5人しかいないだろ?
日本でHaskellやってる人間なんて100人未満だろうな
だってモナドって何ですかって聞くと 「圏論について勉強するといいよ」って返されるんだもん そしてwikipediaで圏論の説明見てわからず涙目になる俺
Haskellでモナドを使ったり作ったりする分には圏論の知識なんて要らないけどな
>>699 そのうち何人が実際にソフトウェアを記述するかといったら100人未満だと思うよ
Webの自動テスト Haskellで書くと面白いんだけど Arrowが良くわからん あれが必要ななんでどうまくつかいこなせない
?
和訳すると、 「よくわからないArrowが必要なせいで、うまく使いこなせない。」
arrowより日本語を使いこなした方がよいのでは…
まぁ、arrowよりも日本語の方が長く使うだろうからなぁ。
分からないぞ、突如GHCが日本を占拠して日本語の代わりにHaskellを使うように命じられるかもしれない。
それは中国が世界を支配する確率とどちらが高いかね?
GHC とは General Headquarters Compiler の略だったのか・・・ ギブ・ミー・モナド
710 :
デフォルトの名無しさん :2008/04/10(木) 11:30:08
>>702 Arrowが必要なのは、Arrowベースのテストツールかなにかを
使ってるからなんだろうけど、なに使ってるの?
しかし雑談ばっかりだなこのスレ
うまく使いこなせないのに必要だと分かって作ってるんですか
モナドってHaskellに限った考え方ではなくて、もっと一般的な考え方なんだよね? ほかの言語にモナドの考え方を応用したようなライブラリが、もっとあってもいいと 思うんだけどな。副作用嫌いな人は喜ぶと思うんだけど。そうでもないのかね。
すでに他の言語でもあることない? すんごいマイナーだけど
Python でモナドを実装してみたよ、ってのはネットで見た気がする。
719 :
デフォルトの名無しさん :2008/04/12(土) 21:48:14
引く手あまたのプログラミング言語は?
http://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以下だったそうだ。
---
JavaはともかくC#はどうかな…? 10年後には残ってない気もするが。
そんなことよりもHaskellの求人が存在するのか!! どんな仕事だ?
リンク先まともに読んでないが 単に列記されてるのカウントしてるだけじゃねーの?
HaskellとかOcamlの仕事とかどんなんか見てみたい 研究用じゃないよな
Haskellでグラディウスを作る仕事です。 誰でも簡単にできる楽しい作業です。 初心者歓迎。
0 <= 10 → True
0は10以下でないとか、全部は一部でないとか、空列は列でないとか、自然言語には奇怪な慣習があるのです
Hugs> -10 <= 10 True
Haskellerお断り 10件w
アメリカの大学では、(企業もだけど) フルタイムやパートタイムの非常勤プログラマーを雇うことがあるから、 Haskellはその類いかも知れない。
>>723 www.janestcapital.com
だけど、関数型言語の勉強は仕事で使わなくてもやったほうが いいと思うけどな。手続き型で出やすい不具合をどう防ぐか、 無駄の無い記述をどう実現するか、とか勉強になること多いと思うよ。
個人的には手続き型ベースのOOPLのコーディングに影響があったかというと微妙な気が。 具体的にどういうこと?
733 :
デフォルトの名無しさん :2008/04/13(日) 13:11:08
一々メソッドや変数の名前を考えるのが面倒で コーディングする気力が萎えて来るとか…
海軍でhaskell使ってると思う どこの国かは言えんが topでGHCかりかり動いているみたことある
lambdaの導入とかそういう文法レベルでの影響は0ではないか。
C++は次でラムダ実装する Intelのスレッドライブラリもラムダ標準実装 C#も次期バージョンのサポート予定 Javaはかすだけどサポートするらしい(いらねw
737 :
デフォルトの名無しさん :2008/04/13(日) 13:56:04
あるとか無いとか、仕様のマトリックスを埋めるだけなら意味無いよ C++ 自体がイラネ
>>732 いや、単純に(再)代入が許されない世界で、再起を使うとか、リストデータを
編集してそこから必要な情報抜くとか。そういうの訓練すると影響あるんじゃない
かなぁ。
手続き型だと「要するにこれはどういう処理か」って考えずにずらずらと手続きを
書き連ねていって、目的のデータを何とか作ってしまう、とかなりがちだけど、
その辺が意識変わると思うんだけどね。
副作用を0にするって考えは 通常の手続き型に慣れると そうぞうすらしない奴も多いから F言語はシンプルな世界観を持つ ためにはある程度知る必要があると おもふ 別に変態的に知る必要はまったくないけど それよりCraf本読むのに6時間かけてまだ 6章しか読めん俺はおわっとる
>>736 VBで既に導入されてなかった? >λ式
C#にも既に入ってる
C#とかにλ式が導入されるとか、ちょっと意味不明というか、統一感が無さ過ぎる感じが するがどうなんだろうか。だったらF#とかでいいじゃないか?って気がするけどな。 実はF#への移行の布石だったりして。
元々あった無名delegateの構文を整理しただけだから、そんなに大袈裟な話でもない どっちにしろ、まともな高水準言語なら無名関数の類はあって当然で、統一感とか気にしてる場合じゃない 次は代数的データ型とパターンマッチに相当するものが入るといいな
>>743 >まともな高水準言語なら無名関数の類はあって当然で、
私が言葉尻に拘ってるのかも知れないが、なぜ?
>>744 上であがってる古い関数言語の実装の
論文読んでみなよ何が要素として定義
されていて必要なのかわかるから
>>745 でもC++とかには(少なくとも現在の規格では)無いわけだし、
実際無名関数みたいな仕組みは無くてもプログラムを組むことはできるし、
それらの事実を踏まえた上で
>>744 は
>>743 が「あって当然で」と言っているその考えを聞きたいんだと思うんだが。
あった方がプログラミングが綺麗になる部分もあるのは当然の話だが。
それこそ言葉尻じゃねw モダンな言語は取り入れる傾向にあるとでも読み換えたら。
>>746 OOが無くても手続きはできるし
アジャイルがなくてもそれ相当のことはいくらでもできる。
Cで、どんな手段でもOKならfor_each構文を作ることもできる
結局、ラテン語やその他の自然言語がどんどん変革していったように
プログラミング言語も変わっていくだけだと思うよ
ただそこには、今まで苦労した結果を簡単に置き換えることで
本当の問題にどれだけ注視して取り組めるようすることを
追求しているだけだと思うよ。リスクの低減と開発効率の上昇
自然言語に対する機械言語の仕様変更とイディオムの変更は
とてつもなく早いのでそれに対する拒否反応や疑問は常時出てしまうけど
それは仕方のないことだろうし。まぁ慣れてくれ
>>746 > でもC++とかには(少なくとも現在の規格では)無いわけだし、
今もあるぞ、制限が多いだけで。
C++0xで言語自身に組み込みになってより強力になる。
750 :
デフォルトの名無しさん :2008/04/14(月) 01:01:34
C++ にクロージャ入れても意味が無い
わざわざ関数オブジェクトクラスを定義しなくて良いという くだらないが重要な利点があります
752 :
デフォルトの名無しさん :2008/04/14(月) 08:38:21
そして文法が果てしなく汚れて行く…
Haskell には今話題にあがってるような、構文、言語機能の拡張ってないの?
提案されてきた拡張は数えきれないくらいある いくつかはGHCにも実装されてるし
C#にクロージャとかって、どうも奇妙な感じがするのは、関数型言語って 自然数なんかもλ式で表現する、つまり「全ては関数なり」という一貫 した思想に基づいて設計されてるわけでしょ? C#やJavaなどのオブジェクト思考言語って、値が全てなんだよね。 値を操作するために関数がある。そこにクロージャとかって、何か 意味があるのかね。
756 :
デフォルトの名無しさん :2008/04/14(月) 20:41:20
オブジェクト指向言語を知らないからそう思うんじゃないの。 オブジェクト指向言語で関数オブジェクトを扱えるのは別に おかしな事じゃない。関数型言語でオブジェクト指向する事も 出来るし。
>関数型言語って >自然数なんかもλ式で表現する、つまり「全ては関数なり」という一貫 >した思想に基づいて設計されてるわけでしょ? これがそもそも勘違い 例えばHaskellのIntは関数じゃない C#やらJavaScriptやらにクロージャがあって役に立つのは事実 例を知りたければ適当に検索すればいくらでも見つかると思う
副作用がある言語のクロージャってのも、 それはそれで使いでがある。 SICPをやってみればわかるけども。
>>756 それってUtility的なものでしょ?
どうも変な感じするけどなぁ。
760 :
デフォルトの名無しさん :2008/04/14(月) 21:36:49
そりゃ、あんたがどう感じるかで言語設計している訳じゃないからな。 オブジェクト指向が値が全てと言うのは勘違いだし、クロージャも みんな昔から便利に使っている。それだけ。
なんだこのNOOBどもは 小学生の議論してんなよ
あ、そうw いや、俺が感じるというか、計算モデルがそもそも違うと思うんだけどね。 まぁ、いいかw
なんかさ、大学でちょっとかじったぐらいのやつらの話ってうざくね? いかにも知ったかぶった感じで話すやつら。
ネトゲ厨降臨中
765 :
デフォルトの名無しさん :2008/04/14(月) 21:55:00
766 :
デフォルトの名無しさん :2008/04/14(月) 21:57:48
OO 特有の計算モデルとかあるの?
昨日教科書読みました、みたいな発言やめてください。 背中がむずがゆくなります。
偶然ですね。私も昨日SICP読みました。さっぱりわかりませんでしたがw
学のない奴が語っちゃいけませんかそうですか
学の無い人間は尋ねる側ので、語る側ではないな。
771 :
デフォルトの名無しさん :2008/04/14(月) 22:23:40
じゃあ頭の出来が違う人達に語ってもらおうぜ
命令すんなよw
773 :
デフォルトの名無しさん :2008/04/14(月) 22:30:06
それなら気が向いたらでいいから宜しく頼むわ
>>762 は学のあるなし以前に、自分の意見をまじめに伝えようとしてないから、相手にしないほうがいい
Haskellの拡張については 昨日教科書読みました 程度では語れるレベルじゃないから、 Haskellでの実装の話しろよ。
BrainfuckでHaskell作ろうぜ
Haskell初心者ですが、勉強した印象として構文が若干 多いかな?という感じがします。型に関係する部分とか 特に。 これってHaskellerの間で議論があったりするんでしょうか。 比べてはいけないんでしょうけど、Schemeのようなシンプルさ で同じような型チェックができたら最高なんですが。
それはCとC++比べてるようなもんです。どうしても嫌なら、 ML系のオブジェクト指向が入ってないのをやってみてはどうでしょうか。
OCaml?
>>779 たぶんCaml liteの方。でなきゃSML。
>>777 ぐちぐちうぜーこと言ってるなら
使うな辞めろうぜーんだよ
お前のチラ裏報告なんて誰も
求めてねぇよ
さっさと消えろよ
>>777 厳格な型付けをする言語では避けて通れないんじゃないの。むしろ、それを望む人には
必要不可欠かと。
空気読まずに失礼しますが、 runhaskellの引数にプログラムを書いて実行する方法はありますか? たとえばrubyだと $ ruby -e "print 'abc'" のように書くことが出来ますよね。 同じような使い方をHaskellでしたいんです。
ghc -e 'putStrLn "abc"' Hugsだと多分無理
Types and Programming Languages と Introduction to Functional Programming Using Haskell カバーしてる内容全然違う?
はい、上は型理論の入門書です。 数学分からない人は絶対に読むべきじゃないです。
>>787 ここ数年の少年ジャンプの面白さを
発見するよりは簡単なはずだが?
>>788 「型推論のHindley-Milner type inference」とかでピンと来るならいいんじゃね。
790 :
デフォルトの名無しさん :2008/04/20(日) 00:46:08
数学界ってネタ切れなんかね
TAPLに数学なんか関係あったか? どのへん?
数学は万物と関係があります
確かにそうだが随分とアバウトな答え方だね
本の最初のLessonで main = do cs <- getContents putStr cs というサンプルがあったのだが,このまま打ち込んでも The last statement in a 'do' construct must be an expression と出る.どうすれば...?
>>794 二行目の先頭にちょうど10個のスペースを入れてる?
>>795-796 Emacsを使ってるのですが,するとEmacsの自動インデント
機能に難ありということなのでしょうか...
>>797 Emacsはよく知らんが、Tabをスペースにかえればいいんでないの?
関数型プログラミング言語Haskell Part7
http://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キーで正しくインデントさせる方法がありますでしょうか?
関数型プログラミング言語Haskell Part7
http://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通りという事ですね。
他の方はどうやってインデントさせているのか疑問に思っていたのですが、
その疑問が解消されました。
Tabをもう一回押すんだよ。
n重に入れ子になったリストにn-1回concatをかけるような処理はどう書けばいいですか? 再帰的な型を使うと data Tree a = Leaf a | Branch [Tree a] 型チェックが甘いと感じます。 例えば [Leaf 1, Branch [Leaf 2, Leaf 3]] のように ネストする深さが揃っていないものを禁止したいときはどうすればいいでしょうか?
いわゆる依存型だよね 素朴に導入する静的な型推論が決定不能になるんじゃなかったっけ
型推論だったら静的なってのは余計か
なるほど 深さを表す数値をパラメータにできれば解決するわけですね
>>804 余談だけど、Haskell の型推論に実装されていないもので、決定可能なものにはどんなのがあるの?
どんなのがあるかな。部分型とか様相型? 様相型は研究以外では見ないような気もする。
>>803 > {-# 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
様相型なんてあるの? 名指しと必然性とかについて研究するのん?
>>809 Church数を使うのかw
コンパイル時の処理と実行時の処理を別々の言語で記述するというと
Schemeのマクロに似てる
ちゃーちにゅーめらるってタダの遊びナンじゃないの? リアルで使う人がいるなんて信じられない!
遊びだと思われてたものが意外なところで使えるというのはそんなに珍しくないだろ それから、整数をラムダ項でエンコードしてる訳じゃないので、チャーチ数じゃなくてただのペアノ式自然数だな
質問です WindowsのwriteProcessMemoryに該当する関数って実装されていないんでしょうか? デバッガを作っているのですが、 他プロセスのメモリを弄る機能がどうしてもHaskellのみで作ることができません・・・
>>816 これです
見落としていました
ありがとうございます
おい!googleつながらねーぞ!!!!!
googleに論文保管してるのに!なめやがってgoogleの分際でむかつくぜ!!!!しねぐうぐるっるあこl;えjlふぁds;kj
マジ切れそう googleに電話してくる
これに懲りたら、国産検索エンジンの開発にもっと力をいれよう! 日本万歳!!!
岡本くん、ごめんなさい。 悪気はなかったんです。
Haskellでゲームてどうやってつくるんだろ? とわくわくしながらソースみたらアクションがひたすら列挙されてますた
824 :
デフォルトの名無しさん :2008/05/01(木) 17:36:28
ghcを落としたいんですが 調べたサイトにアクセスしてもつながりません どこか落とせる場所はありませんか?
>>823 Functional Reactive Programmingあたりを使って遊べるゲームを作ったら注目されると思うよ
>>824 残念だけどHaskell.orgの復旧まで待つしかない気がする
826 :
デフォルトの名無しさん :2008/05/01(木) 19:24:11
>>825 そうですか
いつからつながらなくなってるんですか?
そんなマイナーな言語じゃないんだからはやく復旧してほしい…
今試したら繋がったよ
>>826 Haskell を咎めるわけではないけど、間違いなくマイナーに区分される言語。
順位つけたらどうせ20位とか30位とかその辺だろ 見方によっては十分メジャーだし、見方によってはどうしようもなくマイナー
開発者が髭蓄えるとその言語は繁栄するらしいぞ
Wadlerたんを委員会の筆頭メンバーにすればいいのか!
開発者に童貞の数が多いと髭の 効果は激減されるらしい
誰かいます? ghcで -optl -mwindows つけてコンソール表示しないようにしたら、 putStrLn とか print で落ちる…… こういうもんだっけ?無視してくれないのかな
Cで標準出力にwriteしようとするとEBADFが返るから、そのままエラーを発生させてるんだな ただ、Cでもprintfなんかのライブラリ関数はエラーを返さないから、 Haskellの振る舞いも改善の余地があるかも
freopenで適当なファイルに出力先を変えれば良いんじゃね、 と思ったんだがfreopenに相当する関数がないね。
それをやるならffiでdup2を呼んでしまえばいい
838 :
デフォルトの名無しさん :2008/05/06(火) 19:08:01
Haskellで簡単なCGIを作って遊んでみたいんですが 環境の設定の仕方がわかりません どこか参考になるサイトってありませんか?
環境の設定って何?
Apacheの設定とかのことかな?
841 :
デフォルトの名無しさん :2008/05/06(火) 20:59:05
>>835 >>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
>>838 サーバの設定のことなら、特別なことは何も必要ないよ
ネイティブコンパイルしたバイナリを使うなら、Cで書いたcgiを使う手順と同じだし、
hugsとかのインタプリタを使うなら、Perlで書いたcgiを使う手順と同じ
ただし、Cと比べてクロスコンパイルはかなり面倒だと思う
コンパイルするなら、サーバ機と同じアーキテクチャ/OSを使うのがお勧め
843 :
デフォルトの名無しさん :2008/05/06(火) 21:33:06
サーバの設定のことです
>>842 ありがとうございます
c言語で作るのと同じ手順を勉強しときます
>>844 正味、408から417までが前説
418から428がサンタさん問題を扱った実装と
まとめ
Yet Another Haskell Tutorial見ながらHaskellの勉強していますが下の所で詰まっています どなたかお助けを (++) = foldr (\a b -> (a:) . b) id このラムダでbは関数を受けるらしいんですけど、(++)の二つの引数はともにリストなのにどこから関数が出てくるんでしょうか?
>>846 foldr :: (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
というように定義することができるんだよ。
引数の一部を与えて新しい関数を作ることが出来るっていう機能だよ。
848 :
846 :2008/05/07(水) 13:43:30
>>847 >引数の一部を与えて新しい関数を作ることが出来るっていう機能だよ。
C++ STLのbindの様な物ですよね
これは分かるんですが
>だけど、b -> [a] の部分は引数を与えてないよね。
bの部分はidが a -> a だから引数を与えていないのと同じという意味ですか?
その上でb -> [a]の部分に引数を与えていないことがラムダの中に影響を及ぼすのはどういう仕組みなんでしょうか
foldrをきちんと理解できてないだけじゃないの?foldrの定義は > 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は関数を受けるらしいんですけど、(++)の二つの引数はともに >リストなのにどこから関数が出てくるんでしょうか? というのはわかるだろう。
>>846 foldrは関数と初期値とリストを与えると(初期値と同じ型の)結果が返る関数だけど、
ここでは初期値として関数idを与えているだけ
当然、foldrの結果も関数になるし、foldrに与えるラムダも関数を受けなきゃならない
(++) :: [z] -> [z] -> [z]
foldr :: (a -> b -> b) -> b -> [a] -> b
とするなら、ここではaにzが対応し、bには([z] -> [z])が対応する
851 :
849 :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 というのは、いってみればリストを引数にとって、「そのリストを自身の引数であるリストの 先頭に加える」という別の関数を返す関数。
852 :
846 :2008/05/07(水) 18:10:23
foldrの呼び出しが展開されていって最後の空リストがidに置き換わって、そしてidがbに成るわけですね 脳が手続き型から抜け出せないのか、いまいち頭の中でうまくHaskellの表現を展開できません。 これからは分からなくなったら一つずつ書いていこうと思います レスくれた方々、大変丁寧で分かりやすい説明ありがとうございました。
関数型言語に入門するならschemeとかcamlとかで慣れたほうがいいと思うんだがなぁ・・・
自分もまだ学習中ですけど、SICPを読んだら凄く分かるようになりましたよ。 手続き型やってる人がいきなりfoldrとか言われてもピンとこないんじゃない ですかね。
俺はcraft読みまくって 今日やっと10章までいった ほんとう俺終わってる 士ぬぽ
SICP高いな 貧乏なんで暗号技術大全とProgrammingGems6とSICPで迷うぜ
>>856 かわいいおにゃのこだったら
買ってやったのに残念だったな青年
>>853 schemeとかcamlには魅力を感じない…
SICPは全部schemeで書いてあるんだから、SICP読むなら必須だろ。
SICP読むのに必要なSchemeの知識ってほとんど無いでしょ。 基本構文は単純だし、覚える基本関数なんか数えるくらいしか 無い。そこから色んな話題が展開されるところがSICPの面白い ところなんだな。その知識はダイレクトにHaskellでも役に立つ。
SICP読むと Schemeで書くとめんどくさい事を haskell はすっきり書けるんだなと思う。
SICPは魔法と同義だから 発売禁止書籍だろ 読むな
未経験者向けの丁寧な入門書があるんだから、Haskellが入門に向かないってことはない
>>865 に同意
むしろ言語を勉強する目的ならば、Haskellはシンプルで徹底していて、OCamlやSchemeよりいいんじゃないかなぁ。
Haskell勉強して、ラムダ計算勉強するのでok
あれするなこれするなで行き着く先は何もできない奴になるだけだよ。 やりたいようにやったらいい。
>>868 それって数理証明が難しいってだけだよね?
まさか利用することまで難しいとかDQNなこと
言ってないよね?
>>869 ConcurrentなActor ModelのCPSは利用が難しいJK。
>>870 具体的かつ簡単な問題ていじしてちょ?
リンクでいいちょよ
すみません、それこそDQNな質問かも知れませんが、 Haskell勉強していて本によく関数の証明が出てきますよね。 あと、この関数はこういう定理に基づいて、こう変形できるとか。 これって手続き型言語の本ではお目にかからないものだと 思います。ライブラリの知識よりも、そういう数学的な発想と いうか、ある関数を見て、別の書き方に変換できる能力の ほうが大事なんでしょうか。
873 :
デフォルトの名無しさん :2008/05/09(金) 06:33:11
数学的証明は箔をつける為の飾り
>>872 論文の数式見てアルゴリズム実装できりゃ
実用上十分なわけで
つうかHaskell駄本の証明は簡単だろ
解らないなら使うな以上
>>872 再帰を使ったプログラムは証明しやすいという利点がある。
ループを使ったプログラムは簡単には証明できない。
872が具体的にどのような証明のことを言っているのかわからないけど、
本では、その利点を示すために、もしくは、形式的手法の需要性を訴えるために
証明も付記しているんだろう。
>>874 分からないだの難しいだのなんて一言も書いてないだろ。
なんだこいつ。
877 :
デフォルトの名無しさん :2008/05/09(金) 08:58:25
簡単な数式なら載せる意味が無い様な気もするが、簡単なの?
>>872 面白いと思ったらやればいい
ただそれだけのこと
879 :
デフォルトの名無しさん :2008/05/09(金) 17:29:42
本質的かどうかと言ったら、割とどうでも良いってことかな
それはやる人が決めればいいこと。 プログラミング言語の問題じゃない。
少なくとも避けて通れない類のものではない
882 :
デフォルトの名無しさん :2008/05/09(金) 19:00:35
なんだか 教えて君を嫌うあまり 自分も対教えて君的な対応しかできなくなってる馬鹿回答者がいるな
解らないなら使うな以上(笑)
>>880 お前みたいなやつ、学校のクラスに一人はいたよなぁ・・
こういうやつは決まって内向的で友達少なくて欝気味なんだよな。
しかも人望がないくせにリーダーやりたがって、最終的には失敗するんだよ。
近くにいたくないタイプw
readProcessMemoryで他のプロセスのメモリを読むために、 findWindowで取得したHWNDからopenProcessで使うProcessIdを取得したいんですが、 その間の処理のための関数が見つかりません。 Win32apiのGetWindowThreadProcessIdに該当する関数は用意されていないのでしょうか? だとしたら中途半端すぎると思うのですが。 findWindow :: String -> String -> IO (Maybe HWND) openProcess :: ProcessAccessRights -> BOOL -> ProcessId -> IO ProcessHandle readProcessMemory :: PHANDLE -> ForeignAddress -> Int -> IO (ForeignPtr a)
>>885 ソース読め
読んでも解らないなら使うな以上
>>885 win32パッケージはみんなが日常的に使うものって訳じゃないし、中途半端なところがあっても不思議じゃない
足りない部分があるならパッチを送るのがいいと思うよ
ちなみに、特定の関数のラッパがライブラリに含まれてるか知りたいときは、
ソースを落としてforeign import宣言をgrepするのがお勧め
>>871 具体的な例が簡単なら利用が難しいとは言わないだろ常考w
>>886 私には君がそのレスを嬉々として書いている様が一瞬で頭に浮かんだのだが、
ちょっとここで落ち付いてもう一度考えてほしい。
そのレスをすることに何の意味があるのかを。
あ、オナニーですね、わかります。
解らないなら使うな以上(笑)
読んでも解らないなら使うな以上 (笑)
891 :
872 :2008/05/09(金) 20:41:25
皆さん、ありがとうございます。 自分は手続き型しか経験が無かったので、プログラムが意図した動きを するかをテストするという発想はあっても、証明するという発想はありません でした。 それが、Haskell本ではよく出てくるので、アプリケーションの信頼性を「証明」 するということが重要なのかな、と思ったのです。 別にそんなこと一々しないんですかね。或いは、ツールで検証できたりする んでしょうか。
その喧嘩腰の奴、最近あちこちの関数型言語のヌレで暴れてる知ったかぶりのアホだYO! 相手にする価値無いからほっといた方がイイ!
NGワード: 読め 使うな 以上 登録したら気分爽快w
>>891 プログラム全体の正しさを証明するのは難しすぎて(良くても面倒すぎて)実際的じゃない(少なくとも今は)
だから、Haskellでもテストは手続き型言語の場合と同様に重要で、テストに代わるものは無い
ただし、限定された状況では形式的な証明が有効なことはある
Ordのインスタンスを書いたとき、それがちゃんと全順序になっていることを証明するとか、
自分で書いた書き換え規則(これはGHC特有の機能だけど)の正しさを証明するとか
897 :
デフォルトの名無しさん :2008/05/09(金) 21:44:25
モナドの説明によく出てくる、 「xxxという法則を満たすものをyyyとみなすといろいろ便利なことがあ ります」 という謎掛けのような言い回し、なんだかいろいろなものを一つの枠組みで処 理することを表してるんかなあと思っていたんだけど、今日ひらめいた。 あんまり好きじゃない言葉をあえて使うけど、 モナドっていわゆるデザインパターンの一種と考えておk?
>>897 デザインパターンとはまた違うね。
モナドをデザインパターンとみなすならありとあらゆるアルゴリズムとデータ構造がデザインパターンだといわれてしまう。
>>897 その通りで、「モナド式のインタフェースを与える」というのが一種のデザインパターンになってる
ただし、メタな慣習に留まらずに、「Monad」というクラスを通じて言語内でこの仕組みを活用できるから、
いわゆるデザインパターン(対応する概念がコード中に直接現れない)とは少し違う
>>898 モナドはアルゴリズムでもデータ構造でもないけど、なんでそうなる?
>>900 個々のモナドならそうだな
俺は
>>897 を読んで、個々のモナドについてじゃなく
Monadクラス(あるいはモナドという考え方)についての話題だと解釈した
Monadクラスはデータ構造でもアルゴリズムでもないってのは認めるよな?
>>901 クラスとは?
型クラスのこと?
データ構造に過ぎないと思うが。
デザインパターンというのはもっとラフなもの、たとえばプログラマーの設計におけるノウハウのようなものを言うんだよ。
モナドはノウハウじゃないよね。
>>902 型クラスのこと
型クラスはいかなる構造も表さないだろ
データ構造は個々のインスタンスだ
モナドはノウハウだと言えると思う(少なくともそういう側面がある)
ライブラリを設計する時に、特定の機能をモナドとして公開するという選択肢を知っていると便利だという意味で
ただ、Haskellでのモナドは単なるノウハウにとどまらず、実際にコード上で型クラスとして利用できる
(つまりliftMとかmapMみたいな、任意のモナドについての関数を書ける)
という点で、典型的なデザインパターンとは違うから、それを
>>899 の4行目に書いた
OK これ以上何を言っても言葉遊びに過ぎないからやめよう。
>>897 モナドなんかの定義は
GHCの神様の論文みりゃいいだろ
数式的にこみいっているなら
圏とかその辺の簡単な英語の
教科書読めばいいだろ
そもそも、偉そうで大して
何も功績のない黄色猿の説明の
真似事を真に受けるから混乱するんだよ
他の分野と違って日本語で発信した
情報を改良していった分野じゃねーから
日本語の情報なんて読むだけ無駄なんだよ
>>891 >>895 Haskellの関数と仕様を与えて、関数がその仕様をみたすことの証明をする支援ツールがある。
名前はAgda
このツールによって証明された関数は、仕様を満たすことが保証されるので、テストが必要ない。
このようなツールは証明支援系(Proof Assistant)、定理証明系(Theorem Prover)などと呼ばれている。
>>891 >>895 Haskellの関数と仕様を与えて、関数がその仕様をみたすことの証明をする支援ツールがある。
名前はAgda
このツールによって証明された関数は、仕様を満たすことが保証されるので、テストが必要ない。
このようなツールは証明支援系(Proof Assistant)、定理証明系(Theorem Prover)などと呼ばれている。
たとえばネットワークアプリとかを書くとき、途中で通信が切断されたかどういう挙動をするかとか、 通信相手が異常なデータを送ってきたときどうなるかとか、 そういうのってテストするのが一番の近道だと思うんだけど、どうなんだろ。
>>908 その程度の組み合わせと遷移なら
spinでいいだろボケカス
>>906 Agdaの存在は知ってたけど、現実の問題に対してテストの代わりになるの?
912 :
872 :2008/05/10(土) 08:40:16
>>906 おお、こういうツールがやはりあるんですね。ありがとうございます。
Haskellというとコンパクトな記述とかがクローズアップされますけど、
参照透過性にこだわりを持つ言語ということで、テストではなくて
証明が可能な場合が多い、というのは刺激的だと思います。
>>908 テストと証明では質的な違いがありますよね。テストはどこまで行っても
信頼できる「と思われる」の積み重ねであって、絶対に間違いがあっては
いけないシステムの場合、テストは凄いコストかかるんじゃないでしょうか。
証明可能で、しかもツールでそれが検証できれば凄いコストが減らせます。
一般的な実用化を進めるに際して、重要な要素だと思います。
913 訂正 x すべての関数について証明する事ができる。 もちろん、正しくないことは証明できない。
俺は頭が悪いんで他人の意図が読みとれないのだが
>>913 は
『不具合が許されないシステム開発においてはHaskellで開発すればよい』
と言ってるのか?
作ったアルゴリズム 数式化するときってみんなどうしてる?
関数の仕様はその仕様でいいのか、 というところまで考えると、 やっぱりテストは必要だと思う。
>>915 その通り。
しかし現実的には以下のような問題があり、大企業で今すぐ導入する事は難しい可能性がある。
- 過去に作った巨大なシステムがJavaなどで作られている。
- 偉い人(責任者や、クライアント) がHaskellや形式手法などの技術に関する知識を持っていない。
- 関数型言語ができるエンジニアが世界的に見ても少数である。
これからシステムは複雑になっていく一方で、不具合に対するリスクや、
テストにかかるコストが上がっていくのならば、形式手法を用いた開発がより求められるかもしれない。
実際に関数型言語を第一言語として、金融関係のシステム開発を行っている会社がニューヨークに存在する。
http://www.janestcapital.com/
まるで技術的な欠陥はないかのような書き方だけど そうなの?
>>917 確かに仕様を厳密に読む能力がないといけない。それは契約書などで契約を結ぶのと似ている。
契約を結ぶ両者が契約書の記述をきちんと読んで判定しないと契約はうまくいかない。
テストが必要である事は変わらないかもしれないが、テストだけでは100%の保証をする事はできない。
形式手法によって、テストのウェイトを減らし、信頼性を増やす事ができるかもしれない。
本来は高レベルの
形式的意味論や型推論を
使って手続きと関数型を
クロス変換できるといいんだよなぁ
>>918 作ってよ
Haskellでもゆるいコードは書けるよ。 共用体のような型を多用するとコンパイルが簡単に通るようになる。 けど実行時にエラーが出る。 何故そんな書き方が許されるのかというと、そうしないと書けないこともあるから。 そういうコードは静的なチェックができない。
>>918 HaskellでGoogle検索したときとかに、人材募集の公告を出している会社だね。
転職しようかな
>>926 ,.--、、
,:' ゙ヽ、
/ ,,.-‐-- 、..ユ_
/レ´ `ヽ、
, ´_ ,:''´ ̄`ヽ. ゙ヽ.
,:',r´ ゙ヽ::i 「`''‐-、 ヘ
lイ j:{ ト 、 `ヽi
|{ (__)、_ __,.ノ′ ヽ、 l
{,.ゝ-‐' __|_,,..二_ ヽ. l ,;ァ
,..,r‐、| ,r'´_,..-─--ヾ、 ヘ.ム' j
| } | l. |リ k‐''''゙゙´フ ヽ ノ/ ス二ニ
| j | ヽ! { `'''゙´ ,,,... ゝ=-、_∠c'ン-‐''´‐
| j^l| ヽ-ヽ. ゙゙"´ ,,,;;;' ,ノノク
j' 丿/レ´) ヽ、_,.-1;;;;; _.ィ//,.-‐─=
{'´ i'ノ / _,.!-‐',ィ,イ,r'´
>>929 それって学会発表聞いた限り
CAD関係の数値データの変換程度
しかできないって記憶があるけど
今は分散トランザクションとか扱えるまで
成長してきたのかな?
プログラムの数学的な証明はテストの一部だろ
難しいことはそっちに置いておいて アルゴリズムを数式化する方法について 教えてほしいぉ
実績のない言語での開発を許してくれる金融系のクライアントがいれば
>>933 競走相手は、学者だぞ。
MOT(技術経営:Management of Technology)は参考になるかも。
936 :
912 :2008/05/10(土) 21:22:55
>>913 なるほど。自分はHaskell学習中で、BirdのIntroduction〜を読んでるの
ですが、最終章に証明アプリみたいなのが出てきますよね。
これを見て凄く感動しましたw。こういうのがHaskell開発の統合環境のような
ものでサポートされれば、関数選択して簡潔な表記へ変換とか、色んなことが
可能なんじゃないか。ユニットテストも全く違った形で、凄い精度よくできるん
じゃないかと思ったんですね。
これいいぉ? Communicating and Mobile Systems: The Pi-Calculus
おっΠ
hrefのiterateの誤植のおかげで時間ロスした……
test.hsをコンパイルしようとしたら次のようなエラーが出たのですが原因がわかりません compilation IS NOT required test.o(.test.o(.text+0x46):fake: undefined reference to `cgizm3001zi1zi5zi2_NetworkziCGI_runCGI_closure'
すみません途中で送信してしまいました
>>944 のようなエラーが出てきた場合はどのような対処をすればいいですか?
--makeオプション付けてる?
Haskell が形式的手法に向いてて、テスト等のコストダウンにつながるみたいな話が出ていたが、 F#はその点どうなんだ? ・一応関数型言語 ・でもHaskellほど純粋じゃない ・M$開発なのもあって、使い始めてる企業もぽつぽつ ・.NET
質問です。
例えば、
ttp://ujihisa.nowa.jp/entry/83b42ba2e2 のプログラムはrunghcで動かす時はリストの一部が出力されますが、ghcでコンパイルして
動かすと何も出ないですよね?
無限リストなんかを処理が終わった部分から逐次出力する、というのはどうすればいいんでしょうか?
runghcの場合は大丈夫なのですがコンパイルして実行すると駄目です。
>>948 こんなふうに書き換えると最初の値だけは出力されるね。
GHCの実装の詳細までは知らないですが……
main = mapM_ (print . love) [0..10]
love :: Int -> Bool
love 0 = True
love k = love (k-1) && love 1
>>948 標準出力のバッファリングを無効にすればいい
import IO
main = hSetBuffering stdout NoBuffering >> ...
>>947 F#でも同じだろ。
静的型付け言語だし、再帰でプログラミングするし。
ただ、現状ではHaskellやOCamlの方が、証明支援ツールが充実している。
いくつか関数型言語を使う企業を見たり、経験しているが証明はまずしない。 定理証明支援系で証明できることはどうせたかが知れており、 これは業種にもよるので断言できないが、実際に保証したいことはまず 証明できない。できたとしても時間かかりすぎ。仕様が変更されれば 証明に要した労力も無駄。費用対効果の面から魅力を感じられない。 自動、半自動的な検証は当然大いに利用したいが、モデル検査はちょっと おおげさ。やはり言語に付属している型検査、型推論が妥当な手段になる。 企業側が関数型言語を選ぶのにはいくつか理由があるが、結構重要視されて いるのが、関数型言語を書ける人間を集める方が、Javaで集めるより、 当たりが多いという事実。もちろんそういう意味では機械証明ができる人材は 歓迎される。まあ、面接や2chのスレを見てる限り、これももうすぐ成り立た なくなるだろうけど。
>>952 > これは業種にもよるので断言できないが、
> 実際に保証したいことはまず証明できない。
まあ断言していいと思うよ。
NASAの中の奴らも これで衛星軌道に乗せる プログラムの証明やろうとして 職失ったしなw 今は曰く有りだから関わらん方が いいよ。趣味でどうしてもとかいう 好奇心旺盛な変態はいいと思うが
>>952 >いくつか関数型言語を使う企業を見たり、経験しているが
可能ならば、具体例きぼんぬ。
>>952 それは、計算機で数学の証明ができない、ということと等価なんでしょうか?
>>952 実際にHaskellやOCamlを使っているところは、単純に静的型チェックによる安全性を重要視してるんじゃない?
Javaなんかも静的型チェックがあるけど、HaskellやOCamlはもっと安全で、でも、Javaほど冗長じゃない
っていうのが普通に便利だと思うけど。
>>956 答えはNo.
できるけれども、現状では、難しすぎて実用的でないということ。
定理証明支援器は使うためにラムダ式の厳密な扱いができないとダメだし、ツールの使いやすさも
まだまだ発展途上。
最近Haskell始めたんだけど、 a b c d って式があったらそれだけ見てもb c dは関数なのかそうでないのかわからないよね? 定義してる部分を見るしかないの?
>>955 働いたり内部に首を突っ込んで詳しく聞いたのは外資金融系数社、大手、小規模含む。ocaml 2社、Haskell 2社。
全社をあげて取り組んでいたり、一部プロジェクトチームだけだったり。これ以上は勘弁。
他にも外資金融数社でF#などの採用を考えているという話。金融ではこれからの十年は関数型じゃないか?という噂。
金融じゃないが東大でもHaskellを使ってspin-outした若者達がいたよね。
>>956 あまり関係ありません。
証明を書けたとしても通常は時間が掛かりすぎて、問題自体が変化するなど、労力=給料に見合わない、ということです。
証明スクリプトを自在に書けるほどの人材なら、基本デザインに参加させることで安全性を向上させるほうがよいです。
>>957 まあ、そのとうり。
偏見かもですが、以上の会社/プロジェクトではオブジェクトは人間による静的解析を
難しくするのでどこでも人気ありませんでした。
式を値として扱う方法 がいまいちわかってない 練習問題5個ちょうだい
>>960 955ではないですが、もう少しお聞きしたいのですが、金融系で関数型というのは、
どういう部分で使ってるんでしょうか?リスク管理とかのシステムは割と金融工学
とかの人たちが多い印象があるんですが、そういう部分でしょうか。
>>960 関数型言語を使う企業情報サンクス。
知らないだけで、けっこう使われているのね。
>>959 基本的にはそう。aの型だけ見れば分かることもあるけど
別にこれはHaskell特有の事情じゃなくて、例えばCでも、
a(b, c, d)
という式を見ただけではbやcやdが関数かどうかは分からない
>>960 > 働いたり内部に首を突っ込んで詳しく聞いたのは外資金融系数社、大手、小規模含む。ocaml 2社、Haskell 2社
日本の会社ですか?
なんかネタ臭いな ひょっとしてビジネスロジックの計算部分だけとかそういうオチ?
Functions as Values って奴です日本語の意味は知りません
>>969 素朴な感覚として、数千人が従事したシステム開発で間違いが
あってはならない、というのは無理な相談だと思うが…。
関数型言語はそういう点でも期待されてるのかね。
>>970 海外の堅いシステム系の人に
質問したことあるけど結局金の問題
偉い人はたかがパソコンずらーっと並べて
金勘定させるのになぜこんなに金かかるんだ
安くしろ他社を出し抜けと思っているだけなんだよ
x8664版でりようしてるけど、初めて4G以上使ってしまった。 フィボでどこまでけいさんできるのか?して300000でシステムが不安定になったよ。^^; でも落ちなかったところが偉い。
>>962 全社をあげて取り組んでいるところは基本インフラは全部関数型。
といってもトレーダーに関数型言語を習わせるわけにもいかないし、
シミュレーションコアはC/C++な所もある。
大手だと既存インフラがあるので一部を強化、置き換える形で導入。
Quantsは基本的に言語理論知らないので、Quantsが関数型使おう
ということはまずない。よほど意識の進んだ頭のおかしいQuantsとか、
ITの人がプロジェクトとして始める。うまくいったり、理解を得られず
失敗したり。そういう意味ではリスキー。
Quantsの悪口を言うと言語理論どころか計算量も知らない奴とか、
C++早い、マンセーとか言いながら構造体をコピー渡ししたりとか
大手にもいるの。なので、気をつけて関数型で書けば、もとの
プログラムより早くなっちゃたりする。実はそういう業界。
>>965 日本にある会社はごく一部。全部外資。日本企業は知らね。
>>967 Haskellを採用している所は遅いからそうかもわからんね。
974 :
962 :2008/05/14(水) 11:10:58
>>973 ありがとうございます。基本インフラに関数型ってのは驚きですね。
それを売りにしようとしている企業なんでしょうか。
てっきり金融商品の価格設定計算だったり、リスク管理部門の計算
システムかと思ってました。デリバのリスク管理とかHaskellなんかが
向いてそうだなぁと。
インフラまで関数型か・・・ 具体的なコードがみたいな
米の一部金融系ではErlangを実戦投入してたことがあったとか聞いたような
>>972 不安定になるなら落ちたほうがまだマシだろw
単純な掲示板を作成するとしたらどんなライブラリを参照すればいいですか?
980 :
デフォルトの名無しさん :2008/05/14(水) 19:15:44
982 :
デフォルトの名無しさん :2008/05/14(水) 19:18:51
インフラなんかまともなプロファイラやデバッガがないと務まらんだろうに。 Haskellでローレベルな解析するツールがどれだけ充実してるんだか。
>>979 Network.CGI と Text.Html あたりじゃない?
どっちも使ったことはないけど。
関数を値として扱う方法が よくわかりません 例題を4題くだされ
ぼちぼち次スレ頼む。しかし最近は流れが早いね。いいことだ。
テンプレの改訂とか要望ある?
994 :
948 :
2008/05/15(木) 23:59:16