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
294 名前:292 mailto:sage [04/10/20 20:09:56] >293 putStrのあとに hFlush stdout を入れてやったらうまくいきました。 でも最初は実行順序が狂ってるのかと思ってしまいました。
295 名前:デフォルトの名無しさん mailto:sage [04/10/20 22:40:10] >>294 ghcはターミナルではLineBufferingだから一行たまるまで出力されない。 hSetBuffering stdout NoBufferingを最初に書いてもいい。 >>291 >>293 手で地道にpoint-freeに書き換えました:-) 元は確か -- not tested c n m = length $ filter ((m ==).length.filter id) $ foldl (\ys xs -> [ x:y | x <- xs, y <- ys]) [[]] $ replicate n [True,False] こんな感じ。 自動化してフィルタプログラムにするとおもしろそう。
296 名前:292 mailto:sage [04/10/20 23:26:27] 表示の問題は解決したんですが、他の部分に影響が出てしまいました。 プロンプトからの入力をParsecを使ってパースしようとしてるんですが、 文法の都合上Parsecのtryを使ってる部分があります。 hFlushとかstdoutは import IO しないといけないみたいなのでやってみると そのtryを使っているところで ERROR ".\test.hs":15 - Ambiguous variable occurrence "try" *** Could refer to: System.IO.Error.try Text.ParserCombinators.Parsec.Prim.try とかいうエラーが出てしまいます。(処理系はhugsです。ghcでも似たようなエラー) どうしたら良いんでしょう? 一応パーサの部分とstdoutが必要な部分は完全に切り離されているので パーサ部分を別のモジュールにしてやることで回避出来ることは確かめましたけど、 それ以外の方法はあるのでしょうか?
297 名前:デフォルトの名無しさん mailto:sage [04/10/20 23:55:30] >>296 import qualified Text.ParserCombinators.Parsec as Parsec して Parsec.try と書くとか import System.IO.Error ( hFlush, stdout, ... -- tryを以外だけリスト) とか For futher details, see section 5.3 of the Haskell 98 report.
298 名前:292 mailto:sage [04/10/21 00:45:52] >>297 ありがとうございます。 後者のやり方を使ってみます。
299 名前:デフォルトの名無しさん mailto:sage [04/10/21 08:35:37] >>295 おおう、そのcならまともに読めますね。 ((=<<) . (. (return .) . (:)) . (>>=)) の部分はやはりlist comprehensionからの変形か。 [[Bool]]が渡っているところをfuseして、さらに読解不能なコードにできるかもw ところで、monadの話はどうなった。
300 名前:デフォルトの名無しさん mailto:sage [04/10/24 15:41:02] なぜ、関数型言語は、Hello Worldを隠したがりますか?
301 名前:デフォルトの名無しさん mailto:sage [04/10/24 15:43:54] ∩___∩ | | ノ\ ヽ | / ●゛ ● | | | ∪ ( _●_) ミ j 彡、 |∪| | >>300 / ∩ノ ⊃ ヽ ( \ / _ノ | | .\ “ /__| | \ /___ /
302 名前:デフォルトの名無しさん mailto:sage [04/10/24 17:18:58] Haskellはじめたばかりなのですが、よくわからないので教えてください。 a = "b" b = 1 c = do "c" d = do 2 と書いて、dだけ、 *** Binding : d *** Outstanding context : (Monad b, Num (b c)) と言われるのはなぜですか?
303 名前:デフォルトの名無しさん mailto:sage [04/10/24 20:58:48] 文字列は文字のリストで、リストはMonadクラスのインスタンスだから。 数値はMonadクラスのインスタンスではないから。
304 名前:デフォルトの名無しさん mailto:sage [04/10/24 23:11:39] >>303 ありがとうございます。 doの中からは、Monadクラスのインスタンスを返すことは出来るけど、 他のものは返せないと。 doの中から数値を返したい場合はどうしたらよいのでしょうか? Monadクラスのインスタンス作って返すしかないってことでしょうから、 returnを使って、IOモナドを返せばいいということなのでしょうか? IOモナドって使わなくてすむなら使わないほうがいいみたいなのですが、 数値を返す関数はdo使わなくてもかけるだろうってことなのかな? Haskellは難しいです。頭がクラクラします。
305 名前:デフォルトの名無しさん mailto:sage [04/10/25 00:15:45] >>304 > doの中から数値を返したい場合はどうしたらよいのでしょうか? 一般には無理。リスト等、中身を取り出せるモナドもある。 f :: Int f = head $ do return 3 > 数値を返す関数はdo使わなくてもかけるだろうってことなのかな? なんでモナドが使いたいのかわからない。 例えばどんな「数値を返す関数」にモナドを使おうと思うわけ?
306 名前:デフォルトの名無しさん mailto:sage [04/10/25 01:22:05] ∧_∧ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ( ´ 曲`) < モナドナ♪ドーナー♪ドーナー♪ ⊂ )つ \_____________ (_⌒ヽ )ノ `J
307 名前:デフォルトの名無しさん mailto:sage [04/10/25 08:27:33] >>304 引数をとらずに数値を返す関数を書きたいということですか。 Haskellの場合、引数なしの関数は値そのものとまったく同じものになります。 C言語などでは、int some (void) { return 3 }とint some = 3は違うものですが、 Haskellではsome = 3 :: Intとなり両者の区別は存在しません。 また、doの意味を誤解しているようですね。 doというのはある種のシンタックスシュガーで、 do a b c という表記は a >> b >> cというように解釈されます。 この(>>)はMonadクラスで定義された関数なので、 doをMonadクラス以外のものに適用しても意味がありませんし、 doの後に式がひとつの場合も意味がありません。 Haskellの考え方になじむまでは難しく感じると思いますが、 段階をふんで理解していけば大きな困難はないと思います。 hugsでいろいろな関数をつくって遊んでみることをおすすめします。 洋書ですが、「The Craft of Functional Programming」がおすすめです。
308 名前:デフォルトの名無しさん mailto:sage [04/10/25 08:50:08] >>307 訂正 do a b c
309 名前:デフォルトの名無しさん [04/10/25 11:14:48] >>307 > C言語などでは、int some (void) { return 3 }とint some = 3は違うものですが、 > Haskellではsome = 3 :: Intとなり両者の区別は存在しません。 int rand(void) に相当するものはどうなるのでしょうか?
310 名前:デフォルトの名無しさん mailto:sage [04/10/25 11:46:20] >>309 Haskellでは関数は毎回同じ値がかえってこないといけないので、 そのようなものはありません。 では乱数はどうするかというと、 ramdom :: (RandomGen g) => g -> (a, g) のように、generatorを渡して乱数を生成し、次のgeneratorを 返すことで実現します。 実際にはこのままでは使いにくいので、 randoms :: (RandomGen g) => g -> [a] と無限リストにするか(これがお薦めです)、 C言語と同じ様に副作用によってgeneratorの状態を保存するために モナドを用います。 # System.Randomで乱数関係の関数が定義されています。
311 名前:me /= 309 mailto:sage [04/10/25 11:54:05] >>310 こういう、Haskell風の思想を交えた解説は新参者にとって非常に参考になります。
312 名前:304 mailto:sage [04/10/25 13:46:10] 出来れば、あまり人に頼らず勉強したいところなのですが、、、 申し訳ないのですが、考え方があまりに違うので、質問させてもらっています。 詳しく解説していただけて、非常に感謝しております。頭が下がります。 >>305 モナドを使いたくて、doを使っているわけではありません。 doを使いたくて知らないうちにモナドを使っていたようです。 >>306 doについてよく理解していないことがわかりました。 単にc言語の{}に対応した表現が出来るものだと思っておりましたが、違うのですね。 洋書は気合入れて買ってみても、 結局、挫折することは目に見えているので控えさせていただきます。 翻訳版が出るとうれしいです。 関数は同じ値を返さなくてはならないというのも面白いですねぇ。 >>311 ありがたい話しです。 モナドもよくわからない、Haskellのジェネレータもよくわからない。 とにかく、わからないことずくめなので、ゆっくり腰を据えて勉強するしかないなぁ。 Java知ってるから、C#も1日でだいたいわかるって具合には行かないですねぇ。
313 名前:デフォルトの名無しさん mailto:sage [04/10/26 00:20:02] 関数型のプログラムのコツは写像を追うことです、 JavaとかCとかやってると、どうしても手続きに目がいってしまって最初は全然まともに組めないです。 他にも、プログラム中に時間概念が無いので時系列を作り出す必要があるという点にも馴れにくかったです。 この辺はまるで相対論よろしく時間を次元の一つとして捉えて4次元空間的を直接取り扱う感覚を覚えました、 そんな感じで、過去から未来まで全部お見通しの神様の気分でプログラムしてます。 こんな感覚になるまで、僕もかなりの期間悩みました。 乱数なんかもそうですよね、あらかじめ無限個ある全ての乱数を作って置いておくという、 Javaなんかやってると、この感覚はそう簡単にはなじめないですね。
314 名前:デフォルトの名無しさん [04/10/27 17:44:25] --------------------------- import Numeric f :: Float -> Int -> Float f x n = sin (pi*x*(2*n+1)) ----------------------- このプログラムがエラーになる理由を教えてください。 型が不一致といわれるのですが。
315 名前:デフォルトの名無しさん mailto:sage [04/10/27 17:58:07] >>314 n が何なのか知らないが、pi は Float ではなくて?
316 名前:デフォルトの名無しさん [04/10/27 18:04:16] nは整数(自然数)のつもりです。 piは標準ライブラリ定義されているFloatの定数だと思います。 この関数定義自体が出来ないみたいなんですが。
317 名前:デフォルトの名無しさん mailto:sage [04/10/27 18:43:04] >>314 型があわない。 f x n = sin ( pi * x * (2.0 * (fromIntegral n) + 1.0))
318 名前:デフォルトの名無しさん mailto:sage [04/10/27 18:43:12] >>314 型の不一致。 (*) :: Num a => a -> a -> a なので、例えばaがIntでは、Int -> Int -> Intとなり、 aがFloatならば、Float -> Float -> Floatとなる。 違う型同士のかけ算はできない。 この場合、fromIntegralを利用して以下のようにすればいい。 f :: Float -> Int -> Float f x n = sin (pi*x*(2*fromIntegral n+1))
319 名前:デフォルトの名無しさん [04/10/27 19:04:19] ありがとうございます。 fromIntegralで型変換(?)しなきゃ掛け算できないんですね。 ちょっと面倒ですけど、rubyで(1/n)とやるとn>=2で0になってしまう(←これが分からず何時間もロスした^^;) とかよりは明確でいいんですかねぇ。
320 名前:デフォルトの名無しさん [04/10/27 19:08:53] 追加です。 c x t n = (4.0/pi) * exp (-pi^2*t*(2*fromIntegral n+1)^2) * sin (pi*x*(2*fromIntegral n+1)) + (c x t (n - 1)) c x t (-1) = 0 これで「c0.5 0.001 10」を評価するとスタックオーバーフローしてしまう理由を教えてください。
321 名前:デフォルトの名無しさん mailto:sage [04/10/27 19:35:19] これは関数定義の順番の問題。 Haskellでは、先に書かれたものから順にパターンマッチが行われるため、 c x t n = ...はnに対する条件がないため、 nが-1のときもこっちが適用されてしまい、無限ループにおちいる。 c x t (-1) = 0 c x t n = ... の順に並べれば問題は解決する。
322 名前:デフォルトの名無しさん mailto:sage [04/10/27 22:11:34] www.teu.ac.jp/kougi/koshida/Prog6/text02.html ここで使っている、 文字→コード ord :: Char -> Int コード→文字 chr :: Int -> Char という関数が定義されていないようです。 環境はwindows 2000 でhugsを使っています。 :versionと入力すると、以下のように出ます。 -- Hugs Version Nov 2003 :browse Preludeとしてみてもordという関数はないので バージョンUPして使えなくなったということでしょうか?
323 名前:デフォルトの名無しさん mailto:sage [04/10/27 22:38:22] Prelude> :l Char Char> :t ord ord :: Char -> Int
324 名前:デフォルトの名無しさん [04/10/27 23:04:58] >>319 わざわざ Float->Int->FloatにしようとするからfromIntegralが 必要になる。 f x n = sin ( pi * x * (2 * n + 1)) だけで明示的に型を指定するのやめれば *Main> :t f forall a. (Floating a) => a -> a -> a という型になるがあとは勝手にやってくれるよ。
325 名前:デフォルトの名無しさん mailto:sage [04/10/27 23:10:08] あーでもそれじゃnに整数以外の数つっこめちゃうのでだめか。
326 名前:320 [04/10/28 22:17:40] >>321 ありがとうございます。gnuplotでグラフを書かせるためのファイルを 出力しようと目論んでいるのですが、rubyより知的な気分ですね。 可読性はどうなんでしょう。 多少字面は見づらいけど、数学みたいに書けて コンピュータ特有のことを考えないで済む分楽かもしれませんね。
327 名前:デフォルトの名無しさん mailto:sage [04/10/29 01:33:14] >>323 なるほど。:loadしないと使えないのですね。 runhugsやGHCで使う場合というか、ファイルに書いておいて使う場合は、 (なんていったらよいのでしょう?) import Charすればよいのですね。わかりました。 ありがとうございます。
328 名前:デフォルトの名無しさん mailto:sage [04/11/03 13:44:05] みんなこの言語使って何やってるの?
329 名前:デフォルトの名無しさん mailto:sage [04/11/03 15:47:57] 「最近Haskellっていう言語勉強しててね。 いやーCとは全然違うすごい言語だよ。 関数型って言うんだけどね。」 「すごーいよく分からないけどかっこいいー」
330 名前:デフォルトの名無しさん mailto:sage [04/11/03 16:40:43] 「最近Haskellっていう言語勉強しててね。 いやーCとは全然違うすごい言語だよ。 関数型って言うんだけどね。」 「すごーいよく分からないけどかっこいいー。じゃあ、今晩はカレーにしようか?」
331 名前:デフォルトの名無しさん mailto:sage [04/11/03 17:16:56] 今晩はカリーか。
332 名前:デフォルトの名無しさん mailto:sage [04/11/03 17:18:14] 今晩はカリだ。
333 名前:デフォルトの名無しさん mailto:sage [04/11/03 20:22:31] アライグマ Haskell
334 名前:デフォルトの名無しさん mailto:sage [04/11/05 01:38:12] >>328 言語習いたてのワクワクをモ一度味わいたくて。 とりあえずKISSローダ作るのが目標です。
335 名前:デフォルトの名無しさん mailto:sage [04/11/05 08:51:13] KISSローダってなんですか
336 名前:デフォルトの名無しさん [04/11/21 20:03:44] CommonLisp/Scheme と Haskel と ML の中で一番実用に近いのは何? 私は CommonLisp だと思うんだけど。
337 名前:デフォルトの名無しさん mailto:sage [04/11/21 20:09:03] >>336 比較対象が微妙に違っているわけだが。
338 名前:デフォルトの名無しさん [04/11/22 09:26:06]
339 名前:デフォルトの名無しさん mailto:sage [04/11/22 11:49:50] すみません。最近勉強を始めた者ですが、頭が悪いものでどうにもわからず 困っています。よろしければご教授願えませんでしょうか。 3つをまとめる関数 zip3 を zip を用いて定義せよ、という問題で zip3 :: [a] -> [b] -> [c] -> [(a,b,c)] zip3 (x:xs) (y:ys) (z:zs) = change (zip (zip x y) z) : zip3 xs ys zs where change :: [((a,b),c)] -> [(a,b,c)] change [((x,y),z)] = [(x,y,z)] zip3 _ _ _ = [] というものを考えたものの、どこがどう悪いのか自分ではわかりません。 1週間悩んで進展なしで独力では無理なようなので、どなたかお教えいただけませんでしょうか?
340 名前:デフォルトの名無しさん mailto:sage [04/11/22 12:36:43] zip3 :: [a] -> [b] -> [c] -> [(a,b,c)] zip3 xs ys zs = map change $ zip xs (zip ys zs) where change (x,(y,z)) = (x,y,z)
341 名前:デフォルトの名無しさん mailto:sage [04/11/22 15:58:39] >>339 型があってない。っていうかzip使ってない。 > zip3 (x:xs) (y:ys) (z:zs) = change (zip (zip x y) z) : zip3 xs ys zs x , y, z :: aだから zip x y とはできない。(もともとa = [b]でないかぎり) zip3 (x:xs) (y:ys) (z:zs) = (x, y, z) : zip3 xs ys zs と書こうとしてるわけだからこれではzipの使いようがない。 参考>>184 の上半分 zip3 x y z = (,,) <$> x <-> y <-> z
342 名前:デフォルトの名無しさん [04/11/23 10:14:37] {- zipWith :: (a -> b -> c) -> [a] -> [b] -> [c] zipWith f (x:xs) (y:ys) = (f x y) : (zipWith f xs ys) zipWith f [] _ = [] zipWith f _ [] = [] zip :: [a] -> [b] -> [(a,b)] zip xs ys = zipWith mkpair xs ys where mkpair x y = (x, y) -} zip3 :: [a] -> [b] -> [c] -> [(a,b,c)] zip3 xs ys zs = zipWith mkpair xs (zip ys zs) where mkpair x (y, z) = (x, y, z)
343 名前:デフォルトの名無しさん mailto:sage [04/11/23 11:56:51] zip3' = (zipWith (uncurry (,,)) .) . zip
344 名前:デフォルトの名無しさん mailto:sage [04/11/23 17:24:36] zip3' = const zip3 zip
345 名前:デフォルトの名無しさん mailto:sage [04/11/24 12:28:10] 339です。自室のPCからでははじかれてしまって書き込みができなかったので 遅くなってしまいましたが、ありがとうございます。 たいへん助かりました。 …お礼の言葉が遅くなってしまい、申し訳ありませんでした。m(__)m
346 名前:デフォルトの名無しさん mailto:sage [04/12/08 23:32:07] -- Haskell Mode Haskell Haskellモード 関数型言語でーす Haskellモード Haskellモード Haskellモード Haskellモードでーす Haskellモード うにゃ〜 うにゃにゃ lazily evalute! 関数 … カリー様 関数 … か・た・す・い・ろん モナド >>= … わたしのシモベェ〜 モナド >>= … Haskellモード Haskellモード Haskellモード 98モードでーす Haskellモード Haskellモード Haskellモード Haskellモードでーす たらい、回したくなっちゃった…
347 名前:デフォルトの名無しさん mailto:sage [04/12/25 20:17:26] >>346 大丈夫?
348 名前:デフォルトの名無しさん mailto:sage [04/12/26 01:33:03] Everyday Haskell www.sampou.org/cgi-bin/haskell.cgi?Everyday&l=jp が面白い
349 名前:デフォルトの名無しさん mailto:sage [04/12/26 03:05:21] fold右派とfold左派にワラタ
350 名前:デフォルトの名無しさん mailto:sage [04/12/27 03:20:36] The Evolution of a Haskell Programmerでググれ という話ではなかったようだなスマソ
351 名前:デフォルトの名無しさん mailto:sage [04/12/27 23:20:33] これ既出? www.cin.ufpe.br/~haskell/vhs/
352 名前:デフォルトの名無しさん mailto:sage [05/01/05 13:43:39] >>347 346の文字列を読んで、ラテン系の伴奏が聞こえてくるようだと かなりダメ。
353 名前:デフォルトの名無しさん mailto:sage [05/01/06 03:09:05] >>346 禿げワロス カリー様(・∀・)イイ!!
354 名前:デフォルトの名無しさん mailto:sage [05/01/12 23:45:50] 保全sage
355 名前:デフォルトの名無しさん mailto:sage [05/01/15 03:17:13] Hatena::Diary 「Haskell」を含む日記 のとある日記を見てちょっとワラた 「むしゃくしゃしてやった.Haskell で書くつもりはなかった.今は反省している.簡潔に書けるが,知らない人には全く読めないだろうし,知っている人はもっとうまく書くかもしれない.」
356 名前:デフォルトの名無しさん mailto:age [05/01/15 03:36:47] ocaml age
357 名前:Aransk [05/01/18 12:16:33 ] >>355 ワラた。 ++ "しばらくしたら…誰も読めなくなるだろう。"
358 名前:デフォルトの名無しさん mailto:sage [05/01/23 14:46:59 ] The Implementation of Functional Programming Languages オンライン復刻記念 ttp://research.microsoft.com/Users/simonpj/papers/slpj-book-1987/ って既出?
359 名前:デフォルトの名無しさん mailto:sage [05/01/24 10:44:32 ] >>358 おおっ! 既出ではないと思う。さんくす。 といいつつ書籍で持ってるのだがw。いい本だよねー。
360 名前:デフォルトの名無しさん mailto:age [05/01/24 10:56:09 ] OCamlだとMLっぽいから書きやすいんだけど…。
361 名前:デフォルトの名無しさん mailto:sage [05/01/24 18:01:20 ] >>358 やけにでっかいから何かと思ったら、300もあるページがみんな画像……
362 名前:デフォルトの名無しさん mailto:sage [05/01/25 02:46:41 ] Revision Control System を、調べてたら、 darcs ( ttp://abridgegame.org/darcs ) というのを、ハケーンしました。 これは、haskell で書かれているので、「haskellってなんや。」と調べる流れでここに来ました。 私が知らないだけ、haskellでかかれたアプリはいっぱいあるのかも知れませんが、 上の方に出てないみたいなので、書いてミマス。 激しくガイシュツでしたらすいません。
363 名前:デフォルトの名無しさん mailto:sage [05/01/25 15:14:39 ] haskellで書かれたアプリはそんなに珍しくないと思う。 www.haskell.org/practice.html にいくつか載ってる。
364 名前:デフォルトの名無しさん mailto:age [05/01/25 15:17:08 ] haskellとOCamlではどちらがメジャーですか?
365 名前:デフォルトの名無しさん mailto:sage [05/01/25 15:25:18 ] そういうのをドングリの背比べというのではないだろーか。
366 名前:デフォルトの名無しさん [05/01/25 16:01:51 ] スラド本家?とLtUで取り上げられた<darcs it.slashdot.org/article.pl?sid=04/11/25/0136249&tid=156&tid=218 lambda-the-ultimate.org/node/view/391 純粋に関数的な「パッチの適用」を,ファイルやディレクトリの読み書きからキレイに分離でき, また,パターンマッチングと高階関数が,パッチのプリミティブの実装にとてもマッチする,とある. 詳しくはこちら. osdir.com/Article2571.phtml
367 名前:デフォルトの名無しさん mailto:sage [05/02/06 15:35:00 ] >>346 超ワロタw
368 名前:デフォルトの名無しさん mailto:sage [05/02/06 19:52:48 ] >>367 元ネタキボンヌ
369 名前:346 mailto:sage [05/02/06 20:18:15 ] >>368 that3.2ch.net/test/read.cgi/gline/1104975149/1-9
370 名前:デフォルトの名無しさん mailto:sage [05/02/07 04:10:20 ] ぬるほど
371 名前:デフォルトの名無しさん mailto:sage [05/02/09 05:46:41 ] Haskellの初歩を学校でやっているのですが、 宿題が出て難しすぎるので誰か助けて下さい。
372 名前:デフォルトの名無しさん mailto:sage [05/02/09 10:53:26 ] 2つの項を入力されたらmost general unifierを出力する *(1,y) *(x,+(a,b)) -> {x->1,y->+(a,b)} のようなプログラムを作れ、という課題が出たのですがサッパリわかりません。 どなたか教えて下さい
373 名前:デフォルトの名無しさん mailto:sage [05/02/09 20:23:43 ] >>372 もう一年やれば、理解も深まるよ。
374 名前:デフォルトの名無しさん mailto:sage [05/02/09 20:27:03 ] というか,課題が全然理解できないんだが.
375 名前:デフォルトの名無しさん mailto:sage [05/02/09 20:42:11 ] あ,分かってしまった.もう一年がんばってね.
376 名前:デフォルトの名無しさん mailto:sage [05/02/09 20:59:08 ] 問題の意味がわからないのならどうしようもないな
377 名前:デフォルトの名無しさん mailto:sage [05/02/09 22:14:31 ] >>372 これ、数学板のmathematicaスレでも見たぞ マルチすんな、消えろ
378 名前:デフォルトの名無しさん mailto:sage [05/02/09 23:27:11 ] もっと低レベルな人にあわせてくれる学校に入りなおしましょう。
379 名前:デフォルトの名無しさん mailto:sage [05/02/09 23:49:57 ] >>370 カッ
380 名前:デフォルトの名無しさん mailto:sage [05/02/10 01:16:45 ] [1,5,8,43]などのリストをパラメータとして受け取って [("1st",43),("2nd",8),("3rd",5),("4th",1)]のように ランクをつけてランク順に返す関数が欲しいのですが 問題は[5,6,6,22,23,24,24]のような場合に [("1st",24),("1st",24),("3rd",23),("4th",22),("5th",6),("5th",6),("7th",5)] のように返さなければいけないことです。どうすればいいかさっぱりです。 誰か教えて下さい。
381 名前:デフォルトの名無しさん mailto:sage [05/02/10 02:07:40 ] List> group $ reverse $ sort [5, 6, 6, 23, 24, 24] [[24, 24], [23], [6, 6], [5]] ここまで来りゃ後はなんとでもなるだろ。
382 名前:デフォルトの名無しさん mailto:sage [05/02/10 02:35:51 ] >>381 ありがとうございます!!
383 名前:デフォルトの名無しさん mailto:sage [05/02/10 02:43:00 ] あ、ランクを付ける際にはカウンタみたいなものを用意するんですか?
384 名前:デフォルトの名無しさん mailto:sage [05/02/10 04:08:38 ] 宿題か? 宿題なのか? テメエェェェ
385 名前:デフォルトの名無しさん mailto:sage [05/02/10 07:31:12 ] >>381 演算子 $ って初めて見ましたが,なかなか便利ですね. 勉強になりました.
386 名前:デフォルトの名無しさん mailto:sage [05/02/10 09:38:36 ] はい、そーです
387 名前:デフォルトの名無しさん mailto:sage [05/02/10 23:12:49 ] > ここまで来りゃ後はなんとでもなるだろ。 いろいろ考えたのですがなんともなりません。 むしろここから先が一番大変なのではないかと・・・ まじで教えてくれませんか?
388 名前:デフォルトの名無しさん mailto:sage [05/02/10 23:27:15 ] ここまで来てなんともならんてのは、けっきょく全然理解してないってことだ ろ。これくらい自分で考えてみ。でないとただのカンニングだろ。
389 名前:デフォルトの名無しさん mailto:sage [05/02/11 03:20:58 ] 僕にはこれが限界でした。 rank :: [[a]] -> [(Int, a)] rank x = [(i, n) | (i, a) <- zip [1..] x, n <- a] 確かに理解は非常に足りません。ですが、本を読んでも、 いろいろなほかのテクニックを知ってもループという基本的なことを するのがこんなに難しい言語は初めてなのです。 なんらかのライブラリを使う必要があるのかもしれないと思って、 Listのところは大体見たんですが結局何も見当たらずもうダメです。 こんな簡単であろう問題に3時間も4時間もかけてる自分がすごい嫌になってきます。
390 名前:デフォルトの名無しさん mailto:sage [05/02/11 04:03:59 ] ま、気楽にやれや、学生なんだし。
391 名前:デフォルトの名無しさん mailto:sage [05/02/11 04:52:51 ] そう気楽でもないんすよ。いろいろあって。 ヒントを下さい。お願いします。
392 名前:デフォルトの名無しさん mailto:sage [05/02/11 08:05:13 ] >>391 [1..]のところを["1st", "2nd", ...]というリストにすれば終わりだろ。 英語のカウントに勝手に直してくれるようなライブラリはないだろうな。
393 名前:デフォルトの名無しさん mailto:sage [05/02/11 09:27:09 ] >>392 > [1..]のところを["1st", "2nd", ...]というリストにすれば終わりだろ。 そのリストはどこまで続くんですか?
394 名前:デフォルトの名無しさん mailto:sage [05/02/11 09:48:51 ] いや、それじゃランク順の法則が違うんですよ。それだと [("1st",24),("1st",24),("2nd",23),("3rd",6),("3rd",6),("4th",5)] になっちゃうんですよ。 課題は [("1st",24),("1st",24),("3rd",23),("4th",6),("4th",6),("6th",5)] にならなきゃいけないので前のリストのカウントを常にしないと次のランクが 分からないわけです。これをどうしたものかと・・・・ >>393 同じ課題で悩んでる人ですか?そのリストは(length x -1)thまで続くんじゃないでしょうか? 与えられた整数に英語のカウントをつける関数はもう作ってあるんですが。 addSuffix :: Int -> String addSuffix x | x == 1 = "1st" | x == 2 = "2nd" | x == 3 = "3rd" | otherwise = show x ++ "th"