[過去ログ] 関数型プログラミング言語Haskell Part7 (1001レス)
上下前次1-新
このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
1(5): 2007/03/18(日)18:56 AAS
haskell.org
外部リンク:www.haskell.org
日本語サイト
外部リンク[cgi]:www.sampou.org
外部リンク:www.shido.info
過去ログ
関数型プログラミング言語Haskell
Part1 2chスレ:tech
Part2 2chスレ:tech
Part3 2chスレ:tech
Part4 2chスレ:tech
Part5 2chスレ:tech
Part6 2chスレ:tech
・2chの仕様により、行頭の半角スペースは表示されません。
コードをインデントしたいときは、代わりに または全角スペースを使うことができます。
875(1): 2007/09/17(月)08:23 AAS
Dってまだ生きてたの?
876: 2007/09/17(月)11:58 AAS
>>874
Dはないw
コンパイラもライブラリもボロボロ
あれで何か作るって無謀すぎる
まだ形になってるC#の方がまし
877: 2007/09/17(月)12:30 AAS
>>875
D自体は相変わらず突っ走ってるよ。
バグ取りもそこそこに、言語機能をどんどん追加していってる。
実装予定してる機能も多数ある。
それに対して、取り巻きの方は死んでる。
どのプロジェクトも、ライブラリを最新版のコンパイラで動かすのをあきらめてる状態。
もうみんなやる気ないみたい。
878: 2007/09/17(月)20:30 AAS
Dはちょっとやろうかなという気にさせる魅力はあるが、
付き合いたくはないね。
879(2): 2007/09/20(木)21:44 AAS
外部リンク[php]:www.flightless-wing.com
を見ながら勉強しています。
ここに出てくる
data ABC = 'A' | 'B' | 'C'
が
Syntax error in data type declaration (unexpected character literal)
と言われます。なにが間違っているんでしょうか。
また
data Blood = "A" | "B" | "O" | "AB"
が
Syntax error in data type declaration (unexpected string literal)
といわれます。文字列を値にすることはできないのでしょうか。
なおHugsを使っています。
880: 2007/09/20(木)21:54 AAS
>>879
そんな構文はない。
data ABC = A | B | C
とか
data Blood = A | B | O | AB
となら書けるけど。
この場合、AとかABとかは文字でも文字列でもない新しい値。
881(2): 2007/09/20(木)22:42 AAS
AA省
882(1): 2007/09/20(木)22:51 AAS
>>879
ありがとうございます。
いわゆる列挙型を定義しようとしていたのですが、列挙型の値に文字、文字列、数値は指定できないということでしょうか。
あと、
data Rank = A | B | C
data Blood = A | B | O | AB
としたいのですが
Multiple declarations for data constructor "A"
といわれます。列挙型の値の名前空間というかスコープは、グローバルということでしょうか。
883(1): 2007/09/20(木)23:06 AAS
>>881
O(n)だと思う。参照されなくなったリストはGCによって回収されるので。
Haskellのリストは書き換えられない。破壊的に更新したいなら専用のデータ構造が要る、例えば
外部リンク[html]:www.haskell.org
>>882
列挙型の値を指定するというのが良く分からん。列挙値はそれ自体で値じゃないか?
Cのenum { a = 3};みたいな指定がしたいということなら、それは不可能。
必要なら整数と相互変換する関数を書けば良い。
>列挙型の値の名前空間というかスコープは、グローバルということでしょうか。
そう。正確にはモジュールレベル。
884(2): 2007/09/21(金)09:51 AAS
>>883
O(n)にはならないように思うのですが。
整列が完了したら、参照されなくなったリストはGCされますが、整列中の間は参照されているわけですからGCされませんよね?
再帰呼び出しごとに新しいリストが作られ、それらは呼び出しから戻らないとGCされませんが、呼び出しから戻る前に別の再帰呼び出しが発生するわけだから、やはりメモリ消費量はO(n)ではないと思います。
また再帰呼び出しの深さは最大n-1になるので、やはりO(n^2)ではないでしょうか。実際には、呼び出しの深さは平均でlog(n)でしょうから、 O(n*log(n))が正解かもしれませんが。
詳しい人、お願いします。
885(3): 2007/09/21(金)12:10 AAS
>>884
確かにそうだ。最悪O(n^2)になるな。
でも、中間リストを作ることが直接の原因ではない。
実際、正確評価ならelts_lt_xとelts_greq_xを作り終えた時点で引数のxsはGCできる。
遅延評価だとこれが上手くいかなくて、逆順にソートされたリストが渡される最悪のケースでO(n^2)になる。
時間的には同じ最悪のケースでも、入力が正順にソートされていた場合はO(n)なんだが。
汚い方法だけど、seqを使って評価順を入れ替えることでO(n)になる。
qsort [] = []
qsort (x:xs) = length elts_lt_x `seq` length elts_greq_x `seq`
qsort elts_lt_x ++ [x] ++ qsort elts_greq_x
where
elts_lt_x = [y | y <- xs, y < x]
elts_greq_x = [y | y <- xs, y >= x]
886(5): 2007/09/21(金)12:47 AAS
プロファイル取って調べてみた。数字はtotal allocにqsortの%allocをかけたもの。左の数字は要素数。
>>881とランダム要素のリスト
800 : 380003.544
1600: 873076.32
2400: 1296538.048
3200: 1816425.728
4000: 2399276.16
>>885とランダム要素のリスト
800 : 400965.324
1600: 1040519.448
2400: 1389810.24
3200: 1846377.12
4000: 2776879.088
>>881と整列リスト([1..n])
800 : 8985561.144
1600: 35887143.13
2400: 80695069.14
3200: 143405095.9
4000: 224106868.3
>>885と整列リスト([1..n])
800 : 8995036.344
1600: 35906208.73
2400: 80723725.14
3200: 143443342.3
4000: 224154724.3
最悪ケースだとO(n^2)になるっぽい
887(1): 886 2007/09/21(金)13:00 AAS
AA省
888(3): 2007/09/21(金)13:12 AAS
>>886
total allocは確保したメモリの総量だから、空間効率を計るのには使えない。
+RTS -sstderrをつけてmaximum residencyを見ればO(n)になってるのが分かると思う。
889(1): 2007/09/21(金)13:13 AAS
O(n)で可能であると思われます。
外部リンク[zip]:kukuli.jp
890(1): 2007/09/21(金)13:18 AAS
>>888
>total allocは確保したメモリの総量だから
補足。確保->回収->確保で多重に計上されるってことね。
maximum residencyは瞬間的な使用中のデータ量の最大値(を実測で近似したもの)。
891(1): 886 2007/09/21(金)14:04 AAS
>>888
>>890
なるほど。
HaskellのGCって、いらなくなった瞬間に動くものだったんだな。
もっとメモリが足りなくなってから動くものだと思ってた。
(そういう扱いをする部分(世代?)もあると思うけど)
というかそれ以前に、885で
>逆順にソートされたリストが渡される最悪のケースでO(n^2)になる。
って書いてあるのになにも分かってなかった。
あと885は
qsort [] = []
qsort (x:xs) =
let !elts_lt_x = [y | y <- xs, y < x] in
let !elts_greq_x = [y | y <- xs, y >= x] in
qsort elts_lt_x ++ [x] ++ qsort elts_greq_x
と書くといいかなと思ったり。
892: 2007/09/21(金)18:05 AAS
>>891
>HaskellのGCって、いらなくなった瞬間に動くものだったんだな。
デフォルトだと確保エリアの大きさは256kらしいから、第0世代のGCは頻繁に起こるんだろう。
>と書くといいかなと思ったり。
それだとリストの先頭しかeagerに評価されないから、
[99, 100, 97, 98, 95, 96, ..., 4, 1]
みたいなリストが入力だとO(n^2)になる。
リストを最後まで評価させるために>>885ではlengthを使ってる。
893: 2007/09/21(金)18:33 AAS
先生! はすける君がごみ拾いばかりして、ちっとも仕事してません!
実行時間の3割がGCとか、普通ですよね
894: 2007/09/21(金)18:41 AAS
ちょっとしたループを書くにもconsを大量に使い捨てるスタイルが一般的だからな。
まあ、メモリ確保は馬鹿みたいに速いんだから許してやろうぜ。
895(2): 2007/09/21(金)20:23 AAS
>>885
このコードが理解できない初心者のために、教えてください。
seqは遅延評価をしないための関数のようですが、lengthは何のためにあるのでしょうか。
あとseqは2項演算子として使うのが普通なのですか。
qsort [] = []
qsort (x:xs) = seq (length elts_lt_x) (seq (length elts_greq_x) (qsort elts_lt_x ++ [x] ++ qsort elts_greq_x))
where
elts_lt_x = [y | y <- xs, y < x]
elts_greq_x = [y | y <- xs, y >= x]
と買いても間違いではない?
>>886
>数字はtotal allocにqsortの%allocをかけたもの
total alloc と %alloc が何か分からないので、それらをかけて何が求まるのか分かりません。
total alloc は全体のメモリ消費量で単位はバイトでしょうか。
896: 2007/09/21(金)20:50 AAS
>>889
見てみました。わざわざありがとう。
で、この絵では再帰呼び出しのときには古いリストがGCされているようだけど、これはHaskellの言語仕様として決まってるんでしょうか。
つまり、
(a)引数で渡されたリスト
(b)etls_lt_x と elts_greq_x
(c)qsort elts_lt_x ++ [x] ++ qsort elts_greq_x でできるリスト
があって、他の言語だとリストへの参照がある限りGC対象とはならないので、(a)より(b)のほうが先に(または同時に)GC対象となります。そのため、>>884で書いたようにO(n^2) になります。
しかし>>889の説明では、(b)より(a)のほうが先にGCされています。
これだと確かにO(n)になりますが、このように動作するためには、再帰呼び出しをするまえに(a)がGC対象とならないといけないわけですが、本当にこのように動作するのでしょうか。
またそれは言語仕様で保証されているのでしょうか。
Haskellをよくわかってないので勘違いしてるかもしれませんが、お願いします。
897(1): 2007/09/21(金)21:07 AAS
>>895
それで合ってる。seqを中置で使うのは良く見かける気がする。
seqを使っているのは再帰に入る前にelts_lt_xとelts_greq_xを完全に評価するため。
未評価のelts_greq_xのサンクはxsを参照しているけど、
完全に評価してしまえばただのリストなので、xsへの参照がなくなって、
GCがxsを回収できるようになる。
seq A Bの値はBと同じだけど、この式を評価する時はまずAを評価して、
その結果を捨て、改めてBを評価する。
length elts_lt_x `seq` 本体
を評価するときは、まずelts_lt_xの長さを求めることになるが、
リストの長さを求めるにはリスト全体を評価する必要がある。
結局、本体が評価される前にelts_lt_xが完全に評価される。
lengthが必要な理由には、seqの仕様が関わってくる。
seq A Bが評価されるとき、Aは弱冠頭正規形(weak head normal form, WHNF)まで簡約される。
WHNFというのは、最も外側のデータ構築子が確定した形。
例えば1+2や[1,2]++[3,4]はWHNFじゃないけど、3や1:([2]++[3,4])はWHNF。
だから、lengthを使わずに
elts_lt_x `seq` 本体
のように定義すると、例えば
elts_lt_x = [y | y <- [1, 2, 3, 4], y < 5]
のとき、これを
elts_lt_x = 1 : [y | y <- [2, 3, 4], y < 5]
と簡約したら、この段階でWHNFに達したことになり、評価が終わってしまう。
これだと、xs(ここでは[2, 3, 4])への参照が残っていて、GCがxsを回収できない。
898(1): 2007/09/21(金)21:37 AAS
ところで、空間計算量を議論する時に、GCを考慮するのは普通なん?
899(1): 2007/09/21(金)21:49 AAS
>>898
GCがある環境なら考慮していいと思う。じゃないと、机上の空論となるから。
GCがなければO(n^2)になるのが、逐次GCがかかることでO(n)になるなら、そっちを議論しないとあんまり意味なくね?
900: 2007/09/21(金)21:49 AAS
もちろん前提条件として明示する必要はあるよ?
901: 2007/09/21(金)22:02 AAS
>>897
力作ありがとうございます。
seqは完全に遅延評価を回避できるわけではないんですね。なんというか、オブジェクト指向言語でよく出てくるshallow copyとdeep copyの違いみたいな感じでしょうか(つまりseqはshallow copyに似ている)。
しかし完全に評価するためにlengthを使うのって、bad know howですよね。
このためにlengthを使うのは、lengthの本来の用途ではないのだから、完全に評価するための専用の関数が標準で用意されるべきたと思いました。たとえその実体がlengthであったとしても。
902: 2007/09/21(金)22:16 AAS
Control.Parallel.Strategies.force :: (NFData a) => a -> a
を使うのかな。
これはこれで目的外使用な気もするが。
903: 2007/09/21(金)23:04 AAS
>>899
処理系がタコなせいで遅いのなら、そっちを直すべきじゃね?
904: 886 2007/09/21(金)23:41 AAS
>>895
-prof付きでコンパイルしてから+RTS -p付きで実行するとプロファイルがとれて、
Fri Sep 21 23:19 2007 Time and Allocation Profiling Report (Final)
main.exe +RTS -p -RTS
total time = 0.05 secs (1 ticks @ 50 ms)
total alloc = 9,079,028 bytes (excludes profiling overheads)
COST CENTRE MODULE %time %alloc
main Main 100.0 0.3
qsort Main 0.0 99.1
というようなログが出力される。
total allocとか%allocはこれのこと。
total allocはアロケートされたメモリの累計で、%allocは各関数ごとの割合。
とまあそういうことなんだけど、ここでの議論は、GCでメモリが再利用されて
O(n)になるという話なので、無意味と言うか、的外れと言うか、
>>886-887は無かったことにしてください。
メモリ使用量を正しく知る方法は>>888。
905(1): 2007/09/24(月)10:50 AAS
> qsort Main 0.0 99.1
消費時間0%…遅延評価のマジックですなあ
906: 2007/09/24(月)11:13 AAS
>>905
いや、プロファイラの精度の問題だろw
>total time = 0.05 secs (1 ticks @ 50 ms)
一個しか標本を取ってないんだから、片方が100%になるのは必然。
907(2): 2007/10/01(月)22:33 AAS
concatの反対で "AAA BBB CCC" を ["AAA", "BBB", "CCC"] にするにはどうしたらいいの?
parsecというものをimportしてParserを作らないといけないのでしょうか?
908: 2007/10/01(月)22:41 AAS
wordsのことかな。
909(2): 907 2007/10/02(火)16:59 AAS
ありがとう。それだ。
ふつうのHaskellプログラミングに乗ってないんだ
910: 2007/10/02(火)17:11 AAS
それらしい所を漁るといろいろ出てくるね
ghc/libraries/base/Data/ByteString/Char8
911: 2007/10/02(火)20:21 AAS
>>909
ざんねん載っているぞ
912: 2007/10/02(火)21:07 AAS
>>909
Hoogleで欲しい関数の型を検索してみると割とヒットするよ。
今回はString->[String]。
913(1): 2007/10/07(日)00:59 AAS
Monads 1
動画リンク[YouTube]
An introduction to monads including the definition and a look at the monoid monad.
Category Howto & DIY
Tags: category functor monad monoid
914: 2007/10/07(日)17:09 AAS
>>913
こんなマニアックなものがあるのか・・・
915(2): 2007/10/07(日)17:59 AAS
eclipseで書いてるんだけどもHaskellパースペクティブが使いにくくてしょうがないYO
モジュール名を’M’から始めないとinvalid_nameとかいわれるのはなぜなんだぜ?
916(1): 2007/10/10(水)09:37 AAS
>>915
Haskellプラグインをどこが作ってるのかは知らないが、
オープンソースなんだろうし、開発を手伝ってきたら?
917: 907 2007/10/15(月)22:15 AAS
できたー
ありがとう
918: 2007/10/17(水)06:53 AAS
>>915-916
EclipseFP ?
外部リンク:eclipsefp.sourceforge.net
919: 2007/10/20(土)02:31 AAS
外部リンク:2ch.bluesvirus.com
920: 2007/10/20(土)13:24 AAS
HaskellでRubyやLispのrestパラメータのように
複数の引数をまとめてリストにしたい場合はどうするのでしょうか?
921(1): 2007/10/20(土)13:53 AAS
可変個の引数をとる関数は定義できない。
型クラスを使って真似する方法はあるけど。
922(2): 2007/10/20(土)20:58 AAS
>>921
> 定義できない
> 方法はある
どっちなんだ
923: 2007/10/20(土)21:06 AAS
>>922
できない。似たようなことをする方法はある。
924: 2007/10/20(土)21:24 AAS
やりたいことにもよるんだけど、直接リストにして受け渡すようにすれば良いんじゃない?
hoge :: 任意個のa -> b ではなくて hoge :: [a] -> b
引数の型が違う時は
data Param = PInt Int | PString String
hoge :: [Param] -> b
みたいな感じ。
925(2): 2007/10/21(日)22:36 AAS
今Programming in Haskellを読んでいます。
List comprehensionという語の日本語訳が難しいのですが
普通はどう訳されているのでしょうか?
926: 2007/10/21(日)22:40 AAS
>>925
リスト内包表現
っていうかぐぐれよ
927: 2007/10/21(日)22:40 AAS
>>925
リストの内包表記
928: 2007/10/21(日)23:26 AAS
GHCタッグリーグ戦にあのチームが緊急参戦?
929: 2007/10/21(日)23:54 AAS
包茎珍宝のリスト
930: 2007/10/22(月)22:53 AAS
なぁなぁ
まえにPDFうpしてくれた人の作品じゃないか?
背景がまったく同じだ
動画リンク[ニコニコ動画]
931: 2007/10/22(月)22:58 AAS
同じプレゼンソフトを使ってるだけじゃないか?
932: 2007/10/23(火)00:59 AAS
xmonadがニュースになってるw
外部リンク[htm]:japan.zdnet.com
933: 2007/10/23(火)20:35 AAS
>>922
Text.Printfを見てみるといい。(単に可変個の引数の話だけど)
934(1): 2007/10/23(火)22:05 AAS
どこで見れる?
935: 2007/10/23(火)22:23 AAS
外部リンク[hs]:darcs.haskell.org
936(1): 2007/10/23(火)22:47 AAS
昨日ふつける読み始めた俺に誰か教えてくれ
Cと連携したりできんの?
CからHaskellの関数呼んだりHaskellからCの関数呼んだり
937: 2007/10/23(火)22:49 AAS
>>934
ソースのことだと思われ
938(1): 2007/10/23(火)23:03 AAS
>>936
できるよ。
939(1): 2007/10/23(火)23:04 AAS
>>938
どーやって?
CとHaskellって型とかだいぶ違う気がするけどそこらへんどーすんの?
940(1): 2007/10/23(火)23:15 AAS
>>939
haskell ffiでググレ
941: 2007/10/23(火)23:17 AAS
>>940
あまりの優しさにチンコ取れた
ありがとー読んでくる
942: 2007/10/24(水)20:47 AAS
外部リンク:www.mitsuki.no-ip.com
Clearsilverのバインディングなんてあったんだな
943(1): 2007/10/26(金)19:43 AAS
誰かHaskellの文法一覧みたいな便利なものがあるサイト知らない?
944(2): 2007/10/26(金)19:56 AAS
日本語 → 外部リンク:www.sampou.org
英語 → 外部リンク:haskell.org
945(1): 2007/10/26(金)21:09 AAS
>>944
思慮が足りないな。
仮にもhaskellに興味を持つような人間がそのサイトを知らないわけないだろ。
>>943が言いたいのはそのサイトが不便だってことなんだろうよ。
946(1): 2007/10/26(金)21:26 AAS
>>944
流石にそれは見たことあるわ
>>945
そうそう
もっと適当にまとまってるとこねぇかな
ふつける読み返したり>>944見たりするのはめんどくさい…
947(1): 2007/10/26(金)22:19 AAS
>>946
言い出しっぺの法則。というわけで、wikiでも建てて作ってくれ。
948: 2007/10/26(金)22:31 AAS
>>947
外部リンク[html]:vipprog.net
949(1): 2007/10/26(金)23:28 AAS
case x of { "a" -> 1; "b" -> 2}
はうまくいくのに
str1 = "a"
str2 = "b"
case x of { str1 -> 1; str2 -> 2}
は、str1,str2がwildcardとみなされ、意図通りに動きません。
caseのpatternに変数を使う方法はないでしょうか?
ちなみに意図しているのは、以下と等価な動作です。
if x == str1 then 1 else if x == str2 then 2 else error ""
950: 2007/10/27(土)02:37 AAS
CやJavaのswitch文でcaseに変数使えたっけ?
951(1): 2007/10/27(土)03:42 AAS
無理だとと思う、代わりにこんなのは?(あんまりまっとうな回答ではないのでわからなければスルー希望)
--source1.hs
Module Source1 (str1,str2) where
str1 = [| "a" |]
str2 = [| "b" |]
--source2.hs
import Source1
case x of { $(str1) -> 1; $(str2) -> 2}
952: 2007/10/27(土)08:43 AAS
なんで調べもせずに言い出しっぺとか言ってるんだよ
Tour of the Haskell Syntax
外部リンク[html]:cs.anu.edu.au
953: 2007/10/27(土)08:57 AAS
>>951
[| "a" |]の型はQ ExpであってQ Patじゃない。
そもそもパターンにspliceを書くことはできないはず。
954: 2007/10/28(日)02:29 AAS
>>949 の意図と違うとは思うけど
table = [(str1,1),(str2,2)]
fromMaybe (errror "") $ lookup x table
955(3): 2007/10/28(日)12:22 AAS
関数型初体験してみたが、
ふたつの引数 m n をとって
m * (m+1) * .... * (n-1) * n を返す関数を
再帰的定義を用いて書け
なんて問題を解くのに30分もかかった…
普段とぜんぜん違う思考法を要求されて面白いねこれ
956: 2007/10/28(日)12:23 AAS
>>955
Haskellやると頭がよくなった気がする。あくまで気がするだけだけど・・・。
957(3): 2007/10/28(日)13:41 AAS
とりあえず、ふつうのHaskellは読んで文法とか何となく理解したのですが、
次のステップってどんなのがいいんでしょうか。
自分はWebアプリを実装してみようとか思ったんですけど、基本部品(Http
リクエスト解析とか、DB処理など)使ったものやるよりも、「Write Yourself a
Scheme in 48 Hours」みたいなのを勉強する方がよいのかな?と思ってます。
おすすめのHaskell学習資料なんかがあったら教えてください。
958: 2007/10/28(日)14:05 AAS
>>957
まだHaskellであまりコードを書いてないなら、とにかくたくさん書いて慣れるのが重要だろう。
インタプリタ書くのは良い訓練だけど、やりたいことがあるならそっちをやった方が
モチベーションが上がりやすくて良いと思う。
959: 2007/10/28(日)14:05 AAS
>>957
散々過去に同じ質問が出ているわけだが。
論文読め。
960: 2007/10/28(日)14:28 AAS
>>957
2に書いてある入門Haskellがおすすめ。
あとは、下記のやさしいHaskell入門かな。
外部リンク:www.sampou.org
そろそろもう一段階上の本を出してほしいなぁ > 著者さん達
961: 2007/10/28(日)14:41 AAS
皆さん、ありがとうございます。
自分の経験から、あまり文法一覧を基本にした学習ではなくて、実際の
アプリ実装ベースでの学習をしたいと思ってます。目標はWebアプリの
雛形作ることなんですけど、既存コードの寄せ集めになってしまいそう
なので、Haskellのくせというか、定石みたいなの知った上でやりたいなと。
Write Yourself a Scheme in 48 Hoursみたいなのがいいんですけど、
似たようなの他にもあるかなぁと思って質問しました。
962: 2007/10/28(日)14:45 AAS
haskellはやめておけ。
プログラミング手法が確立されていないから、
研究目的以外でやるなら別の言語を使え。
963(2): 2007/10/28(日)19:33 AAS
定石なら、
どう書く?org
外部リンク:ja.doukaku.org
とか、
Programming:玉手箱
外部リンク[cgi]:www.sampou.org
が参考になるかも
964: 2007/10/28(日)20:00 AAS
のぶすんすんすん
965: 2007/10/28(日)20:00 AAS
のぶすんのおなにーさいと
966(1): 2007/10/28(日)20:22 AAS
>>963
nobsun乙wwwww
967(1): 2007/10/28(日)20:34 AAS
>>966
>>963はただのNAIST生ですよ
968(1): 2007/10/28(日)20:37 AAS
>>955
お前頭いいな。
(m+1) * .... * (n-1)
俺には、この省略されたところで何があったのか見当もつかん。
m+1<n ってことか?
969: 2007/10/28(日)20:44 AAS
>>968
俺が察するに、m<nとして m, m+1, m+2, m+3, .. , n-3, n-2, n-1, n の乗積を求めたいんだろう。
970: 2007/10/28(日)21:16 AAS
>>967
意味分からん
971(1): 2007/10/28(日)22:08 AAS
>>955
その例は、手続き型でも大差ないだろう。
int f(int m, int n)
{
return m <= n? m * f(m+1,n) : 1;
}
972: 2007/10/28(日)22:10 AAS
>>971
手続き型ならforでまわせよ、この豚
973: 2007/10/28(日)22:12 AAS
求めるのが「mからnまでの積」ではなく「mからnまでのlist」だと、
CやFortranでは一気に面倒になるね。
974(1): 2007/10/28(日)22:37 AAS
非再帰の方が楽だな。
f m n = foldl (*) 1 [m..n]
975(3): 2007/10/28(日)23:34 AAS
そのfoldlはhaskellでどう定義するのかね。
ああ、foldlはCで書かれてるなんて言わないでね。
976: 2007/10/28(日)23:39 AAS
>>975
ghc落として見るが良い
977: 2007/10/28(日)23:47 AAS
fl :: (a -> b -> a) -> a -> [b] -> a
fl _ x [] = x
fl fn init (el:la) = fl fn (fn init el) la
978: 2007/10/28(日)23:48 AAS
>>975
wwww
アホがいる
979(2): 2007/10/28(日)23:49 AAS
foldlはライブラリにあるんだから実装はどうでもいいだろ
手で再帰を書かなくて済むことが重要
980(1): 2007/10/28(日)23:50 AAS
foldrをゴリ押ししてみた
fr :: (a -> b -> b) -> b -> [a] -> b
fr _ x [] = x
fr fn init (el:la) = fr fn (fn el init) la
981: 2007/10/29(月)00:01 AAS
今darcs中
darcs遅せぇ
982: 2007/10/29(月)00:02 AAS
>>980
それはfoldrじゃなくてfoldl . flipじゃないか
983(1): 2007/10/29(月)01:02 AAS
>>979
ところが実装を気にするんだよな〜
なにしろ、再帰かどうかが大問題なんだから。
984: 2007/10/29(月)01:13 AAS
じゃ自分で作ってみてベンチ両方取ってくらべりゃいいじゃねぇか
985: 979 2007/10/29(月)01:19 AAS
>>983
大問題って、foldl再帰で実装されているかどうかを初めに問題にしたのは>>975だろ?
foldlが再帰的に定義されていたとしても>>974のfの定義自体は非再帰的なわけで、
>>974はそれをもって「非再帰の方が楽」という言い方をしたんだと俺は理解したんだが
986: 2007/10/29(月)01:49 AAS
すみません、私が間違ってました
987: 2007/10/29(月)02:13 AAS
いや、俺も間違ってたよ
988: 2007/10/29(月)20:37 AAS
そろそろじすれのきせつ!
989(2): 2007/10/29(月)21:02 AAS
なんで
main = do cs <- getContents
putStrLn cs
はOKなのに
main = do cs <- getContents
<TAB><TAB>putStrLn cs
はダメなの?
990(1): 2007/10/29(月)21:21 AAS
>>989
上もダメじゃないか?
csが(0から数えて)10桁目から始まるから、
二行目のputStrLnも10桁目にないといけない
タブ幅は8と決まってるから、タブ二つでインデントするとputStrLnが16桁目から始まることになる
991: 2007/10/29(月)21:23 AAS
そんなゆーづーがきかないのか…
992(1): 2007/10/29(月)21:33 AAS
doの後で必ず改行するようにすれば悩まなくて済むよ
993(1): 2007/10/29(月)22:10 AAS
>>989
main = do { cs <- getContents;
<TAB><TAB>putStrLn cs}
にすればいいじゃない
994: 2007/10/29(月)22:15 AAS
>>992
愛してる
>>993
何が悲しくて{}なんぞ使わにゃならんのよ…
995(1): 2007/10/30(火)02:15 AAS
悲しみを { } で包むためさ
996: 2007/10/30(火)07:32 AAS
>>995
だれがうまい(ry
997(2): 2007/10/30(火)14:56 AAS
>>990
ふつけるにも書いてなかったんだが、それずっと疑問だった。
Haskellってタブはスペース8個に決め打ちしてるのか?
そもそも等幅フォントじゃなかったらどうすんだとか、エディタ
選ぶ言語なの?
998: 2007/10/30(火)15:03 AAS
>>997
等幅フォントでないと正しく見えない。
pythonのレイアウトも同じ。
999: 2007/10/30(火)15:08 AAS
1000: 2007/10/30(火)16:13 AAS
>>997
決め打ちしてる。
>そもそも等幅フォントじゃなかったらどうすんだ
例えば
・do、where、let、ofの後に必ず改行を入れる
・タブを使わない
の二点を守ればどんなフォントでも大丈夫。
1001: 1001 Over 1000 Thread AAS
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。
上下前次1-新書関写板覧索設栞歴
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 0.198s*