1 名前:デフォルトの名無しさん [04/02/10 22:16] Haskellの公式HP www.haskell.org/ 日本語サイト www.sampou.org/cgi-bin/haskell.cgi www.teu.ac.jp/kougi/koshida/Prog6/index.html 過去ログ、関連スレは>>2-5
2 名前:デフォルトの名無しさん mailto:sage [04/02/10 22:17] 過去ログ 関数型プログラミング言語Haskell Part1 pc.2ch.net/tech/kako/996/996131288.html Part2 pc2.2ch.net/test/read.cgi/tech/1013846140/ 関数型言語 Part1 pc.2ch.net/tech/kako/987/987954395.html Part2 pc3.2ch.net/tech/kako/1007/10073/1007387924.html Part3 pc2.2ch.net/test/read.cgi/tech/1037527388/l50 純粋関数型言語Concurent Clean pc2.2ch.net/test/read.cgi/tech/1075629340/l50 ML!!!!!! pc.2ch.net/tech/kako/1002/10021/1002111468.html 関数型プログラミング言語ML Part1 pc2.2ch.net/tech/kako/1012/10124/1012445015.html Part2 pc2.2ch.net/test/read.cgi/tech/1058630709/l50
3 名前:デフォルトの名無しさん mailto:sage [04/02/10 22:17] CommonLisp Scheme MacLisp .... Part1: piza2.2ch.net/tech/kako/987/987169286.html Part2: pc.2ch.net/tech/kako/1002/10025/1002584344.html Part3: pc.2ch.net/tech/kako/1008/10082/1008220265.html Part4: pc.2ch.net/tech/kako/1016/10162/1016211619.html Part5: pc3.2ch.net/tech/kako/1023/10230/1023091882.html Part6: pc3.2ch.net/tech/kako/1031/10315/1031560687.html Part7: ruku.qp.tc/dat2ch/0311/20/1042167213.html Part8: pc2.2ch.net/tech/kako/1058/10582/1058263391.html Part9: pc2.2ch.net/test/read.cgi/tech/1069594582/ Part10: pc2.2ch.net/test/read.cgi/tech/1075630259/l50 CommonLisp初心者スレ pc2.2ch.net/test/read.cgi/tech/1075464728/l50 Emacs Lisp Part1 pc2.2ch.net/test/read.cgi/tech/1004551074/ Part2 pc2.2ch.net/test/read.cgi/tech/1068467385/l50
4 名前:デフォルトの名無しさん [04/02/10 22:23] 4
5 名前:デフォルトの名無しさん mailto:sage [04/02/10 22:24] 5までいってないけど書き込んでもいいのかな? >>1 乙。 # MLスレの571他です。
6 名前:MLスレ662 mailto:sage [04/02/10 22:27] >>5 関数スレ見たらもう張るものもないので
7 名前:デフォルトの名無しさん mailto:sage [04/02/10 23:19] >>1 otu!
8 名前:デフォルトの名無しさん mailto:sage [04/02/11 00:46] Control.Exception にある catch や try や handle って IO a の型がからんでくるから、IO 関係ないとこだと使えないよね。 IO 関係ない関数での引数が気に入らないとかのエラー処理は、Maybe でやるのが Hakell 流なんでしょうか? それとも容赦なく error が使っちまうべきなんだろうか?
9 名前:デフォルトの名無しさん mailto:sage [04/02/11 00:52] >>8 > IO 関係ない関数での引数が気に入らないとかのエラー処理は、Maybe でやるのが Hakell 流なんでしょうか? Yes. Maybeがモナドであることの有難味がわかるよ。
10 名前:デフォルトの名無しさん mailto:sage [04/02/11 09:26] >>9 Maybe だといちいち Just か Nothing か判定して、 fromJust とかしいといけないから、めんどうだと思ったんだけど。 いまいち自分が Maybe を理解してない気もするな。 > Yes. Maybeがモナドであることの有難味がわかるよ。 その有難味を具体的に教えてください。
11 名前:デフォルトの名無しさん mailto:sage [04/02/11 12:29] >>10 例えば -- f, g x, h xのいづれかがNothingを返したとき、value_in_error_caseを返す。 (f >>= g >>= h) `maybeCatch` value_in_error_case ここで maybeCatch = flip . fromMaybe # ヒントをもらったら答えを聞く前に自分で考えてみるようにしたほうがいいと思う。 しかし、本当に > 引数が気に入らない が問題だというなら、より正しい対処は(適切な抽象型をもちいるなどして) そんなことがおこらないようにすること。 何か計算の結果が不確定である場合はしかたがないが。 アボートしていいプログラムやassertionならそもそもIOでのcatchもtryもいらない。 errorでいいし、時にはパターンマッチの失敗だけでいい。 f x | validity_check x = ...
12 名前:デフォルトの名無しさん mailto:sage [04/02/11 18:55] >>10 > その有難味を具体的に教えてください。 いちいち Just か Nothing か判定したり、 fromJust とかしなくていいところ。
13 名前:デフォルトの名無しさん mailto:sage [04/02/11 20:52] そっか、すぐ Maybe 外すことばかり考えていたけど、 (Just x) >>= k = k x Nothing >>= _ = Nothing とかで、気にせず Maybe 付いたままでいけばいいんだね。 どうもありがとう。
14 名前:デフォルトの名無しさん [04/02/13 07:34] >>11 小さなことだけど。 × flip . fromMaybe ○ flip fromMaybe ですよね。
15 名前:デフォルトの名無しさん mailto:sage [04/02/15 18:09] OO 言語だと、最初は大体 bank accounts の説明から始まりますよね。 Haskell で bank accounts を実装するとどうなるのでしょうか。
16 名前:デフォルトの名無しさん mailto:sage [04/02/15 19:03] >>15 bank accountsと一口にいわれてもよくわからないが… こういうこと(カプセル化)でないなら、 期待しているものが載ってるURLをくれ。 ポリモルフィズムはtype class。 継承は難しい。 # OOA, OODが全てではない。 -- テストしてない module BankAccount ( -- Do not export any constructor. name, money, newAccount --, query, ...etc ) where data Account = Account String Integer name (Account s m) = s money (Account s m) = m newAccount (s, m) = Account s m -- data Database = Database [Account] -- query (Database as) nm = filter ((== nm).name) as
17 名前:デフォルトの名無しさん mailto:sage [04/02/15 19:16] >>15 > OO 言語だと、最初は大体 bank accounts の説明から始まりますよね。 考えが古典的過ぎるのでは? C の構造体がどうのこうのとか。
18 名前:デフォルトの名無しさん mailto:sage [04/02/15 20:04] >>16 こういうのをお願いします。アカウントを複数作れて、それぞれに withdraw, deposit 可能な感じです。 mitpress.mit.edu/sicp/full-text/book/book-Z-H-20.html#%_sec_3.1.1 >>17 状態遷移を扱う例が他に思いつかなかったもので。OO かどうかにはこだわっていません。
19 名前:デフォルトの名無しさん mailto:sage [04/02/15 21:33] >>18 depositだけ実装。 どうしても > (withdraw 25) > 75 > (withdraw 25) > 50 こんなことがしたい、という意味? それとも、こういう機能があればいいのか? 例: $ ./a.out Print >> Status: [(0,100),(1,1000),(2,300)] Deposit 1 300 Deposit 2 400 Print >> Status: [(0,100),(1,1300),(2,700)] ^D 前者なら、 make_withdraw :: IORef Account -> Money -> IO Money make_withdraw ref money = do {x <- readIORef ref; writeIORef ref (x - money); readIORef ref} というのを作っておいて、 ref_account <- newIORef newAccount let withdraw = make_withdraw ref_account -- :: Money -> IO Money とする。 後者なら、普通は前者のような設計はしない。
20 名前:19 mailto:sage [04/02/15 21:34] >>19 一行目は編集ミスなので無視してくれ。
21 名前:デフォルトの名無しさん mailto:sage [04/02/15 21:44] >>19 × make_withdraw :: IORef Account -> Money -> IO Money ○ make_withdraw :: IORef Money -> Money -> IO Money
22 名前:デフォルトの名無しさん mailto:sage [04/02/15 22:27] >>19 どうもありがとうございます。 毎回出力する必要は無いので、後者だと思います。
23 名前:デフォルトの名無しさん mailto:sage [04/02/15 22:46] >>22 > 毎回出力する必要は無いので、後者だと思います。 なんかずれてるような。 > (withdraw 25) > 75 > (withdraw 25) > 50 このwithdrawは(同じ引数に対して別の値をかえすので) 関数じゃないというのはわかってる? だから、 withdraw :: Int -> Int ではなくて withdraw :: Int -> IO Int になる。別にIO Intにしたからって毎回出力するわけじゃないよ。
24 名前:デフォルトの名無しさん mailto:sage [04/02/15 22:53] >>22 depositだけ実装。 ============================ module Main where import Data.FiniteMap import Data.Maybe type Database = FiniteMap Int Int -- errors are silently ignored. deposit :: Database -> (Int, Int) -> Database deposit db (nm, mon) = fromMaybe db (lookupFM db nm >>= return . addToFM db nm . (+ mon)) testDB :: Database testDB = listToFM [(0, 100), (1,1000), (2, 300)] data Cmd = Deposit Int Int | Withdraw Int Int | Print | Error deriving Read ============================ 続く
25 名前:デフォルトの名無しさん mailto:sage [04/02/15 22:54] ============================ main = loop testDB where loop db = do s <- getLine cmd <- catch (readIO s) (\e -> return Error) case cmd of Deposit i m -> do loop $ deposit db (i, m) Print -> do putStrLn $ ">> Status: " ++ show (fmToList db) loop db _ -> do putStrLn ">> Sorry, not implemented" loop db ============================ 終わり
26 名前:デフォルトの名無しさん mailto:sage [04/02/16 21:05] >>23 どうもありがとうございます。 >このwithdrawは(同じ引数に対して別の値をかえすので) >関数じゃないというのはわかってる? なるほど。感覚的に難しいですね。頂いたコードはじっくり読ませて頂きます。 初心者なもので、時間がかかりそうですが。
27 名前:デフォルトの名無しさん mailto:sage [04/02/17 00:04] HaskellにLispの疑似関数型プログラミング感覚を持ち込むとはまる罠
28 名前:デフォルトの名無しさん mailto:sage [04/02/18 09:12] Haskell の短めのサンプルコードがたくさん解説されたり、アーカイブでまとめられている サイトはありますか?
29 名前:デフォルトの名無しさん mailto:sage [04/02/18 10:04] The Haskell School of Expression
30 名前:デフォルトの名無しさん mailto:sage [04/02/18 22:41] >>28 rwiki.jin.gr.jp/cgi-bin/rw-cgi.rb?cmd=view;name=Haskell UNIXコマンドのHaskellでの実装が多数あります。 というか、僕が書いたものが多いですが。 wikiなので勝手に書きこんじゃいました。 解説はしてませんが、短いコードが多いです。 参考になればうれしいです。 それと、メール欄にsageと書いておくことをようやく学びました。
31 名前:デフォルトの名無しさん mailto:sage [04/02/18 23:15] >>28 Preludeの関数を書く、ついてくるPreludeを読むのがお薦め。
32 名前:デフォルトの名無しさん mailto:sage [04/02/18 23:31] >>30 のリンクをみて。 uniq 改良版(getArgs...はかわらないのでstdin用) -- import Data.List main = interact $ unlines . map head . group . lines -- basename, wcあたりも面白そうだ。
33 名前:デフォルトの名無しさん mailto:sage [04/02/19 06:01] >>32 やられた。 そうか、groupが使えたか。 ちょっと悔しいな。 改良版も加えておきます。
34 名前:28 mailto:sage [04/02/19 11:04] 皆さんありがとうございます。 いろいろなコードをちまちまハックしたいと思います。 Haskell はまだリファレンスだけでは全くかけないので。
35 名前:デフォルトの名無しさん mailto:sage [04/02/19 12:48] a = [0, 1, 2, 3, 4] てなリストがあったとき、 f 3 a => [[0, 1, 2], [1, 2, 3], [2, 3, 4]] といった値を返す関数 f が欲しいのですが、 Haskell に標準であるでしょうか?
36 名前:デフォルトの名無しさん mailto:sage [04/02/19 14:33] List.hsとPrelude.hsを探したけど、無かった。 無いとは言いきれないけどね。 いちおうお求めの関数は f :: Int -> [a] -> [[a]] f num lst | length lst >= num = take num lst : f num (tail lst) | otherwise = [] でいいとは思います。
37 名前:デフォルトの名無しさん mailto:sage [04/02/19 14:41] あ、インデントが。 f num lst以下の2文はインデントを深くしないと、だめです。 いちおう念のため。
38 名前:デフォルトの名無しさん mailto:sage [04/02/19 14:57] myTakeを定義しておいて、(長さが足りないとNothing) g :: Int -> [a] -> [[a]] g num lst = mapMaybe (myTake num) (tails lst) これだとlst >> numでもOK
39 名前:デフォルトの名無しさん mailto:sage [04/02/19 15:01] myTake :: Int -> [a] -> Maybe [a] myTake n _ | n < 0 = Nothing myTake n _ | n == 0 = Just [] myTake n (x:xs) = case myTake (n-1) xs of Just xxs -> Just (x:xxs) Nothing -> Nothing myTake _ [] = Nothing
40 名前:デフォルトの名無しさん mailto:sage [04/02/19 15:37] takeMaybe :: Int -> [a] -> Maybe [a] takeMaybe n [] | n == 0 = Just [] | otherwise = Nothing takeMaybe n (x:xs) | n < 0 = Nothing | n == 0 = Just [] | otherwise = takeMaybe (n-1) xs >>= \r -> Just (x:r)
41 名前:デフォルトの名無しさん mailto:sage [04/02/19 16:59] >>30 wc.hs 書いてる人につっこみ。 data は複数形、単数は datum. -- 知っててやってるんだったら無視して下さい。 -- (data って変数名使えないから、とか。) あと下から4行目の data は datas の typo でしょう。
42 名前:デフォルトの名無しさん mailto:sage [04/02/19 17:00] こんなのでもいいかも。 import List h num lst = [ take num x | x <- tails lst, length x >= num ] i num = map (take num) . filter ((>=num) . length) . tails
43 名前:デフォルトの名無しさん mailto:sage [04/02/19 17:03] だんだんエレガントにしようとするところが関数型言語スレらしいな。 ############################# import Data.Maybe -- 再帰で書いてみた f n xs = catMaybes $ f' n xs where f' n [] = [] f' n xxs@(x:xs) = (takeJust n xxs):f' n xs -- AKA myTake and takeMaybe takeJust 0 xs = Just [] takeJust n [] = Nothing takeJust n (x:xs) = takeJust (n - 1) xs >>= \xs -> Just (x:xs)
44 名前:デフォルトの名無しさん mailto:sage [04/02/19 17:12] >>42 >>36 (無限リストにつかえない、何度もlengthを求める)よりは いいけど、takeとlengthを両方使うのは無駄がおおいのでいまいちかと。 -- テストしてない。多分遅い。 h num lst = filter ((== n) . length) $ f' num lst where f' num [] = [] f' num lst = take num lst:f' num (tail lst)
45 名前:デフォルトの名無しさん mailto:sage [04/02/19 17:15] >>44 訂正 >>36 (無限リストにつかえない、何度もlengthを求める)よりは と同じだね。
46 名前:デフォルトの名無しさん mailto:sage [04/02/19 17:22] >>41 そうか、そういえばそうだったな。 datasなんて単語はないのか。 指摘してくれてありがとう。 ま、いまのところは和製英語ってことで...。 そのうち直します。 日本人だと変数名には苦労するよね。 タイプミスは直しておきました。
47 名前:デフォルトの名無しさん mailto:sage [04/02/19 17:42] >>44 なるほど。 lengthを軽々しく使わないほうがいいのかもな。 じゃあ、こんなので j num = map (take num) . filter (biggerOrEqual num) . tails biggerOrEqual :: Int -> [a] -> Bool biggerOrEqual 0 _ = True biggerOrEqual n [] = False biggerOrEqual n (x:xs) = biggerOrEqual (n-1) xs
48 名前:デフォルトの名無しさん mailto:sage [04/02/19 18:05] >>47 無限リスト対応問題のほうはそれでいけるね。 > biggerOrEqual :: Int -> [a] -> Bool こういうのが欲しくなることは結構ある。おれは 大体再帰で頭を落としていくようにくむから、[]との比較ですむけど。 書くならこうかな。 biggerOrEqual n xs = [] /= drop n xs
49 名前:48 mailto:sage [04/02/19 18:08] biggerOrEqual -> longerThan
50 名前:デフォルトの名無しさん mailto:sage [04/02/19 18:14] longerThan だと Equal が含まれないよ。
51 名前:48 mailto:sage [04/02/19 18:21] >>50 だからそうかえたんだよ。
52 名前:デフォルトの名無しさん mailto:sage [04/02/19 18:26] >>48 なるほど、dropはnが大きすぎると[]を返すんだね。 きれいなやりかただ。 で、35の関数はわかりやすさと効率を考えると 以下のものがいいということになる? 38とほぼ同じ。少し見やすくしてみた。 効率がいいのはこれなのかな。 それとnum < 0のときはデフォルトのエラーを起こすようにした。 k num = mapMaybe (takeOfMine num) . tails takeOfMine 0 _ = Just [] takeOfMine n [] = Nothing takeOfMine n (x:xs) = maybe Nothing (Just . (x:)) $ takeOfMine (n-1) xs
53 名前:デフォルトの名無しさん mailto:sage [04/02/19 18:39] >>52 そんなもんかな。 # 個人的にはtakeOfMineは>>43 のtakeJustのほうが # Haskellらしくて好きだけどね。(48 == 43だったりする:-)
54 名前:デフォルトの名無しさん mailto:sage [04/02/19 19:02] >>53 Maybe Monadってやつね。 僕も好きだな。 でもこっちのほうが好き。 takeJust n (x:xs) = do xs <- takeJust (n-1) xs return (x:xs) なんか手続き型言語に擬態してるかんじが好き。
55 名前:デフォルトの名無しさん mailto:sage [04/02/19 19:08] なんだろ、インデントが重要な言語だと、困るよね。 どうしたらいいんだろう。 上の例ではreturn (x:xs)はxs <- takeJust ...にきっちり合わせないとエラー。
56 名前:by Chalice mailto:sage [04/02/19 19:30] >>55 > なんだろ、インデントが重要な言語だと、困るよね。 いや、困らん。 …でも困る人は{...;..;.}って書けばいい。 とここまでかいて、他の人はIEとかで プロポーショナルフォントでみているのだと気づいた。困るかも。
57 名前:デフォルトの名無しさん [04/02/19 21:47] k 0 がポイント: k 0 xs = [[]] ++ [[]|x <- xs] k n xs = [x:y|(x,y) <- zip xs (k (n-1) (tail xs))]
58 名前:デフォルトの名無しさん mailto:sage [04/02/19 22:00] >>56 インデントを掲示板でちゃんと表示できたらいいと思ったからさ。 > takeJust n (x:xs) = do xs <- takeJust (n-1) xs > return (x:xs) こう書けばいいのかな。
59 名前:デフォルトの名無しさん mailto:sage [04/02/19 23:27] >> 57 同じトピック内で同名関数が定義されたため、参照透明性が破られてしまいますた。 は冗談として、 m 1 xs = [[x] | x <- xs] m n xs = [x:xs | (x,xs) <- zip xs $ m (n-1) $ tail xs] でどうだろう。
60 名前:デフォルトの名無しさん mailto:sage [04/02/20 06:33] >>57 ,59 かなりきれいな解法だと思う。 いままでで一番いいかも。
61 名前:デフォルトの名無しさん [04/02/20 13:47] >>59 いや,f 0 にはそれなりの根拠があるので生かしておいて f n [] = [] f n xxs@(x:xs) = top n xxs ++ f n xs top 0 xs = [[]] top n [] = [] top n (x:xs) = map (x:) $ top (n-1) xs
62 名前:デフォルトの名無しさん [04/02/20 13:52] xxs@(x:xs)は不要なパターンでした f n [] = [] f n xs = top n xs ++ f n (tail xs) top 0 xs = [[]] top n [] = [] top n (x:xs) = map (x:) $ top (n-1) xs
63 名前:デフォルトの名無しさん mailto:sage [04/02/20 16:24] >>61 take* n ≒ top だね。map, ++ の使いかたあたりが微妙に遅そうにみえる。 >>57 が綺麗でよさそう。 # k 0 xs = []:[[]|x <- xs] # k n xs = zipWith (:) xs (k (n-1) (tail xs))
64 名前:デフォルトの名無しさん [04/02/20 16:29] zipWith ... 忘れていたよ。
65 名前:35 mailto:sage [04/02/20 17:03] >>36-64 みなさまありがとうございますm(_ _)m 私じゃぜんぜん思いつかないエレガントな解で、惚れ惚れいたしました。
66 名前:デフォルトの名無しさん [04/02/21 16:44] どういたしまして。もう一つ: f n xs = zipN $ take n $ tails xs zipN xss = if any null xss then [] else map head xss : zipN (map tail xss) ただし f 0 xs で暴走。
67 名前:(define (´∀`) 'マターリ) mailto:sage [04/02/22 10:08] 処理系が落ちてこないので、試さずに挑む。 f n xs = [[xs !! (x + y) | y <- [..n-1]] | x <- [..(length xs)-n]]
68 名前:デフォルトの名無しさん mailto:sage [04/02/22 11:23] >>67 たぶん、 × [..n-1] [..(length xs)-n] ○ [0..n-1] [0..(length xs)-n] でしょう。 この場合、僕がはじめに作った関数同様、 無限配列で使えないので解としては、やや劣ると思われます。 それと、いちいち(!!)を使うのは効率上どうなんだろうか。 処理系なしで作ったのならしかたないか。 普段はlispを使っているようですね。 はじめにいれる処理系はhugsがおすすめ。 多少なじんできたら、がんばってghcをいれるといいかも。 >>66 いいね。 これもわりと感動もんかも。 単純な処理だと思っても以外と奥が深いもんだな。 以下は別に新しい考えかたは何もないですが、 上のほうで作っていた関数を見やすくしてみました。 p n xs = if drop (n-1) xs == [] then [] else take n xs : p n (tail xs) dropとtakeを両方使ってるあたりが泥臭いかも。 無限配列を扱えるもののなかで最も素直な解だと思う。どうかな。
69 名前:デフォルトの名無しさん mailto:sage [04/02/22 11:38] >>68 しまった。 書き込んでから気付いたのだが、これだと p :: Eq a => Int -> [a] -> [[a]] になってしまう。 まあ、素直な解ということで許してほしい。
70 名前:デフォルトの名無しさん mailto:sage [04/02/22 11:53] もうひとつ素直な解を。 # q n = filter ((==n).length) . k n # where k _ [] = [] # k n xs = take n xs : k n (tail xs) どうだろう。
71 名前:(define (´∀`) 'マターリ) mailto:sage [04/02/22 12:31] f n xs = take ((length xs)-n+1) [take n x | x <- tails xs] f n xs = filter ((==n).length) [take n x | x <- tails xs]
72 名前:デフォルトの名無しさん mailto:sage [04/02/22 17:17] >>70 >>44 の#と一緒。
73 名前:デフォルトの名無しさん [04/02/22 17:48] >>71 > f n xs = filter ((==n).length) [take n x | x <- tails xs] でも素直でわかりやすい。同じだけど: f n xs = filter ((==n).length) $ map (take n) $ tails xs 「関数のn乗」って関数はなかったんでしたっけ: f n xs = (iterate chop $ map (take n) $ tails xs) !! n chop (x:xs) = if null xs then [] else x : chop xs f n xs = map (take n) $ chopn n $ tails xs chopn n xs = fst $ foldr _chopn ([], n) xs where _chopn x (xs, n) = if n > 0 then (xs, n - 1) else (x:xs, 0)
74 名前:デフォルトの名無しさん mailto:sage [04/02/22 18:12] >>73 「関数のn乗」 -> ない。 chop -> init > f n xs = map (take n) $ chopn n $ tails xs > .... 無限リストに使えん。 気持ちは分かるんだが、 新しい良いアイディアが含まれていなかったり、 明らかに良くない方法だったりするものを 無闇に書き込むのは止めないか?(せめて欠点を併記するとか) 他の初心者が無分別に使うかもしれないし、 いいアイディアのものが埋もれる。 中級者以上(?)には面白くないし。
75 名前:デフォルトの名無しさん [04/02/22 18:59] >>74 > 「関数のn乗」 -> ない。 なぜないんでしょう,あってもよさそうなのに。 > chop -> init ありがとう。では直しておきます。 f n xs = (iterate init $ map (take n) $ tails xs) !! n これは無限リストで大丈夫ですね。 > 新しい良いアイディアが含まれていなかったり、 > 明らかに良くない方法だったりするものを > 無闇に書き込むのは止めないか?(せめて欠点を併記するとか) 欠点を併記するというのはいいですね。でも,今まで前を拾うこ とばかりしいたから,今度は後ろを落としてみたらどうかという 発想なので「無闇に」というのとは違いますよ。
76 名前:デフォルトの名無しさん mailto:sage [04/02/22 19:20] > 「関数のn乗」 手許に処理系ないんだけど、foldl とか (.) とかで簡単に作れそうな。
77 名前:74 mailto:sage [04/02/22 20:18] >>75 > 発想なので「無闇に」というのとは違いますよ。 失礼。 あなただけに書いたわけではなくて、>>70-71 などを指していた。 > 「関数のn乗」 (iterate f x) !! n が普通なんだろうけど、 自分でtail recursiveな nest :: (a -> b) -> a -> Int -> b nest' :: (a -> b) -> a -> Int -> b -- strict あたりを書いたほうが、速くていいね。 標準にあったほうがいいというのに同意。 > 手許に処理系ないんだけど、foldl とか (.) とかで簡単に作れそうな。 foldlは無駄な処理をするのでまずい。 composition f n = foldr (.) id $ replicate n f あたりか。
78 名前:74 mailto:sage [04/02/22 20:18] 最後は>>76 宛。
79 名前:74 mailto:sage [04/02/22 20:19] なんどもすまん。 nest :: (a -> a) -> a -> Int -> a だね。
80 名前:デフォルトの名無しさん [04/02/23 21:34] >>77 > 標準にあったほうがいいというのに同意。 ですよね。標準でないのは f^n は複数の n に対して評価する 可能性があるのでリストにキャッシュしておけ,という主張か とも思ったのですが。あっても悪くない気がします。 f n xs = (transpose $ map inits $ tails xs) !! n (制限:n は xs のサイズ以下,無限リスト可)
81 名前:デフォルトの名無しさん mailto:sage [04/02/29 06:43] なんとなくテクニックの紹介をしてみる。 Haskellのリストは一つの型しか保持できない。 しかし、複数の型であっても、その間に「関係」があれば、 それらの型をラップし、一つのリストにいれた上で使用することができる。 -------------- {-# OPTIONS -fglasgow-exts #-} -- different types data A = A String deriving Show methA (A x) = length x data B = B Int deriving Show methB (B x) = x -- but they have the methods of the same return type Int data C = forall x. C x (x -> Int) runC (C x f) = f x testC = map runC [C (A "I am A") methA, C (B 100) methB] -- if they belong to the same type class data ShowC = forall x. (Show x) => ShowC x instance Show ShowC where show (ShowC x) = show x testShowC = show [ShowC $ A "I am A", ShowC $ B 100] -- nearly nonsense data X = forall x. X x
82 名前:デフォルトの名無しさん mailto:sage [04/03/03 22:00] sage
83 名前:デフォルトの名無しさん [04/03/23 15:38] GHC-6.2.1 released
84 名前:デフォルトの名無しさん mailto:sage [04/03/23 22:23] Functional Programming With Haskell www.amazon.com/exec/obidos/tg/detail/-/0077093305/ 久々の新刊かも
85 名前:デフォルトの名無しさん mailto:sage [04/03/23 22:46] >>84 豪快に割引されてますな。
86 名前:デフォルトの名無しさん mailto:sage [04/03/23 22:49] 前スレでガイシュツだったのか。 pc2.2ch.net/test/read.cgi/tech/1013846140/ #554 一年以上も前に。
87 名前:デフォルトの名無しさん mailto:sage [04/03/24 12:00] wxHaskell使ってる人っている?
88 名前:デフォルトの名無しさん mailto:sage [04/03/24 16:27] >>84 ペーパーバックで5000円か…
89 名前:デフォルトの名無しさん mailto:sage [04/03/25 06:54] >>87 できあがる実行ファイルがでかすぎる
90 名前:デフォルトの名無しさん mailto:sage [04/03/30 23:30] >>89 Minimulコードでどれぐらい?
91 名前:デフォルトの名無しさん mailto:sage [04/03/31 02:56] >>90 @ Mac OS X 10.3 --- Hello.hs module Main where import Graphics.UI.WX main :: IO () main = start hello hello :: IO () hello = do f <- frame [text := "Hello world!"] quit <- button f [text := "Quit", on command := close f] set f [layout := widget quit] --- $ ghc -package wx -o hello Hello.hs で、helloのサイズが7M強。
92 名前:デフォルトの名無しさん mailto:sage [04/03/31 17:53] stripして3M弱だな。
93 名前:デフォルトの名無しさん mailto:sage [04/04/03 19:31] そりゃすげえな
94 名前:デフォルトの名無しさん [04/04/03 19:37] よくしんねぇけど、 ツールキット全部そんなかに入ってんじゃないの? だったら仕方ねぇと思うけど。 外出しには出来ねぇのかな?
95 名前:デフォルトの名無しさん mailto:sage [04/04/07 21:00] GHC を ports の導入されていない FreeBSD に導入したいんだが どうすればいいのだろう?
96 名前:デフォルトの名無しさん mailto:sage [04/04/07 21:11] make install
97 名前:デフォルトの名無しさん mailto:sage [04/04/07 21:13] a) portsを入れてmake install b) packageを持ってきてpkg_add
98 名前:デフォルトの名無しさん mailto:sage [04/04/07 21:47] みんなまずインタプリタで開発して、 安定してきてリリースする間際にコンパイラに移行するの? インタプリタで正常動作してるけど、コンパイラではうまく動かないってこと多い? Haskellってコンパイル撃遅い(というか長い)ッてきいたけどマジ?
99 名前:デフォルトの名無しさん mailto:sage [04/04/07 22:07] >>96 GHC のコンパイルには GHC バイナリが必要です >>97 ports や package は教育上入れてもらえない学生さんなんですよ
100 名前:デフォルトの名無しさん mailto:sage [04/04/08 14:25] >>99 FreeBSD の ftp サーバの ports/distfiles に ghc-<version>-i386-unknown-freebsd-boot.tar.bz2 があるからこれを展開して, ghc のコンパイル時にこの展開先にある ghc を指定してコンパイルすればok. ちなみに ports も同じことをしている(処理が自動化されてるだけ). >>98 コンパイルはたしかに激遅. プログラマが楽するためにコンピュータに頑張ってもらってる感があるね.