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
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 コンパイルはたしかに激遅. プログラマが楽するためにコンピュータに頑張ってもらってる感があるね.
101 名前:デフォルトの名無しさん mailto:sage [04/04/08 15:40] マニュアル印刷したいんだけど、1枚のHTMLにしてくんないかな。印刷しづらい。 www.sampou.org/haskell/report-revised-j/
102 名前:デフォルトの名無しさん mailto:sage [04/04/08 15:53] >>101 そんなのちょこっとスクリプト走らせれば楽勝だろ?
103 名前:デフォルトの名無しさん mailto:sage [04/04/08 19:12] >>98 > みんなまずインタプリタで開発して、 おれはそうしてる。GHCiでときどきHugsでチェック。 > インタプリタで正常動作してるけど、コンパイラではうまく動かないってこと多い? そんな経験は無い。
104 名前:デフォルトの名無しさん mailto:sage [04/04/08 20:10] >>100 ありがとう 試してみてうまくいったらまた報告します
105 名前:デフォルトの名無しさん mailto:sage [04/04/08 22:55] NHCの方が良質のコードを生成するって聞いたことあるけど、 もう今は昔の話なのかな?
106 名前:デフォルトの名無しさん mailto:sage [04/04/08 23:14] このスレでも聞いてみる。 Scheme,OCaml,Haskell,Clean、覚えて「損しない」「一番得」 な言語はどれ。ぶっちゃけ周辺ライブラリーが充実してるのどれ。
107 名前:デフォルトの名無しさん mailto:sage [04/04/08 23:20] >>106 得するのは、全部覚えること。 得しないのは、ひとつしか覚えないこと。
108 名前:デフォルトの名無しさん mailto:sage [04/04/08 23:54] >>106 若いなら全部やれ
109 名前:デフォルトの名無しさん mailto:sage [04/04/09 00:27] >>105 コンパイルは速いけどね。 Hugs/GHC共通のHierachical moduleの多くが使えないのが痛すぎる。 今試しに main = interact id をnhc98(FreeBSD-CURRENT, from ports)でコンパイルしたらbus error....
110 名前:デフォルトの名無しさん mailto:sage [04/04/09 00:34] r抜けてたHierarchical
111 名前:デフォルトの名無しさん mailto:sage [04/04/12 16:54] >>106 統計やるならRが結構ナイスだ。
112 名前:デフォルトの名無しさん mailto:sage [04/04/12 22:37] >>110-111 Rスレはこっちに↓あ〜る = 統計解析フリーソフト R = science2.2ch.net/test/read.cgi/math/1062650510/
113 名前:デフォルトの名無しさん [04/04/14 12:02] 工科大の www.teu.ac.jp/kougi/koshida/Prog6/Text08/index.html の問題1 ですが、 > sigma :: (Int -> Int) -> (Int -> Int) > 上記の関数sigmaを,1) ラムダ記法を使って,2) 関数の部分適用を使って,定義せよ.ただし,sigma fは,自然数nに対して > f 0 + f 1 + ... + f n > を計算する関数とする. lambda 版 は以下のように作成しました。 sigmaLambda :: (Int -> Int) -> (Int -> Int) sigmaLambda f = \x -> sum [f i | i <- [0 .. x]] で、部分適用版ですが、 sigma :: (Int -> Int) -> Int -> Int sigma f 0 = f 0 sigma f n = sigma f (n-1) + f n で、いいんでしょうか。 題意のような関数を返すのですが、部分適用という感じがしません。 出題者がどのような回答を期待しているか知りたいのですが。 (あと、なんか lambda版を、内包表現とか使ってて、出題意図に沿ってないような気がするのです)
114 名前:デフォルトの名無しさん mailto:sage [04/04/14 13:37] >>113 > 題意のような関数を返すのですが、部分適用という感じがしません。 addNum'' n m = n + m に部分適用を使ったといっているのだからそれでいいだろう。 sigmaPartial f n = sum [f m | m <- [0..n]] > (あと、なんか lambda版を、内包表現とか使ってて、出題意図に沿ってないような気がするのです) それなら使わなければいいのでは? sigmaLambda = \f n -> if n == 0 then f 0 else sigmaLambda f (n - 1) + f n
115 名前:デフォルトの名無しさん [04/04/14 14:00] sigma,sigma' :: (Int -> Int) -> (Int -> Int) sigma f = \ n -> foldl (\ s i -> s + f i) 0 [0..n] sigma' f = let iter s x = if x < 0 then s else iter (s+f x) (x-1) in iter 0
116 名前:デフォルトの名無しさん mailto:sage -- "let" sucks! [04/04/14 14:37] import Control.Monad.Fix (fix) -- fix f = f (fix x) sigma = flip fix 0 $ \s t f n -> if n < 0 then t else s (t + f n) f (n - 1)
117 名前:デフォルトの名無しさん mailto:sage [04/04/14 14:38] fix f = f (fix f)ね。
118 名前:デフォルトの名無しさん mailto:sage [04/04/19 19:21] Haskell に例外処理の機構はあるの?
119 名前:デフォルトの名無しさん mailto:sage [04/04/19 19:37] ある。 Haskell98でもIOモナドからthrowできる例外(IOError)があるし、 最近のGHC、Hugsでは普通の関数からも例外(Exception)をthrowできる。 catchはIOモナドの中でおこなう。 参照: Control.Exception
120 名前:デフォルトの名無しさん mailto:sage [04/04/20 23:50] Haskell勉強中なんですけど、 「モナドは継続渡しを提供する」という大雑把な理解でいいでしょうか? ・・・違うかな?
121 名前:デフォルトの名無しさん mailto:sage [04/04/24 22:23] なんで Prelude で (!!) は Integer じゃなくて Int で定義されているの?
122 名前:デフォルトの名無しさん mailto:sage [04/04/25 02:07] >>121 実際問題それ以上使うことはないからだろう。 Haskell 98 Report によると maxBound::Int は少なくとも 2^29-1。 (!!)のインデックスは0-originだから、長さ2^29のリストまで扱える。 これ以上の長さのリストを使う場面は……。
123 名前:デフォルトの名無しさん mailto:sage [04/04/25 12:41] 円周率の世界記録に朝鮮したい人はどうすれば?
124 名前:デフォルトの名無しさん mailto:sage [04/04/25 18:11] >>123 自分で最低義すれ。
125 名前:デフォルトの名無しさん mailto:sage [04/04/26 14:54] >>123 円周率は全桁保持していなくても次を計算できたはず。 >>124 アドレスの制限があるから多くの計算機と既存の処理系では 再定義しても無駄。
126 名前:デフォルトの名無しさん mailto:sage [04/04/26 23:48] >>120 こんなん見つけた ttp://www.jaist.ac.jp/~kiyoshiy/writing/wadler_essenceoffunctionalprogramming.pdf ここの資料はjaistのゼミ資料? 他にはHaskellDBが自分的に興味深い. TorqueとかHibernateなんて目じゃない. Haskellだけど…
127 名前:デフォルトの名無しさん mailto:sage [04/04/27 14:27] >>121 haskell@でもちょうど議論されてるね。 上ででたものの他に、こういう意見があった。 Integer派: * Lazyにcreated/destroyedなデータならアドレスの制限を 受けずに大きいものを利用できるはずだ。 * Intは一般的なケースへの最適化であり、 "Premature optimization is the root of all evil." Integerには反対派: Integerにするのは、巨大なリストという特殊な状況への最適化である。 (Integral b) => がよろしい。
128 名前:デフォルトの名無しさん mailto:sage [04/04/27 18:46] Hanatani さんすげーな。 オレもああいう凄腕Haskellerになりたい。
129 名前:デフォルトの名無しさん mailto:sage [04/04/28 12:39] >>128 なんか凄いもの作ったの?