1 名前:デフォルトの名無しさん [04/02/01 18:55] 純粋関数型言語Cleanに関するスレッドです。 関数型には珍しくIDEと、IO,Gameライブラリが標準でついてきます。 関連リンク 本家 www.cs.kun.nl/~clean/ 日本語ドキュメントなど sky.zero.ad.jp/~zaa54437/programming/clean/
16 名前:デフォルトの名無しさん mailto:sage [04/02/06 16:27] >>13 その場合は他の関数型言語と変わらんな。
17 名前:デフォルトの名無しさん mailto:sage [04/02/06 18:23] >>16 ミクロなところ(実際にどうなるのか)を聞きたいんだと思うよ。 おれはそう。IOとか。 Haskellだと ------- module Main where import System import System.IO main = do(sn:sfn:_) <- getArgs ss <- openFile sfn ReadMode >>= hGetContents putStrLn $ unlines $ map ((!! (read sn - 1)) . cols) $ lines ss cols s = case break (\c -> or (map (c ==) ",.")) s of (w, []) -> [w] (w, _:ws) -> w: cols ws
18 名前:デフォルトの名無しさん mailto:sage [04/02/06 18:29] indent崩れた… # Cleanスレだから張り直さないほうがいいかな。
19 名前:デフォルトの名無しさん mailto:sage [04/02/07 17:22] >>15 使ってみれば分かる。
20 名前:デフォルトの名無しさん mailto:sage [04/02/08 00:03] >>15 使えません
21 名前:デフォルトの名無しさん mailto:sage [04/02/08 16:45] ユニコードに対応したライブラリはない。 従って、表示はともかく、操作はできない。
22 名前:Aransk [04/02/08 18:08] 最近は徐々に相手の神経を逆撫でする発言スタイルを モデレートタイプに修正中です。是非早くHaskellスレPart3 を立ち上げて下さい。それとも、このCleanスレと 目出度く合体!でも当方としては、全然問題ありません。 HakellとCleanは兄弟のようなもんですから(^^; ttp://homepage3.nifty.com/Aransk/
23 名前:デフォルトの名無しさん mailto:sage [04/02/08 18:25] >>17 ファイルの読込であれば、 こんな関数を作ればよい。 ↓ Read :: File -> [Char] // ファイルから読み込んで文字リストを作る Read f # (b,ch,filerest) = sfreadc f | not b = [] | otherwise = [ch : Read filerest] 要するにFile型の引数を操作すればいいだけ。 その前にsfopen関数当たりで関連付けるけどな。
24 名前:デフォルトの名無しさん mailto:sage [04/02/09 00:28] で、実際13はどうなるんだ
25 名前:デフォルトの名無しさん mailto:sage [04/02/09 01:07] >>22 せっかくリファレンスの日本語訳が出たんだから Python でもやってろ
26 名前:デフォルトの名無しさん mailto:sage [04/02/09 01:18] いいからNGネームに追加しとけ
27 名前:デフォルトの名無しさん mailto:sage [04/02/09 01:49] >>13 をC言語で適当に書いたコード おまいらこれをCleanに変換してくれよ #include <stdio.h> #define deref(x,i) *(int *)((x) + ((i)*4)) cvsref_fp(no, in, out) { int c, column = 1; while ((c = fgetc(in)) != EOF) if (c == ',') ++column; else if (c == '\n') fputc(c, out), column = 1; else if (column == no) fputc(c, out); } cvsref(no, filename) { int fp = fopen(filename, "r"); !fp ? printf("Error: File not found.\n"),exit(1) : cvsref_fp(no, fp, stdout); fclose(fp); } main(c,v) { c != 3 ? printf("Usage: csvref <no> <filename>\n"),exit(1) : cvsref(atoi(deref(v, 1)), deref(v, 2)); }
28 名前: mailto:sage [04/02/09 11:58] 今週末に考えるので気長に待ってろ。
29 名前: mailto:sage [04/02/09 12:01] といってもそれを変換するとは限らない。
30 名前:デフォルトの名無しさん mailto:sage [04/02/09 13:58] haskell の新スレまだぁー?
31 名前:デフォルトの名無しさん mailto:sage [04/02/09 15:38] まだ立ってなかったのか
32 名前:Aransk [04/02/09 17:34] 新しいスレ立てんなら立てる。 Cleanと一緒ならそう宣言する。 どっちか早く決めてもらいたい! ワタクシ、 言いたいことが山のように溜まっておるのです。 キミ,恐るることなかれ。(^^;) ttp://homepage3.nifty.com/Aransk/
33 名前:デフォルトの名無しさん mailto:sage [04/02/09 17:45] ↑のアホがいないときに立てるよ
34 名前:デフォルトの名無しさん mailto:sage [04/02/09 17:48] >>32 自分の名前でスレッド立てれば? 少しぐらいなら相手してあげてもいいよ ただし場所は pc.2ch.net/prog/ こっちでどうぞ。
35 名前:デフォルトの名無しさん mailto:sage [04/02/09 19:30] >>32 お前が立てろよ まあ直後にネタ板と化すだろうが
36 名前:デフォルトの名無しさん mailto:sage [04/02/09 22:09] おまえら あんま会話するな
37 名前:デフォルトの名無しさん mailto:sage [04/02/10 00:23] なんで>>13 にこだわるんだろ? module getcsv import StdEnv,ArgEnv Start world = StartCSV world StartCSV world # (readok, read_file, f)= sfopen filename FReadText world | not readok= abort "" # (write_file, f)= stdio f # (file)= CharListWrite (getCsvData col (CharListRead read_file)) write_file # (closeok, f)= fclose file f | not closeok= abort "" | otherwise= f where col= toInt argv.[1] filename= argv.[2] argv=getCommandLine つづけて宜しゅうございますか?
38 名前:デフォルトの名無しさん mailto:sage [04/02/10 00:34] もったいぶってどうするんだ? ここは1が密かに努力するスレだと思うぞ
39 名前:デフォルトの名無しさん mailto:sage [04/02/10 00:44] >>1 ではないのだが・・・ 続き getCsvData :: Int [Char] -> [Char] getCsvData num [x:xs] = getCsvData` num [x:xs] where getCsvData` n [x:xs] | x == '\n' = ['\n'] ++ getCsvData` num xs | x == ',' = getCsvData` (n-1) xs | n == 0 = [x] ++ getCsvData` n xs | otherwise = getCsvData` n xs // getCsvData` 0 [x:xs] = [x] ++ getCsvData` 0 xs getCsvData` n [] = [] CharListWrite [] f = f CharListWrite [c:cs] f = CharListWrite cs (fwritec c f) CharFileCopy infile outfile = CharListWrite (CharListRead infile) outfile CharListRead f | not readok = [] | otherwise = [char : CharListRead filepointer] where (readok,char,filepointer) = sfreadc f エラー処理は考えてません。 >>37 はインデントがずれているので、適当に脳内補完しといてくれ。
40 名前:デフォルトの名無しさん mailto:sage [04/02/10 00:49] いいぞがんがれ
41 名前:デフォルトの名無しさん mailto:sage [04/02/10 15:28] ん? 俺は考えなくていいみたいだな。
42 名前:デフォルトの名無しさん mailto:sage [04/02/10 15:34] >>41 >>37 ,>>39 は長すぎる。>>17 並になるよう考えてくれ。
43 名前:Aransk [04/02/10 18:59] >33〜36 ワタクシには、決して悪気が無いことは、良くお分かりの くせに…(少し毒気はあるが、藁藁) まあHaskellスレが立つことを気長にお待ちしましょう。 それまでは、このスレに居座りますので、悪しからず(^^; ttp://homepage3.nifty.com/Aransk/
44 名前:デフォルトの名無しさん mailto:sage [04/02/10 21:57] >>43 名無しで立てて後で「乙」とでも自演しておけばとりあえずはネタスレにならずに立つ
45 名前:デフォルトの名無しさん mailto:sage [04/02/10 23:06] >>43 みたいのを「構ってクン」ていうんですね.初めて見ました.
46 名前:デフォルトの名無しさん mailto:sage [04/02/10 23:24] >>43 立ったぞ 早よ逝け pc2.2ch.net/test/read.cgi/tech/1076418993/ …程々にな
47 名前:Aransk [04/02/11 13:20] >46 居心地が良さそうなんで、もう少し(微笑) そう言えばCleanってさあ、普通にダウンロードすると 旧ヴァージョンしか出来なくない? やはり金を払わないと最新版はダウンロードできないの? ttp://homepage3.nifty.com/Aransk/
48 名前:デフォルトの名無しさん mailto:sage [04/02/11 14:25] >>42 そう変わらん結果になると思うが、考えてはみよう。
49 名前:Aransk [04/02/12 16:45] CleanPjtを推進しているオランダの大学教授も 最近やる気を無くしているみたいね? やっぱり、商売にならないとキツイんだ。 そりゃぁ、EclipseやJakartaPjtを無償で使っている 連中に売り込むのは、いかにもツライものがあるよねぇ。 ttp://homepage3.nifty.com/Aransk/
50 名前:デフォルトの名無しさん mailto:sage [04/02/12 23:41] 誰か Aransk タン専用スレ立てキボンヌ。
51 名前:デフォルトの名無しさん mailto:sage [04/02/13 07:14] >>50 漏れがスレ立てられるようになるまで待ってろ。 関数型言語スレの住人は煽り耐性もdqn耐性も 弱いからな。
52 名前:Aransk [04/02/13 17:07] >50,51 でもCleanってさぁ。Haskellとは違って明らかに商用を 目指しているよねぇ?そのビジネスが成立するかどうかって Cleanスレでは重要じゃないの?でないと Clean言語自体が消えちゃうじゃんよぉ。 ttp://homepage3.nifty.com/Aransk/
53 名前:デフォルトの名無しさん mailto:sage [04/02/13 17:14] こんなのが流行る気がしないな。 このスレでも一向にコード書く奴出てこないし。 Aransk、おまえここに居座るつもりなら Cleanでなんかコード書いてみろよ。
54 名前:デフォルトの名無しさん mailto:sage [04/02/14 04:39] 元々はオランダの国家プロジェクトの副産物として登場したものなので、 商用を目指しているというのは正確ではない。 大学の研究用の材料にされているという方が正確だ。
55 名前:Aransk [04/02/14 17:52] >53 >This site is about functional programming >and purely functional language : Concurrent Clean. これCleanのプログラムじゃなかったっけ?(^^; >54 Cleanの最新版は金を払わんとダウンロード出来ん。 それを商用と言わずして何を商用と言うのか?(^^) IBMが5千万ドル開発費を注ぎ込んだ、Eclipseが 無償でダウンロードできる。これも大学の研究用の 材料であろうか?(^^; ttp://homepage3.nifty.com/Aransk/
56 名前:デフォルトの名無しさん mailto:sage [04/02/14 18:42] アホとは思っていたが。 これ程とは・・・
57 名前:デフォルトの名無しさん [04/02/14 19:29] 商用ってば、Eiffelのシャチョさん、一昨年の日本のOOカンファレンスに招聘されてたけど 相変わらず精力的だったな。やっぱコンサルとか講演とか、別の収入があるからかw
58 名前:デフォルトの名無しさん mailto:sage [04/02/14 19:47] どうする〜? Eiffel?
59 名前:デフォルトの名無しさん mailto:sage [04/02/14 21:21] Aransk 様の Clean 講座マダー
60 名前:デフォルトの名無しさん mailto:sage [04/02/14 21:30] Cleanで hello Dialog module hello import StdEnv, StdIO Start world = startIO NDI Void (snd o openDialog undef hello) [] world where hello= Dialog "" (TextControl "Hello world!" []) [WindowClose (noLS closeProcess)]
61 名前:デフォルトの名無しさん mailto:sage [04/02/15 03:57] >>55 >Cleanの最新版は金を払わんとダウンロード出来ん。 英語のサイト巡りも禄に出来ない人は来ないで下さい。
62 名前:37の配列版 mailto:sage [04/02/15 12:03] module csvref import StdEnv,ArgEnv Start world # (readok, file, world)= sfopen filename FReadText world | not readok= abort "open failure" # (console, world)= stdio world (closeok, world)= fclose (console <<< getCsv col file) world | not closeok= abort "close failure" = world where col= toInt argv.[1] filename= argv.[2] argv=getCommandLine
63 名前:37の配列版続き mailto:sage [04/02/15 12:03] getCsv :: Int File -> String getCsv num file | num<= 0 = abort "out of range" = selectCsv (num-1) (stringRead file) 0 where selectCsv :: Int String Int -> String selectCsv n s i | s.[i] == '\r' = "" | s.[i] == '\n' = "\n" +++ selectCsv (num-1) s (i+1) | s.[i] == ',' = selectCsv (n-1) s (i+1) | n == 0 = toString s.[i] +++ selectCsv n s (i+1) = selectCsv n s (i+1) stringRead :: File -> String stringRead f | sfend f = "\r" # (line,filerest) = sfreadline f = line +++ stringRead filerest
64 名前:Aransk [04/02/15 17:49] >61 1.3じゃなくて、2.1無償ダウンロード出来るの? ttp://homepage3.nifty.com/Aransk/
65 名前:デフォルトの名無しさん mailto:sage [04/02/15 18:07] Aransk 様が Clean に興味を持たれたようです。
66 名前:デフォルトの名無しさん mailto:sage [04/02/15 18:13] >>64 ここにいるのは元号が大学名の学校出身ばかりだから、 得意の英語でMLに質問したら? Cleanのメーリングリストのアーカイブ(Discussions ) www.cs.kun.nl/pipermail/clean-list/
67 名前:デフォルトの名無しさん mailto:sage [04/02/15 19:24] 明治のことかー!!
68 名前:デフォルトの名無しさん mailto:sage [04/02/15 19:35] 元禄大学
69 名前:デフォルトの名無しさん mailto:sage [04/02/15 21:00] >>66 Aranskタンには無理だとわかっていてあえてそーゆう提案してるだろ?
70 名前:デフォルトの名無しさん mailto:sage [04/02/15 22:17] Aranskタンは愛すべき糞コテになりました そろそろ萌え擬人化します
71 名前:Aransk [04/02/16 21:05] >70 >Aranskタンは愛すべき だよね?それがさぁ。 ttp://homepage3.nifty.com/Aransk/のMSGボードに いつかは、来られるのではと、「密かに」期待はして おりました。それが、な、なんと、本日7000通もの 大量、カキコがありました。大漁節!です。 お蔭様でMSG板はオシャカ!であります。(^^; mild_server_super_lights先生を存知より の方が、もし「2ちゃんねる」にも出入りされて おられたら、是非、先生にお伝え願いたいのです。 Aranskは、またのお越しをお待ち申し上げて おりますと。今度は、先生の弊HPに対する ご意見なり、ご批判なりをご自由にお書き下さい。 但し、「多くても」10通以内にね。(大笑い)
72 名前:デフォルトの名無しさん mailto:sage [04/02/16 22:08] ((;゚Д゚))ガクガクブルブル ほ、本物?
73 名前:デフォルトの名無しさん mailto:sage [04/02/16 22:11] Aranskたんの萌えエロ画像キボン
74 名前:デフォルトの名無しさん mailto:sage [04/02/17 02:59] >>66 意味分からん
75 名前:Aransk [04/02/17 18:21] >72 >((;゚Д゚))ガクガクブルブル ほ、本物? mild_server_super_lights先生って、2ちゃんねるでは 「そんなに」有名人なんでしょうか?(^^; ttp://homepage3.nifty.com/Aransk/
76 名前:デフォルトの名無しさん mailto:sage [04/02/17 21:24] いつの間にAranskだと認めたんだね.
77 名前:Aransk [04/02/18 18:23] >76 >いつの間にAranskだと認めたんだね. もう随分以前から「ヒーロー勇気」や「名無し」を 使用せず、本名で発言しております。(^^; でないと2ちゃんねるの雑誌に有名コテハンとして 掲載してくれないらしい?(大藁藁) ttp://homepage3.nifty.com/Aransk/
78 名前:デフォルトの名無しさん mailto:sage [04/02/19 18:44] Aranskは自分がなにか``特別''であると 思い込みたくてしょうがないらしい... 916 :デフォルトの名無しさん :03/12/31 09:02 >913 ム板だけではなく、上の中東情勢板でも結構暴れたらしい?(藁) ム板と中東板を往復するのは、管理人だけなのにって 西村クンが嘆いていたそうな。 ところでヤフーの年間人気サイトで2ちゃんが表彰されていた。 まずはご同慶の至りです。 でも西村くんってちょっとヤバそうな顔してるね。 あの手の顔はいったん切れると無茶苦茶、恐いか、メッタメタ オモロイ!かどちらかだな。(藁藁) >ム板と中東板を往復するのは、管理人だけなのに プッ,何言ってんの?
79 名前:デフォルトの名無しさん mailto:sage [04/02/19 18:52] >>76 ,>>78 そっとしといてやれよ。第一Cleanと関係ないぞ。
80 名前:Aransk [04/02/19 19:29] >76,78 そうだぁ!Cleanに関係ない質問をするな! (それに簡単に乗せられる奴も、問題ではある。(^^;) Javaやその他言語の無償提供環境の中で Cleanのような弱小言語がビジネスとして 成立するのか?また成立する「必要が」あるのか? それを問いたい。(^^; ttp://homepage3.nifty.com/Aransk/
81 名前:デフォルトの名無しさん mailto:sage [04/02/19 19:48] >Javaやその他言語の無償提供環境の中で >Cleanのような弱小言語がビジネスとして >成立するのか?また成立する「必要が」あるの 「○○言語に関する質問」と「○○言語のスレがビジネスとして 成立するかどうかの議論」は別々のスレでやった方がいいと思う.
82 名前:デフォルトの名無しさん mailto:sage [04/02/19 19:57] つか、それしかネタ無いんか?
83 名前:デフォルトの名無しさん mailto:sage [04/02/19 23:20] Aransk って普段どんなプログラムを作ってるの?
84 名前:デフォルトの名無しさん mailto:sage [04/02/20 04:39] >>80 最新版にこだわるけど 有料の最新版はダウンロード版とどこが違うの?
85 名前:デフォルトの名無しさん mailto:sage [04/02/20 13:11] 最新版 無料でダウンロード可能 登録も不要 ライセンスはLGPL ttp://www.cs.kun.nl/~clean/Download/main/main.htm
86 名前:Aransk [04/02/20 17:56] >82 >つか、それしかネタ無いんか? 悪い。Cleanで知ってることってこれだけなんです。(^^; >83 普段はプログラムに触っておりません。 ひたすら面白そうな新しい言語を探し、言語仕様を 読んで、DLして験すだけ。だから、公平な評価が可能なので あります。純粋の鑑定団! 現在SimkinとIoを調査中であります。 >85 えぇ!ホントですか?ビジネス・プラクティスの変更か? どうやって、開発部隊は食っていけるのだろう? ttp://homepage3.nifty.com/Aransk/
87 名前:デフォルトの名無しさん mailto:sage [04/02/21 02:54] 書き込みがあまり無いようなので ネタフリとして sky.zero.ad.jp/~zaa54437/programming/clean/CleanBook/part1/Chap1.html#sc33 の演習でも順番にといていきましょう。 1.CLEANシステムがあなたのコンピュータにインストールされていることを確かめなさい。そのシステムは、www.cs.kun.nl/~cleanからダウンロードできます。値42を印字するプログラムを書いて実行しなさい。 2.2つの引数、つまり、nとxを取る関数を書き、それらの累乗xnを計算しなさい。その引数を平方する関数を、それを使って構成しなさい。128の平方を計算するプログラムを書きなさい。 3.その引数の数字を加算する関数isum :: Int -> Intを定義しなさい。そうすると、 isum 1234 = 10 isum 0 = 0 isum 1001 = 2 isumは、非負の引数に適用されるものとする。
88 名前: mailto:sage [04/02/23 14:49] んじゃ、GUI版でも考えるかな。 今週末くらいを目途に。
89 名前:デフォルトの名無しさん mailto:sage [04/02/25 23:50] 関数型言語初心者なので素直にコンソール版で解いてみた。型指定は省略。 残りの問題も解いてみたけど、ネタ切れしそうなので投下は止めときます。 あ、5.以降の関数は全て1行で書けるね。 // 1. ///////////////////////////////// Start = 42 // 2. ///////////////////////////////// pow n 0 = 1 pow n x = n * pow n (x-1) square n = pow n 2 Start = (pow 2 10, square 128) // 3. ///////////////////////////////// isum 0 = 0 isum n = n-(n/10)*10 + isum (n/10) Start = (isum 123456789, isum(-123456789))
90 名前:42の表示GUI版 mailto:sage [04/02/27 18:38] module display42 import StdEnv, StdIO Start :: *World -> *World Start w = startIO NDI Void initial [] w where initial pst # (err,pst) = openDialog Void (Dialog "display 42" (TextControl "42" []) [WindowClose (noLS closeProcess)]) pst | err<>NoError = closeProcess pst = pst
91 名前:デフォルトの名無しさん mailto:sage [04/03/06 17:01] 他のGUI版も作ろうかと思ったが、まんまマニュアルにある。
92 名前:デフォルトの名無しさん mailto:sage [04/03/11 00:38] // 4. divable :: Int -> Bool divable n | n < 9 = False | n == 9 = True = divable (isum n) Start = (divable 6, divable 9, divable (-9)) // 定義域は正の値だけ // 5, 6 max a b = if (a > b) a b min a b = if (a < b) a b // 7, 8 MaxOfList :: [a] -> a | Ord a MaxOfList [x:xs] = foldl max x xs MinOfList :: [a] -> a | Ord a MinOfList [x:xs] = foldl min x xs // 9-12 Last :: [a] -> a Last [x:xs] = foldl (\_ b = b) x xs LastTwo :: [a] -> (a, a) LastTwo [x,y:zs] = foldl (\(_,b) c = (b,c)) (x, y) zs Reverse :: [a] -> [a] Reverse [x:xs] = foldl (\cs c = [c:cs]) [x] xs Palindrome :: [a] -> Bool | Eq a Palindrome xs = xs == Reverse xs
93 名前:デフォルトの名無しさん mailto:sage [04/03/17 00:23] sky.zero.ad.jp/~zaa54437/programming/clean/CleanBook/part1/Chap2.html#sc20 人もいないし、黙々と解いてみる。 module Chapter2 import StdEnv // 1 odd = isEven o ((+)1) // 2 next :: (Real, Real) -> (Real, Real) next (_, y) = (y, y/10.0) reachZero :: (Real, Real) -> Bool reachZero (_, y) = y == 0.0 Start = eps where (eps, _) = until reachZero next (1.0, 1.0) ワンライナーだとこんな感じか。さすがに汚い。 Start = fst (until (((==) 0.0) o snd) (\(_,y) = (y, y/10.0)) (1.0, 1.0))
94 名前:93 mailto:sage [04/03/17 00:27] // 3 (かなーり手抜き) countday :: (Int,Int,Int) (Int,Int,Int) -> Int countday now bth = absday bth - absday now absday :: (Int,Int,Int) -> Int absday (d,m,y) = (y-1)*365 + (y-1)/4 - (y-1)/100 + (y-1)/400 + sum (take (m-1) (months y)) + d months :: Int -> [Int] months y = [31, if (leap y) 29 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] leap :: Int -> Bool leap y = divisible y 4 && (not(divisible y 100) || divisible y 400) divisible :: Int Int -> Bool divisible t n = t rem n == 0 Start = countday (20,2,2004) (20,3,2004) // 4 mapfun :: [(a->b)] a -> [b] mapfun [] x = [] mapfun [f:fs] x = [f x : mapfun fs x] Start = mapfun [sum, avg, prod] [1..10]
95 名前:デフォルトの名無しさん mailto:sage [04/03/18 01:56] CleanIDEのエディタに日本語入力すると文字化けする(´・ω・`) それは別のエディタを使えば済む問題だけど、Cleanコンパイラのほうが ダメ文字(2バイト目に0x5C(「\」記号)がある文字)に対応してないのはちょっと悲しい。 しょうがないからCleanIDEに日本語を直接入力してわざと文字化けさせて、 「\」記号が出てきたら、手入力で「\」記号をもう一つ追加して問題を回避してる。 ダメ文字って、Cleanのパーザをいじらないと対応できないのかな…
96 名前:デフォルトの名無しさん mailto:sage [04/03/19 13:50] ASCII以外には全く対応してないのが現状。 UNICODE担当(?)の人は、なんか違うことやってるので期待できない。
97 名前:デフォルトの名無しさん mailto:sage [04/03/20 05:24] >>96 そうですか…日本語の扱いは少し面倒ですね。 sky.zero.ad.jp/~zaa54437/programming/clean/CleanBook/part1/Chap3.html#sc55 淡々と解いてみる。そろそろ難しくなってきたかも。この先にはAVL木の実装とか面倒臭い問題があるなぁ… // 1, 2, 4, 5 CountOccurences :: a [a] -> Int | == a CountOccurences c xs = length [x \\ x<-xs | x==c] MakeFrequenceTable :: [a] -> [(a, Int)] | Eq a MakeFrequenceTable xs = [(x, 100*CountOccurences x xs / length xs) \\ x<-removeDup xs] myflatten :: ([[a]] -> [a]) myflatten = foldr (++) [] Permutations :: [a] -> [[a]] Permutations []= [[]] Permutations [x:xs] = [zs \\ ys <- Permutations xs, zs <- interleave x ys] interleave :: a [a] -> [[a]] interleave x ys = [insertAt i x ys \\ i <- [0..length ys]] // 3. (==) :: (s,t) (s,t) -> bool | Eq s & Eq t (==) (a,b) (c,d) = a == c && b == d 右辺には2つの(==)があるが、1つめは型s、2つめは型tに対して定義された(==)である。左辺で定義した(==)は、型(s,t)に対して適用される。 この式にある3つの(==)は、すべて属する型が異なっているため別々の関数である。したがって再帰的ではない。 (==) :: [s] [s] -> bool | Eq s (==) [x:xs] [y:ys] = x==y && xs==ys // セクション3.1.2より抜粋 右辺には2つの(==)があり、1つめは型s、2つめは型[s]に対して定義された(==)である。左辺で定義した(==)は、型[s]に対して適用される。 左辺と右辺に同じ型に属する(==)がある。この2つの(==)は同じ関数である。したがって再帰的な定義である。
98 名前:デフォルトの名無しさん mailto:sage [04/04/09 16:53] Genericの世界は濃いね。
99 名前:デフォルトの名無しさん mailto:sage [04/04/10 23:45] Haskell、Clean辺りだとまだましなのかもしれないが、 関数型言語は思わぬパフォーマンス上の失策をやらかしてそうで怖い。 扱いきれない感がある。もっとクンフーを積まねば・・・。
100 名前:100 mailto:100 [04/04/16 22:32] 記念くぁwせdrftgyふじこ
101 名前:デフォルトの名無しさん mailto:sage [04/04/19 21:36] sky.zero.ad.jp/~zaa54437/programming/clean/LanguageReport20/Chap9.html これのセクション4以降が意味不明、理解不能。 気にしないほうがいいのか? ・・・にしても静かなスレだね。
102 名前:デフォルトの名無しさん mailto:sage [04/04/20 00:15] 一意型付けって同じものは同時に二回以上簡約されない って事であってる?
103 名前:デフォルトの名無しさん mailto:sage [04/04/20 16:34] 同時にという意味が分からん。
104 名前:デフォルトの名無しさん mailto:sage [04/04/20 19:30] 型一意性ってのはClean 独自の物なの?それとも最近の関数型言語の流行? Clean以外で型一意性の考え方のある言語があれば教えてください。
105 名前:デフォルトの名無しさん mailto:sage [04/04/20 21:01] ないといえばない
106 名前:デフォルトの名無しさん mailto:sage [04/04/20 21:28] 研究や論文はあったような
107 名前:デフォルトの名無しさん mailto:sage [04/05/01 14:19] まとまったのはない
108 名前:デフォルトの名無しさん mailto:sage [04/05/02 22:57] Cleanで書かれた正規表現やコード変換などの文字列処理ライブラリーはありまつか?
109 名前:デフォルトの名無しさん mailto:sage [04/05/04 17:14] 関数型言語スレでは余裕で無視されてますが、僕は気にしません。 コツコツ積み上げていきます。
110 名前:デフォルトの名無しさん mailto:sage [04/05/16 00:29] 型一意性について。 ふつうは参照透明性を確保するのに、データのコピーを作ってそいつを変更する必要があるけど、 もし変更後に変更前のデータを使わないことを保証できれば、元のデータはいらないから、わざわざコピーを作る必要もない。 つまり、データの破壊的更新を行っても参照透明性を維持できる。 ってことじゃないかと。
111 名前:デフォルトの名無しさん mailto:sage [04/05/27 12:46] 大体そだよ。
112 名前:デフォルトの名無しさん mailto:sage [04/05/27 13:06] つか、グラフを使用した説明はわかりやすいと思うけれども。
113 名前:デフォルトの名無しさん [04/07/11 04:25] せいうちん
114 名前:名無しさん@そうだ選挙に行こう mailto:sage [04/07/11 18:17] kinnikuman 2 sei?
115 名前:デフォルトの名無しさん mailto:sage [04/08/03 01:56] >>104 Mercuryという言語で使える。 www.cs.mu.oz.au/mercury #Clean好きで来てみたら寂しいスレだ(′・ω・`)。 #現在Cleanの一意性型の論文読んるけどわかったようなわからんような。
116 名前:デフォルトの名無しさん [04/08/29 15:23] Cleanで書かれたテトリスのソースはどこかにないでしょうか? 古いバージョンに付いていたそうですが、今のには無さそうなので・・
117 名前:デフォルトの名無しさん mailto:sage [04/09/15 17:55:52] if c (fwritec 'a' file) (fwritec 'b' file) は大丈夫なのに MyIf True t e = t MyIf False t e = e MyIf c (fwritec 'a' file) (fwritec 'b' file) はだめなのか。
118 名前:デフォルトの名無しさん mailto:sage [04/09/19 03:40:16] >>117 MyIfについては、一意型の*Fileオブジェクトへの参照数が2になるのがエラーの原因のはず。 このあたりに説明があったと思う:sky.zero.ad.jp/~zaa54437/programming/clean/LanguageReport21/Chap9.html ifは言語組み込みの機能だから、特別扱いだと思う。StdEnv探しても関数の定義がないし。 (_system.abcにifの定義らしき記述があるけど・・・読める人いたら解説きぼん) 言語組み込みのifに相当するMyIfは、通常の関数として書けないような気がするけど 実際のところはどうなんでしょうか>詳しい人
119 名前:デフォルトの名無しさん mailto:sage [04/09/24 18:13:14] >>117 MyIf b t e = | b = t | otherwise = e 処理系が手元にないんで試せないけど、これでもダメかね? tが評価される時はeがゴミなのでfileへの参照は1になると思うんだが。
120 名前:デフォルトの名無しさん mailto:sage [04/09/24 18:59:43] 要するにAlternativeに書けってことだな。
121 名前:デフォルトの名無しさん mailto:sage [04/09/24 23:51:36] >>119 ダメですた。 つーか、 MyIf b t e = if b t e でもダメ。
122 名前:デフォルトの名無しさん mailto:sage [04/09/25 01:17:12] MyIf b (fwritec 'a' file) (fwritec 'b' file)の時点で、fileへの参照数が2だと認識されている模様。 まあMyIfを使わず、素直にガードで分岐すれば動作するんだけどね。 ガードやcaseなら、ちゃんとAlternativeだと見なしてくれる。 WriteAorB b file | b = fwritec 'a' file = fwritec 'b' file
123 名前:デフォルトの名無しさん [04/09/26 19:08:00] なんかこの言語サンプル見ても意味不明なのがすごいです 構文が抽象化されすぎて余計わかりにくい感じがするのですが
124 名前:デフォルトの名無しさん mailto:sage [04/09/26 19:59:48] コンピュータに量はおまかせを……
125 名前:デフォルトの名無しさん mailto:sage [04/09/26 23:39:43] Haskellとあんま変わんないとおもうけど。 IOからまなきゃ
126 名前:デフォルトの名無しさん mailto:sage [04/09/28 13:06:25] >>122 分岐(if, case, ガード)が陽に見えているところでしか 一意性解析していないということか。 MyIfが使えるようにするには、自分で型に一意性注釈を 書かなければならないのだろうが、分岐のような 「いくつかの引数のうちどれか一つしか評価しない」というような ことを型レベルで表現するのは無理だから、やっぱできないのかな。
127 名前:デフォルトの名無しさん mailto:sage [04/09/29 22:43:40] んなもんLISPみたいにquoteがないと作れるわけない
128 名前:デフォルトの名無しさん mailto:sage [04/09/30 00:50:39] 一意性解析ってどうやるんだろ。ちょっと考えてみた感じだと 関数はパターンマッチングによる場合分けによって定義されるとする。 その場合の単純な一意性解析の戦略を考えてみると関数の定義が以下の形 f x = g1 a1 f x = g2 a2 ... (x, a1, a2, ... は引数の列) だった場合、最外簡略を仮定すると引数は2つのグループに分けられる(両方に属するものもあるか)。 つまりどの場合分けを採用するかを決める際に評価され得る引数と、その後に評価されうる引数である。 前者は引数で変数以外のパターンが使われているもの、後者は右辺で使われているものである。 前者の集合をP_fとし、後者の集合をS_f_1, S_f_2, ...とする。(fは自明なときは省略) 例えば MyIf True t e = t MyIf False t e = e の場合P_MyIf = {1番目の引数}, S_MyIf_1 = {2番目の引数}, S_MyIf_2 = {3番目の引数}となる。 このときある変数が一意である条件は それがPに高々1回だけ現れ、Sには現れない。 それが各S_iについて高々1回だけ現れ、Pには現れない。 のどちらかとなる。 これで単純な場合は大丈夫だけど MyIf c t e = if c t e とするとP = {}, S_1 = {c, t, e}となって上手く行かない。 そのためには f x = g (h1 a1) (h2 a2) ... という形を考えてgやh1などのP, Sも考慮に入れればOK? それで十分なのか、それができるのかはもうちょっと考えてみないとわからない。 おしえてエライ人。
129 名前:デフォルトの名無しさん mailto:sage [04/10/26 02:32:30] UNIX環境でつかってる人いる?
130 名前:デフォルトの名無しさん mailto:sage [04/10/26 21:40:24] バイナリ版を試してみようとしたけど、xviewがないと動かない……。 面倒なのでその先はまだやってないっす。 FreeBSD で動かしたくてソースコードもダウンロードしたけど、アセンブリばっ かしなのでかなり無理っぽい。っていうかどういう風にビルドすればいいのか ぜんぜんわからない。
131 名前:デフォルトの名無しさん mailto:sage [04/11/05 13:48:35] そんじゃ最初っから話にならないじゃん(w
132 名前:デフォルトの名無しさん mailto:sage [04/11/05 18:50:51] 開発環境込みの環境だからねえ。 GUI な開発環境なし版が欲しい。 ただ、普通の Linux とか Solaris なら動くんじゃないの?
133 名前:デフォルトの名無しさん mailto:sage [04/11/10 13:02:17] コンソールでやるにはどうしたら良いんだ?ってのがMLで話題になってたな、随分前
134 名前:デフォルトの名無しさん [04/11/22 20:48:55] さすがにこれを仕事で使う勇気のある奴はまだ日本にはいないだろうな
135 名前:デフォルトの名無しさん mailto:sage [04/11/23 01:26:28] 一応開発元は実用言語目指してるんだけどねぇ。 今開発って続いてるの?
136 名前:デフォルトの名無しさん mailto:sage [04/11/24 10:42:39] 開発というより研究は続いている
137 名前:デフォルトの名無しさん [04/12/15 20:43:51] 下のがエラーになる理由がわからん Length :: [a] -> Int Length = foldr (¥x -> (+) 1) 0
138 名前:デフォルトの名無しさん mailto:sage [04/12/15 23:30:00] 型が違うよー Lengthは引数を持たず(アリティ0)、リスト[a]をIntに変換する関数を返すので Length :: ([a] -> Int) でたぶん通る。
139 名前:デフォルトの名無しさん [04/12/22 21:13:21] >>138 おおサンクス 型が違ってたのか。Lengthの定義がおかしいのかと思ってたよ。 最近関数型言語の勉強はじめたんだが、楽しすぎるな。 「プログラミング言語は思考の増幅器である」って昔誰かが言ってたが まさにそんな感じ。脳汁出まくりですよ
140 名前:デフォルトの名無しさん mailto:sage [05/01/21 19:21:00 ] 新バージョンが出る予感
141 名前:デフォルトの名無しさん mailto:sage [05/03/15 21:08:05 ] www.cs.ru.nl/~clean/Recent_Latest_News/body_recent_latest_news.html によると、一昨年の10月31日の 2.1.0 から更新されてない様だが、新しいのあるの?
142 名前:デフォルトの名無しさん mailto:sage [2005/05/06(金) 16:08:55 ] Clean I/O と Haskel monadic I/Oの違いを教えてください。
143 名前:デフォルトの名無しさん [2005/05/14(土) 00:12:25 ] 唐揚げ
144 名前:デフォルトの名無しさん [2005/05/14(土) 00:12:59 ] 唐揚げ
145 名前:デフォルトの名無しさん mailto:sage [2005/07/16(土) 14:20:22 ] 新バージョン出てるよ
146 名前: [2005/07/18(月) 21:05:13 ] May 31, 2005 Clean 2.1.1 is released for Windows, MacOS X, Linux, and Solaris. This release contains bug fixes and new features, to wit: + Libraries for Windows: GAST, GECs, Hilde, Parser + Foreign exports + Improved redirected standard input/output + Let in comprehensions + Code generator optimisations
147 名前:デフォルトの名無しさん mailto:sage [2005/07/19(火) 08:33:13 ] ここもdylanスレぐらい寂れてんな Cleanが話題にならない理由として考えられるのは 基本概念が複雑なことだな 異質すぎて何が効率よいとかが判断できない
148 名前:デフォルトの名無しさん mailto:sage [2005/07/19(火) 12:46:18 ] 複雑じゃないよ、異質ではあるが
149 名前:デフォルトの名無しさん mailto:sage [2005/07/19(火) 20:25:19 ] どうでも良い事かもしれんが、ダウンロードにレジストレーションが必要なのは面倒。 ライセンスも分かりにくい。自分が書いたコードはライセンス汚染を受けるの?
150 名前:デフォルトの名無しさん mailto:sage [2005/07/19(火) 20:48:23 ] >>149 非商用の場合はLGPL、商用の場合は要問合せ。 そもそも、registしなくてもダウンロードできるし。
151 名前:デフォルトの名無しさん mailto:sage [2005/07/19(火) 21:15:51 ] >>150 static なライブラリを作るのか知りたかったんだけど、レジスト不要なら自分で試してみます。 サンクス。 static でもソース公開の義務がないのは知ってるけど、ちょっと面倒だね。
152 名前:デフォルトの名無しさん mailto:sage [2005/07/20(水) 20:33:06 ] >>148 異質ってことは、複雑かどうかもわからんてことよw 難解だよな
153 名前:デフォルトの名無しさん [2005/08/06(土) 12:24:17 ] Concurrent Clean 日本語化プロジェクト 期待あげ ttp://www.geocities.jp/lethevert/softwares/clean/localize.html
154 名前:デフォルトの名無しさん mailto:sage [2005/08/06(土) 12:52:50 ] ここ見てるか知らないけど がんばれよー
155 名前:デフォルトの名無しさん mailto:sage [2005/08/06(土) 19:36:04 ] GUIライブラリまで揃ってるのに…もう少し人気出ないもんかね
156 名前:デフォルトの名無しさん mailto:sage [2005/08/06(土) 20:14:56 ] 人気が出る要素がまるでないからな
157 名前:デフォルトの名無しさん mailto:sage [2005/08/07(日) 00:09:29 ] せめてHaskell程度には…
158 名前:デフォルトの名無しさん mailto:sage [2005/08/07(日) 14:50:44 ] ベンチマークとか 他言語とのコードの比較表とか そういったもので優位性というか、 どんだけ違うか示していくというのはどうか
159 名前:デフォルトの名無しさん mailto:sage [2005/08/08(月) 14:13:59 ] >>156 ( ´_ゝ`)フーン 「まるでない」と言い切れるほど詳しくご存知なんですね。
160 名前:デフォルトの名無しさん mailto:sage [2005/08/10(水) 23:11:26 ] たぶんClean理解してる奴日本全国数えても20人いなさそう。
161 名前:デフォルトの名無しさん mailto:sage [2005/08/25(木) 21:50:11 ] Linuxでやってみました。 CUIは問題無く動きました。 GUIはXView無しでもWINE使って、 Hello World 程度を動かせました。 Wineでもいいから一通り動いて、 1.3のlibraryも使えて、 Emacsのclean-modeがhaskell-mode並に使えれば…と思います。
162 名前:勉強中 mailto:sage [2005/09/07(水) 22:28:59 ] HaskellよりCleanの方が有望に見える。
163 名前:デフォルトの名無しさん mailto:sage [2005/09/07(水) 23:42:54 ] >>162 詳しく
164 名前:デフォルトの名無しさん mailto:sage [2005/09/08(木) 00:11:17 ] 土方プログラマやりながら勉強してるから、 勉強終わるまでちょっとまって。
165 名前:デフォルトの名無しさん mailto:sage [2005/09/11(日) 21:05:30 ] Haskellはコンパイル遅杉
166 名前:名無しさん@そうだ選挙に行こう mailto:sage [2005/09/11(日) 23:03:09 ] >>165 ここはCleanのスレですが
167 名前:デフォルトの名無しさん mailto:sage [2005/09/23(金) 10:59:05 ] Clean は完璧主義のデレツン言語。 Haskell は他言語で1文字でも短く書けるコードがありましたら、 お申し出下さい言語。
168 名前:デフォルトの名無しさん mailto:sage [2005/09/25(日) 03:21:36 ] language shootoutのfannkuchenで遊んでみました // (setq compile-command "clm -b -nt f && time ./a.out") module f import StdEnv permutations [] = [[]] permutations [x:xs] = [zs \\ ys <- permutations xs, zs <- interleave x ys ] interleave x [] = [[x]] interleave x [y:ys] = [[x:y:ys] : [[y:z]\\ z <- interleave x ys]] flop [1:ys] = 0 flop lis = 1+ flop (revAt (hd lis) [] lis) where revAt 0 fr bk = fr++bk revAt _ fr []= fr revAt n fr [x:xs] = revAt (n-1) [x:fr] xs Start = "Pfannkuchen(9)=" +++ toString (maxList [flop x \\ x<- (permutations [1..9])]) +++""
169 名前:デフォルトの名無しさん mailto:sage [2005/09/25(日) 04:14:55 ] 意味不明度120%言語
170 名前:デフォルトの名無しさん mailto:sage [2005/09/25(日) 18:29:33 ] >>169 言語のせいにするなってw
171 名前:勉強中 mailto:sage [2005/09/28(水) 23:37:02 ] 過疎。 一意性型付けは一部で型を自分で指定しないといけないのがキツイ ここらへんは CLASが参考になりそう。 // update使うともう少しよさげ arraySwap ar i j #(v_i,ar) = ar![i] #(v_j,ar) = ar![j] = {ar & [i]=v_j,[j] =v_i} arrayReverse ar a z | a >= z = ar = arrayReverse (arraySwap ar a z) (a + 1) (z - 1) arrayCopy:: !*{#Int} -> *(*{#Int}, *{#Int}) arrayCopy ar #(sz,ar)=usize ar #(ar_0,ar)=ar![0] = arrayCopyRange ar (createArray sz ar_0) 0 (sz-1) arrayCopyRange:: !*{#Int} !*{#Int} !Int !Int -> *(*{#Int},*{#Int}) arrayCopyRange ar ar2 i j | i > j = (ar,ar2) #(v_i,ar) = ar![i] = arrayCopyRange ar {ar2 & [i]=v_i} (i+1) j
172 名前:デフォルトの名無しさん mailto:sage [2005/09/30(金) 00:06:48 ] Cleanの編集モードだけど clean-mode より haskell-modeの方が書きやすいと思った。
173 名前:デフォルトの名無しさん mailto:sage [2005/10/02(日) 01:10:08 ] countFlips:: !Int !*{#Int} -> (Int,*{#Int}) countFlips acc perm # (p_0, perm) = perm![0] | p_0 == 1 = (acc,perm) = countFlips (1+acc) (arrayReverse perm 0 (p_0-1)) successor:: !*{#Int} -> (Bool,*{#Int}) successor perm # (n , perm) = usize perm # (i , perm) = lp1 (n- 2) perm | i == -1 = (False, perm) # (ith, perm) = perm![i] # (j,perm) = lp2 (n - 1) ith perm # perm = arrayReverse (arraySwap perm i j) (i + 1) (n-1) = (True , perm) where lp1:: !Int !*{#Int} -> (Int, *{#Int}) lp1 i perm | i < 0= (-1 , perm) # (plus,perm) = perm![i+1] # (val,perm) = perm![i] | plus > val = (i, perm) = lp1 (i-1) perm lp2:: !Int !Int !*{#Int} -> (Int, *{#Int}) lp2 j ith perm # (val_j , perm) = perm![j] | (val_j > ith) = (j,perm) = lp2 (j-1) ith perm
174 名前:デフォルトの名無しさん mailto:sage [2005/10/02(日) 01:13:23 ] fannkuch n = loop 0 {y\\ y <- [2,1] ++[3..n]} (createArray n 0) where loop::!Int !*{#Int} !*{#Int} ->Int loop f pi pi2 # (pi, pi2) = arrayCopyRange pi pi2 0 (n-1) # (c , pi2) = countFlips 0 pi2 # next = max c f # (suc, pi) = successor pi | suc = loop next pi pi2 = next Start = fannkuch 9 // 全て型を付けても Cの1.5倍以上遅い orz
175 名前:デフォルトの名無しさん mailto:sage [2005/10/02(日) 23:34:16 ] pure Cleanでgccより速くなりました。比較対象はdebian gcc 4.0.1 gcc -pipe -Wall -O3 -fomit-frame-pointer -funroll-loops f.c -o f.gcc_run time ./a.out 9 && time ./ f.gcc_run #Cは某所にこれ追加 > p[0]=2;p[1]=1; real0m0.181s # clean real0m0.201s # gcc //clm -h 450k -b -nt -I /home/my/share/lib/clean -I /home/lib/StdLib // -I /home/my/clean/lib/ArgEnv/ -l /home/my/clean/lib/ArgEnv/ArgEnvC.o // fannkuch && time ./a.out 9" module fannkuch import StdEnv, StdMaybe, MyUtility, MyArray countFlips:: !Int !*{#Int} -> (Int,*{#Int}) countFlips acc perm #! (p_0, perm) = perm![0] | p_0 == 1 = (acc,perm) = countFlips (1+acc) (arrayReverse perm 0 p_0) fannkuch n = fannkuch` 0 {y\\ y <- [2,1] ++[3..n]} (createArray n 0) where fannkuch`::!Int !*{#Int} !*{#Int} ->Int fannkuch` f org cpy #! (org,cpy) = arrayCopyn org cpy n #! (c,cpy) = countFlips 0 cpy = case (successorPermutaion n org) of Just org = fannkuch` (max c f) org cpy Nothing = max c f Start ="pf("+++ arg1+++")="+++toString (fannkuch (toInt arg1)) +++ ";"
176 名前:デフォルトの名無しさん mailto:sage [2005/10/02(日) 23:40:08 ] arraySwap:: !*{#Int} !Int !Int -> *{#Int} arrayReverse ar a z :== arrayReverse` ar a (z-1) // arrayReverse 概略 araySwap inline化 arrayCopyn ar ar2 n :== arrayCopyn` ar ar2 (n-1) where arrayCopyn`:: !*{#Int} !*{#Int} !Int-> (*{#Int},*{#Int}) arrayCopyn` ar ar2 -1 = (ar,ar2) arrayCopyn` ar ar2 i #! (v_i,ar) = ar![i] = arrayCopyn` ar {ar2 & [i]=v_i} (i-1) successorPermutaion n perm :== successor` (n-2) perm where successor`:: !Int !*{#Int} -> (Maybe *{#Int}) successor` i perm | i < 0= Nothing #! (plus,perm) = perm![i+1] #! (val,perm) = perm![i] | plus > val#! (ith,perm) = perm![i] #! (j, perm) = lp2 (n - 1) ith perm #!perm = arrayReverse (arraySwap perm i j) (i + 1) n = Just perm = successor` (i-1) perm lp2:: !Int !Int !*{#Int} -> (Int, *{#Int}) lp2 j ith perm#! (val_j , perm) = perm![j] | (val_j > ith) = (j,perm) = lp2 (j-1) ith perm //これを動かしたい人はいろいろ組合わせて下さい。 // *組*を作成しなければ、無駄なメモリ消費量を抑えられるはず。
177 名前:デフォルトの名無しさん mailto:sage [2005/10/03(月) 21:42:37 ] >>176 *組* ってちょっと… 「タプル」でいいんじゃない?
178 名前:デフォルトの名無しさん mailto:sage [2005/10/03(月) 23:22:07 ] >>177 助言サンクス で一応まとめ fannkuch: indexアクセスと整数演算の性能 1 最適化がはまらないとちょっと遅い(はまればC並に最適化できる) 1.1 遅いのは、Clean内部システム?が Lazyでごちゃごちゃ動くため 1.2 関数化無しではLOOPが書ず、inline化されない?ため、いろいろ無駄になる 2 LIST使っても、revAtみたいな展開と内包表現を多用すれば、 3〜5倍の実行時間で済むっぽい。コンパイラの頭が良くなって、 今回の +++が 破壊的な関数で最適化されれば、もっと速いはず (set-cdr!で一発) 3 短くはないが、比較的綺麗な関数単位で書いた割に速い funnkuch の countFlips, successorPermutaion , maxを外に出せば uarrayAccumulateWithSuccessor. lp2は (uarrayFindIndexBy (\x->x>ith)) 4 ライブラリはかなり少ない 速くするには A shootout のOCAMLやD言語ではアルゴリズムがこれと少し違うっぽいので真似る B Cleanの最適化について学ぶ C 関数一つにまとめて、共有できる変数は共有するとか。 D abc codeを書くとか //省略部 arraySwap ar i j#! (v_i,ar) = replace ar i 0 #! (v_j,ar) = replace ar j v_i ={ar & [i]=v_j} 今後は目標として、LISP(Scheme)をCleanに翻訳とかやるかも。では、さよーなら。
179 名前:デフォルトの名無しさん mailto:sage [2005/10/09(日) 03:44:31 ] 有用な関数を置いときます。関数名が怪しげですが。 trimNewline::!String -> String trimNewline "" = "" trimNewline str| str. [n-1] == '\n' | str.[n-2] == '\r' = str % (0, n - 3) = str % (0, n - 2) = str where n = size str CallWithInputFile:: !String !(*fs -> (a,*fs)) !(*File -> (a, *File)) !*fs -> (a, *fs) | FileSystem fs CallWithInputFile filename error proc files #! (ok, f, files) = fopen filename FReadData files | ok #! (value, f) = proc f #! (_,files) = fclose f files = (value, files) = error files foldWithReadline:: !(String a-> a) a !*File -> (a, *File) foldWithReadline proc knil file #! (end,file) = fend file | end = (knil, file) #! (line, file) = freadline file = foldWithReadline proc (proc (trimNewline line) knil) file
180 名前:デフォルトの名無しさん [2005/10/09(日) 08:26:13 ] 先生!質問です。 この言語には整数は32bitしかないのでしょうか?64bitは無し?
181 名前:デフォルトの名無しさん mailto:sage [2005/10/09(日) 09:29:44 ] せっかくnon-strict関数型言語の標準をhaskellとして定めたのに、方言を作りやがって…… これじゃMLと同じ轍を踏むことになるじゃないか とSPJが言ってました。
182 名前:勉強中の人 mailto:sage [2005/10/09(日) 14:37:00 ] >>180 windows版で BigInt、Rational, Complexのライブラリはあるようです。 >>181 バートランド・ラッセルが 「宗教の数は時代の遷移に共なって、指数関数的(対数だったっけ?)に変化する」 とか言ったのに似て、プログラミング言語も人間の頭の中からできたものだから、 ある程度分裂する感じがする。(指数関数的 1- e^(-n*x)) 最適化問題として捉えても、研究者じゃない人間が遊んだり、 一部の研究者が触っても問題ないどころか良い事だと思うし。 Privateで工学・政治的な理由に付き合う理由はあまりないと思う。 モナドで包まれない状態が生で触れるためCleanはhaskellの勉強になる。 ただ、generic も モナド もよくわかってないが、 モナドの方が良くできてる感じがする。 他にも hasktags はあるけど、 cleantags はないとかかなり不便。 ちなみに、SPJとか知らんですよ。
183 名前:180 mailto:sage [2005/10/10(月) 05:33:09 ] >>182 ありがとうございます。 日本語使えるよう頑張ってるヒトいるみたいだし勉強してみようかなぁ... > ちなみに、SPJとか知らんですよ。 Simon Peyton-Jonesさんではないかと。Glasgow Haskellの中のヒトかと。
184 名前:デフォルトの名無しさん mailto:sage [2005/10/10(月) 09:43:14 ] >>183 茨の道ですよ。多分。 //CallWithInputFile 使い方 (22行) strStr:: !String !String !Int -> (String, Int) strStr str1 str2 p=lp p 0 where n = size str1 m = size str2 lp i j| j == m = (str1 %(p,i-m-1) , i-m) | i == n = (str1 %(p,i-1) , i) | str1.[i] == str2.[j] = lp (i+1) (j+1) = lp (i+1) j stringSplit s c :== reverse (stringSplitAcc s c 0 []) stringSplitAcc:: !String !String !Int ![String] -> [String] stringSplitAcc str del i ret | p==(size str) =[match:ret] = stringSplitAcc str del (p+1) [match:ret] where (match,p) = strStr str del i readCsv line knil :== [stringSplit line ",": knil] csvReader:: !*File -> ([[String]] , *File) csvReader file# (s,file) = foldWithReadline readCsv [] file = (reverse s, file) errorFunc:: String *fs -> ([[String]], *fs) | FileSystem fs errorFunc mes files= abort mes Start:: *World -> ([[String]],*World) Start world =CallWithInputFile "test.txt" (errorFunc "error") csvReader world
185 名前:デフォルトの名無しさん mailto:sage [2005/10/10(月) 12:47:07 ] 行数制限が気になって、雑になりました。 >>183 SPJ氏について サンクス、自分専門ではないもので助かります。 downcase :: !String -> String downcase str = {toLower x\\x<-:str} upcase :: !String->String upcase str = {toUpper x\\x <-:str} stringJoin:: ![String] !String -> String stringJoin [x:xs] c = x +++ (join` xs) where join`:: [String] -> String join` [] = "" join` [x:xs] = c +++ x +++ join` xs stringJoin [] _ = "" ライブラリはよく吟味した上で一元管理がよさそう
186 名前:デフォルトの名無しさん mailto:sage [2005/10/11(火) 00:30:37 ] Linux版でfopenしてもファイルが生成されない。恐いw readはできたが。
187 名前:勉強中の人 mailto:sage [2005/10/13(木) 22:54:27 ] ファイルIOその場凌ぎ。 // system_clean.c ヘッダー省略(Linux System系) gcc -O3 -c system_clean.c #define CLStr2C(str,name,len) int len=CleanStringLength(str);char name[len+1];\ strcpy(name,CleanStringCharacters(str));name[len]='\0'; int Time () {return (int)time(NULL);} //おまけ int openWriteClose(CleanString cpath, CleanString cstr) { CLStr2C(cpath,path,len); int fd = open(path,O_WRONLY|O_APPEND|O_CREAT, S_IRWXU | S_IRGRP | S_IROTH); if (!fd) {printf("test");return errno;} write(fd, (void*)CleanStringCharacters(cstr), CleanStringLength(cstr)); close(fd);return 0; } // system_clean.h // htoclean は シンボリックリンクを認識しない様子 Clean (::*State :== Int;) int Time (); int openWriteClose(CleanString Path, CleanString cstr); Clean(Time:: *State -> (Int,*State);openWriteClose:: String String-> Int;) // test.icl //ヘッダー省略 clm -l system_clean.o Start :: *World -> (Int,(Int,Int)) Start w = (openWriteClose "test.out" "test", (Time 1)) // open "a+" 755 自分がCleanをやるのは、計算機にパズルを解かせるための道具として よさそうだと思ったからです。(速い、成功リスト法等) 何でもあり風な tabooSearch とかにも向いてると思う。(配列以外は)
188 名前:デフォルトの名無しさん mailto:sage [2005/10/25(火) 23:17:03 ] // haskellの真似 とか調べたことでも書いてみる foldrWithReadline:: !(String a-> a) a !*File -> (a, *File) foldrWithReadline proc knil file #! (end,file) = fend file | end = (knil, file) #! (line, file) = freadline file # (lines , file) = foldrWithReadline proc knil file = ((proc (trimNewline line) lines), file) foldrWithReader:: !(*File->(Bool,a,*File)) !(a b->b) b !*File -> (b, *File) foldrWithReader reader proc knil file #! (ok, token, file) = reader file | not ok = (knil, file) # (tokens , file) = foldrWithReader reader proc knil file = ((proc token tokens), file) foldrWithReadChar:: !(Char a-> a) !a !*File -> (a, *File) foldrWithReadChar x y z = foldrWithReader freadc x y z readFile :: !String *World -> ([String],*World) readFile path wld = callWithInputFile path (\x -> abort ("readFile :: " +++ path )) (foldrWithReadline (\x y -> [x:y]) []) wld readFileChar :: !String *World -> ([Char],*World) readFileChar path wld = callWithInputFile path (\x -> abort ("readFileChar :: " +++ path)) (foldrWithReadChar (\x y -> [x:y]) []) wld
189 名前:デフォルトの名無しさん mailto:sage [2005/10/25(火) 23:46:25 ] // モナディック・スタイル cより悪いってことはない。ここで五分でも他で返せる。 Start = /*runState {a=1,b=2}*/ // struct state= {a=1,b=2}; (fa >>>= \r // r = fa(state); -> fa >>>= \r2 // r2= fa(state); -> return (r+r2)) // return r+r2; {a=1,b=2} // 何倍も遅いが簡潔に書けるかもしれない stCond :: ![( a->(Bool,a), a->a )] !a -> a stCond [] st = st stCond [(pred,f):xs] st # (p, st`) = pred st | p = f st` = stCond xs st` //ちょっと便利そうなコード (++%) infix 4 :: String Int -> String (++%) st i = st +++ (toString i) 学んだこと:もし、HaskellやCleanの開発で困ったら、 それはきっと、創造力と設計能力と人手が足りないからだ。 (実行速度は遅くなっても創造力でカバーする) 創造力を減らさないためには、純粋関数型的なコーディングは欠かせない。 自分にはそんな能力はないけどw
190 名前:デフォルトの名無しさん mailto:sage [2005/10/26(水) 00:50:31 ] 追伸: >>>= の演算子 StateMonad はどこかに落ちてるから、find 等を駆使して探したり、 ファイルを一箇所にまとめ grep [sS]tate *.icl とかやって探して下さい。 haskellのように m1 >>>= True -> m2 >>>= \r -> return r とかはできない。 ・Hacle (Haskell -> Clean トランスレータ) 生成されるCleanコードは想像以上に汚ないので、あまり使いたくない。 Haskellで書いたコードが運良ければ速くなるという代物。 ・elisp ;; interactive を defun。srfi cutみたいにしたいけど面倒なので略 (cutは作ったし) (defmacro defuni-by-cut (name func &rest args) `(defun ,name () (interactive) (,func ,@args))) ;; w3mが遅いのでローカルへ置きました。 wget を使いました。 ;; どこかの池田さんの有名なページ (defuni-by-cut clean-doc w3m-find-file "/home/clean/doc/zaa54437/home.htm") (defuni-by-cut clean-lang w3m-find-file "/home/clean/doc/zaa54437/programming/clean/LanguageReport21/index.html") (defuni-by-cut clean-obj w3m-find-file "/home/clean/doc/zaa54437/programming/clean/ObjectIOLibrary12/index.html") (defuni-by-cut clean-book w3m-find-file "/home/clean/doc/zaa54437/programming/clean/CleanBook/index.html") ;; 同様に リファレンスは Haskell のやつ使って 関数が無ければ自分で作るとか。 ;; gauche のマニュアルも使えるかもしれない。
191 名前:デフォルトの名無しさん mailto:sage [2005/10/29(土) 23:11:18 ] Cleanやる人増えないかな。と考えつつ書いてみる。 // 行列線形代数(一意なし) ちょっと遅い 小さい行列やループが入れば // octave interpleter よりマシ, Lisp, Haskellより多分マシ // Blasのwrapperは Linuxでは ccall で配列が渡せなく?失敗 、windowsは面倒で断念 My_degmm_simple :: !Int !Int !Int !{#Real} !{#Real} -> {#Real} My_degmm_simple an am bm a b = {inprod (i + dam*an) (am * j + dam) 0.0 \\ j <- [0..dan] , i <- [0..dam]} where dan = an - 1 //dec an dam = am - 1 inprod:: !Int !Int !Real -> Real inprod dam1 amq acc | dam1 >= 0 =inprod (dam1 - am) (amq - 1) (acc + a.[dam1] * b.[amq]) = acc // --------------------mat ------------------- ::MyMatrix e = !{mat :: !({#} e), row:: !Int, col:: !Int} ::MyRMatrix :== MyMatrix Real makeMatrix :: !Int !Int !{#Real} -> MyRMatrix makeMatrix i j mat = {mat=mat,row=i,col=j} instance + MyRMatrix where (+) :: !MyRMatrix !MyRMatrix -> MyRMatrix (+) a=:{mat,row,col} b = {mat={x+y \\ x <-:mat& y<-:b.mat}, row=row,col=col}
192 名前:デフォルトの名無しさん mailto:sage [2005/10/29(土) 23:13:54 ] instance * MyRMatrix where (*) :: !MyRMatrix !MyRMatrix -> MyRMatrix (*) a b = {mat=My_degmm_simple a.row a.col b.col a.mat b.mat, row = a.row, col =b.col} // transpose class transpose a :: !a !Int !Int -> a instance transpose {#Real} where transpose mat row col = {mat.[i + row*j] \\ i<-[0..col-1], j<-[0..row-1]} class ` a :: !a -> a instance ` MyRMatrix where ` a = {mat=transpose a.mat a.row a.col, row=a.col, col=a.row} class (+@) infixl 6 a e:: (a e) e -> (a e) class (@+) infixl 6 a e:: e (a e) -> (a e) // ... その他略 matrix は RowMajor
193 名前:デフォルトの名無しさん mailto:sage [2005/10/30(日) 19:22:17 ] 本当に最後に。 実用ならocamlのほうがよさそうだ。 本格派なら言語そのものの研究といった所かな? ocamlは見た目が美しく感じないので好きじゃないんだけど。 素人の感想 Haskell :: スピードが遅く scheme で十分なので魅力を感じない ocaml :: ライブラリが比較的充実?純粋関数型ではない Clean :: マイナーでライブラリ作成が大変
194 名前:デフォルトの名無しさん mailto:sage [2005/10/30(日) 20:18:46 ] //おまけ 誤差逆伝播ニューラルネット。簡潔だが、知らないと結局わからない // コンパイルも通してないし、行間を埋めなければならない代物 // local変数は構造体で作成みたいな感じがいいのかな。 learning :== 1.0 forwardPropagation i weights local | i <= size weights = forwardPropagation (i + 1) weights (copy local i (sigmoid local.[i] * weights.[i-1])) = copy local i (sigmoid local.[i] * weights.[i-1]) backPropagation weights local pre i #! weights = updateVector weights i (weights.[i] +learning@*(`local.[i])*pre) | 0 == i = weights = backPropagation weights local ( (1.0 @- local.[i]) .* local.[i] .* (pre * weights.[i])) teach weights input teach n :== teach` weights teach` weights _ 0 = weights teach` weights i #! local = forwardPropagation weights (makeLocal input) =teach (backPropagation weights local (bp1 local.[size weights]) (n-1)) (n -1) where bp1 last = (teach - last) .* last .* (1.0 @- last)
195 名前:デフォルトの名無しさん mailto:sage [2005/11/03(木) 21:12:26 ] 一意性誤解してた。便利になると思ったが不都合発見。 module test import StdEnv ::TestData = {a::!Int, b::!Int} test1:: TestData -> *TestData test1 xx=:{a,b} #!xx2 = {xx & a=a+1} // = {xx & b=a+b+1} // xx , xx2の違い、コンパイルが通る。aの値もわかりにくい = {xx2& b=a+b+1} test2 :: *TestData -> *TestData test2 xx=:{a,b} = {a=100+a,b=100+b} test3:: {#Real} test3 = {1.0,2.0} Start #! (xx, yy) = (test1 cc, test1 cc) #! xx = test2 xx = (test1 xx, yy , test1 yy, test3.[1]) where cc = {a=1,b=2}
196 名前:デフォルトの名無しさん mailto:sage [2005/11/05(土) 08:15:35 ] 一度書いてしまうと、急にはやめられないのでした。 Clean のゲームライブラリとかも結構強力ですね。 ゲームというより、ゲーム的な操作性・表現力を持つ物と考えれば幅は広がります。 Charlie が二週間でできたとのことです。 パフォーマンスが問題なければ実用にも。 …自分だけが書いていることには問題がありますが。
197 名前:デフォルトの名無しさん mailto:sage [2005/11/16(水) 00:17:45 ] 最近ようやくgenericがわかりました。 haskellにも Generic Haskell なんてのがあるんだな。
198 名前:デフォルトの名無しさん mailto:sage [2005/11/27(日) 20:34:15 ] Cleanについて加筆 ・産業指向であるため、活発な開発が行なわれない。(投資額が少ない場合) ・GUI や TCP などの関数型の苦手な部分こそ自前で持つという 新しい物を産みだすための良い哲学を持っている。 取り敢えず動く(CleanIDE や sample プログラムが動いている)。 ・実行速度は安定しない (OS・ほんのちょっとのコードの変化で変わる) が2倍速いマシンを買えば他より速くなるので問題ない ・前も書いたけどライブラリはほとんど無い。というか 有用なライブラリが美しく書けないのかもしれない。 Haskellでは Tree 等の複合的な型クラス に対する型クラスが書けるがCleanでは書けない。 class x1 a :: a -> a class x2 a b :: (a b) -> (a b) が別クラスになる。 または instance x1 Class1ElementXYZ のようにインスタンスの数だけinstanceが必要だ。 ・タイムプロファイラーとか簡単に使えて便利だ。 >>195 のコードについて 意味的には TestDataはコピーされ * TestDataになるっぽい。(ただしメモリ上ではコピーではない) これと似たようなことを配列でやっても失敗する。(コーピーされる場面もあるようだ) 言語的には OCaml よりは Clean の方がいいと思うんだが。
199 名前:デフォルトの名無しさん [2005/11/28(月) 00:54:27 ] 書き忘れ、 一意配列について lp :: *x a -> *(a , *x) | dup, f, end x // dup 架空の 複製関数 lp x y # (x , x2) = dup x # end x2 = (y , x) # lp x (f x2 y) dup で 複製した領域は再利用されなかった。されれば実装上fが一つに決まり楽になる。 //連想配列書いてみる。lookupはdynamic使ったりMaybeを使わないから実装多い assoc e [] = Nothing assoc e [x=:(a,b):xs] | a == e = Just x = assoc e xs (%|%) infixl 9 :: (Maybe a) a -> a (%|%) Nothing y = y (%|%) (Just x) _ = x assocx x alist :== (@) infix 9 :: [(!String,!a)] !String ->a (@) alist x = snd (assoc x alist %|% (abort ("assoc not match " +++ x))) (:-) infixl 9 :: a b -> (a,b) (:-) a b = (a,b) al1 = ["test":-"test2","test2":-"test3","test3":-"test4"] al2 = ["key1" :- ("key2", al1),"key3" :- ("key4", al1)] Start#(str2, alist) = al2@"key1" = str2 +++ alist@"test"
200 名前:デフォルトの名無しさん mailto:sage [2005/11/30(水) 20:36:55 ] 200000000000000
201 名前:デフォルトの名無しさん mailto:sage [2005/12/01(木) 23:16:38 ] >>199 訂正 // 連想配列 ではなく 連想リスト (@) infixl 9 :: [(!String,!a)] !String ->a // infixlでないと ["key1":-["key2":-"val1"]]@"key1"@"key2" ができない x@"test"@"test2" って見ても何が何だかわからないけど。 :: X2 = {test2::String} :: X = {test::{#X2}} x = {test={test2="val1"}} Start = x.test.test2 // test , test2 は symbol nameとして出力できない // また、リストは無限を含むこともできる >>200 200000000000000 と言わず一言どうぞ
202 名前:デフォルトの名無しさん [2005/12/01(木) 23:42:59 ] Ocamlを調べてみるとgenericなしで 型クラスもない。 普通のオブジェクト指向はあるみたい。 ………使いたくなくなった。
203 名前:デフォルトの名無しさん mailto:sage [2005/12/02(金) 05:45:07 ] Cleanをあまりよく知らないので関数型言語一般の話寄りになってしまいますが、 COMだとかActiveXだとかの外部のコンテナを扱いたい際は データの副作用は純粋関数型言語ではどういった扱いになるんでしょうか?
204 名前:デフォルトの名無しさん mailto:sage [2005/12/02(金) 21:20:09 ] >>203 ここは参考になるかな? www.haskell.org/hdirect/
205 名前:デフォルトの名無しさん mailto:sage [2005/12/02(金) 23:16:49 ] cleanではwrapper関数とか作ったり、一意ポインタを使ったりする。htoclean周辺参考 あまり実用ではない。
206 名前:デフォルトの名無しさん mailto:sage [2005/12/09(金) 01:18:06 ] 一部語弊あり >>198 > Haskellでは Tree 等の複合的な型クラス に対する型クラスが書けるがCleanでは書けない。 > class x1 a :: a -> a > class x2 a b :: (a b) -> (a b) > が別クラスになる。 > または instance x1 Class1ElementXYZ のようにインスタンスの数だけinstanceが必要だ。 arrayCopyRange:: !*(a e) !*(a e) !Int !Int -> *(!*(a e) , !*(a e)) | Array a e arrayCopyRange x=:{[i]=xi} y i j | i > j = (x,y) = arrayCopyRange x {y&[i]=xi} (i+1) j ちょっと面倒だが一応?書ける 一意性伝播がよくわからない。(エラーメッセージが…) ** 面白そうなファイル ** StdOverloadedList special なんてのがある
207 名前:デフォルトの名無しさん mailto:sage [2005/12/15(木) 03:29:16 ] 遊び。 Haskell で書くとどうなるでしょうか? //省略 readFile :: !String *World -> *([String],*World) (<&|>) infixr 6 (<&|>) p1 p2 :== \x w= (\(y,ww)=(p2 y,ww)) (p1 x w) a2l a = [e \\ e <-: a] // uMap 既にありそう uMap :: (a *w-> *(b, *w)) [a] *w -> *([b], *w) uMap f [] w = ( [],w) uMap f [x:xs] w # (v , w) = f x w # (vs , w) = uMap f xs w = ([v:vs], w) Start :: *World -> [[String]] Start w =fst (uMap (readFile <&|> (map downcase)) (tl (a2l getCommandLine)) w)
208 名前:デフォルトの名無しさん mailto:sage [2005/12/15(木) 03:31:03 ] 抜け落ち部分 downcase :: !String -> String downcase str = {toLower x\\x<-:str}
209 名前:デフォルトの名無しさん mailto:sage [2005/12/15(木) 09:35:19 ] >207 Cleanはよく知らない俺がHaskellで書いてみましたよ。 import System.Environment main = getArgs >>= mapM_ (putStr . map downcase . readFile)
210 名前:デフォルトの名無しさん mailto:sage [2005/12/15(木) 09:38:57 ] あ、しまった。 Haskell にも別に downcase はなかった。 import Data.Char した上で map toLower だった。
211 名前:デフォルトの名無しさん mailto:sage [2005/12/15(木) 09:42:13 ] あー mapM_ の引数もおかしいし。 (\ fname -> readFile fname >>= putStr . map toLower) ですかね
212 名前:デフォルトの名無しさん mailto:sage [2005/12/15(木) 20:45:16 ] LISPスレにIO関係の簡単なプログラムの例みたいなのがあったので ちょっと変形してでもいいから Cleanで書いてみたんですが…適当過ぎました。 目標は以下の通り (Haskellはあまり良くはわかってません) ・モナドの持ち上げ(ここがわかってない)が必要そうな場所でも コンビネータで繋げられる ・ m >>= (\ v -> f v) のようにλを明示的に書かない(無駄を省く & LISPより簡潔に) 僕が書いた >>188 readFile と HaskellのreadFileは違うのでご注意。 >>209-211 ありがとうございます。 compileすらできなかったので助かりマックス。 Haskellなら超簡単に書けますね。 import Data.Char import System.Environment main = getArgs >>= mapM_ (\ fname -> readFile fname >>= putStr . map toLower) infixr 6 >>>= (>>>=) p1 p2 = \x -> p1 x >>= p2 --main = getArgs >>= mapM_ (readFile >>>= putStr . map toLower)
213 名前:デフォルトの名無しさん mailto:sage [2005/12/17(土) 01:05:21 ] 個人的な意見だけど、確かに陽に無名関数を使わない方が簡潔になる場合も多 いが、しかし、あるものを使わないのは馬鹿げていると思う。 ところでこの mapM_ の引数だと、 ((>>= putStr . map toLower) . readFile) と書ける。 その方が綺麗だと思うかどうかは人によると思うが、個人的にはどちらにせよ 新しい演算子を作るほどではない気がする。
214 名前:デフォルトの名無しさん mailto:sage [2005/12/17(土) 16:28:11 ] >>213 確かにそうですね。 中間演算子が便利そうだったので何も考えずに使った感はあります。 1. 手続き的にプログラムをしたい場合には素直にdoを使う。 (無駄が多いように見える) 2. 関数型で無駄を省きたいなら >>213 のように書く 3. 1で無駄を省くなら (a 匿名関数を用いる) か (b 新しい演算子を用いる)。 自分一人なら3.bで書くのも悪いかもしれませんが、そうでなければ2又は3.a番が妥当かもしれません。 また、2で書けるのに3.bで書くとコンパイルに通すのが目的になって無駄が生じる可能性があるとも思いました。 あと、こんなのを見つけました ttp://pub.cozmixng.org/~the-rwiki/rw-cgi.rb?cmd=view;name=%3E%3E%3D+%A4%C7%B7%D2%A4%B4%A4%A6%A5%D1%A5%A4%A5%D7%A5%E9%A5%A4%A5%F3
215 名前:デフォルトの名無しさん mailto:sage [2005/12/18(日) 15:50:07 ] もしかして、最近Cleanユーザ増えてますか? そうであれば、僕の独り言状態になってるのでそろそろ終了しようかと思います。 N体問題 ttp://shootout.alioth.debian.org/benchmark.php?test=nbody&lang=clean&id=0 (特徴 :: 一意構造体の一意配列がある。*{*Planet}) 改良したら 188行 が 100行位? // 実質部分40行位 (型・データ宣言・ライブラリ化されてもよさそうな関数等を除く) になりました。実行速度重視版(+3行程度)で Cの2倍時間が書かる程度 (1.5倍改善 windowsで実装中)。 この *{*Planet}の *Planet部分を更新するため dummy::{*Planet} を常に持ち運ぶ必要があります。 結果としてかなり綺麗に書けましたが大変でした。 実際にコード書かないと、わからないことは多いと思いました。 便利そうな関数 stdioBy f w :== exec w where exec w#!(io, w)= stdio w #! (_, w)= fclose (f io) w =w //例 Start world #! (e,bodies) = energy N $ momentum ini_bodies #! (e2,bodies) = energy N $ advance (toInt arg1) N 0.01 dummy dummy bodies = stdioBy (\io-> io <<< toStringWith 9 e <<< "\n" <<< toStringWith 9 e2 <<< "\n") world where N = size ini_bodies Haskell.icl dcl というのを 作ってます 一例 ($) infixr 1 ($) a b :== a b
216 名前:デフォルトの名無しさん mailto:sage [2005/12/31(土) 00:19:12 ] 同じような関数を書かないでいいようにライブラリを公開してみました。 home1.tigers-net.com/~th003751/
217 名前:デフォルトの名無しさん [2006/01/03(火) 21:07:29 ] 今年一番伸びる言語
218 名前:デフォルトの名無しさん mailto:sage [2006/01/15(日) 01:13:42 ] 本家が過疎化してるように見えるが・・・
219 名前:デフォルトの名無しさん mailto:sage [2006/01/15(日) 12:32:23 ] 自分は学問としては触ってないのだけど、 論文の発表すら過疎ってるの?
220 名前:デフォルトの名無しさん [2006/01/15(日) 13:05:57 ] CleanってIDE内でないとコンパイルができない? VBみたいでイヤンなんだけど・・・。
221 名前:デフォルトの名無しさん [2006/01/15(日) 20:06:28 ] Concurrent Cleanの「Concurrent」って、並列のConcurrent? コードに自分でスレッド関連の事をなんも書かないで、 普通に書くだけで、マルチCPUやマルチコアをフル活用して並列処理してくれるの?
222 名前:デフォルトの名無しさん mailto:sage [2006/01/15(日) 21:55:30 ] 俺も前から気になってたが、本家の方はConcurrent抜きのただのCleanしかないような。
223 名前:デフォルトの名無しさん mailto:sage [2006/01/15(日) 22:01:20 ] >>221-222 これか? ttp://mailman.science.ru.nl/pipermail/clean-list/2003/002485.html
224 名前:デフォルトの名無しさん mailto:sage [2006/01/15(日) 22:07:44 ] あまり古傷をえぐらないように
225 名前:221 mailto:sage [2006/01/16(月) 00:42:19 ] >>223 d。 > we dropped the feature due to lack off parallel machines. なんとショボイ理由w(つうか言い訳?)。 1990年代後半なら個人でもデュアルCPUマシン位所有できただろ。 つうか俺実際"Dualon"使ってたし。って違うのか? あと、プロセス単位だったような説明だが、 言語が本質的に並列性を備えてるならスレッドで良いじゃん。 マルチコア時代に向けて復活させろよ。
226 名前:デフォルトの名無しさん mailto:sage [2006/01/17(火) 00:54:01 ] >>220 linuxならclmでCUIコンパイルができるよ。 windows だと, CleanIDE.exe --batch-build <FULL path to project> なんてできるらしいけど、成功しなかった。
227 名前:226 mailto:sage [2006/01/17(火) 00:58:36 ] full pathでやったら成功したorz >>220 サンクス
228 名前:デフォルトの名無しさん mailto:sage [2006/03/08(水) 22:40:20 ] Clean のページが変わってますね。 といっても、変更先もアクセス不能ですが。 The Clean Homepage has been moved to: www.cs.kun.nl/~clean/ Please update your bookmarks accordingly.
229 名前:デフォルトの名無しさん mailto:sage [2006/04/15(土) 14:21:38 ] ちょっと興味を持ったので触ってみようと思ったんだけど、 今はどこからダウンロードできるの?
230 名前:デフォルトの名無しさん mailto:sage [2006/04/17(月) 06:06:02 ] dekiruyo
231 名前:デフォルトの名無しさん mailto:sage [2006/04/22(土) 21:40:48 ] CleanってHaskellよりもよさそうなのに人気ないね 欠点でもあるん?
232 名前:231 mailto:sage [2006/04/24(月) 03:37:56 ] Cleanを勉強中。 分かりやすい日本語のチュートリアルがあるのがいいね。 Haskellはわけ分からん。 Cleanを気に入った人間はここにもいるぞってことで、足跡を残しておく。 しかし、他スレでHaskellの欠点をCleanなら解決できるって書き込みがあるが、 見事にスルーされてるね。 Cleanを気に入った人間としては悲しい限りだ。
233 名前:デフォルトの名無しさん mailto:sage [2006/04/24(月) 14:12:26 ] > 分かりやすい日本語のチュートリアル どこすか?
234 名前:デフォルトの名無しさん mailto:sage [2006/04/24(月) 14:28:26 ] www.geocities.jp/lethevert/softwares/clean/ のことかな? sky.zero.ad.jp のやつはわかりづらいと思うが……
235 名前:デフォルトの名無しさん mailto:sage [2006/04/24(月) 17:51:20 ] >>234 おおそこか thanx
236 名前:デフォルトの名無しさん mailto:sage [2006/04/28(金) 21:08:19 ] >>232 haskellの欠点を回避といっても 表面的なもの・・・ というか、環境変数を変更できないだけ。 また、cから配列で情報を得ようとする場合は、副作用を生じるし、 それによってうまくいかない場合があるかもしれない。 配列が使えないっていうのは文字列も副作用なしでは使えないってこと。 class とかも 型ClassのList を 引数?に取れないで (List a)にしなきゃいけない とかいろいろ欠点はあると思う。
237 名前:デフォルトの名無しさん [2006/05/04(木) 16:20:52 ] C
238 名前:デフォルトの名無しさん [2006/05/21(日) 16:27:05 ] L
239 名前:デフォルトの名無しさん mailto:sage [2006/05/21(日) 18:18:32 ] Haskellの本でてるね。Cleanもでないかなあ
240 名前:デフォルトの名無しさん mailto:sage [2006/05/21(日) 21:16:40 ] 誰かが書かなきゃ出ないわな
241 名前:デフォルトの名無しさん mailto:sage [2006/06/21(水) 16:39:57 ] スタックオーバーフローになるのですがどこが悪いのでしょうか? Haskellだと、うまく行ったんですが…。 Start = chg [10,5,1] 2 chg::[Int] Int->Int chg _ 0 = 1 chg [] _ = 0 chg denoms amount | tl denoms == [] = chg denoms (amount- hd denoms) | otherwise = (chg (tl denoms) amount) + (chg denoms (amount - hd denoms))
242 名前:デフォルトの名無しさん [2006/06/21(水) 16:52:28 ] age
243 名前:デフォルトの名無しさん mailto:sage [2006/06/21(水) 17:58:35 ] Haskell でも止まらないと思うし、 amount が負値になったら止まらなくなると思うんだけど。
244 名前:241 mailto:sage [2006/06/21(水) 23:31:10 ] >>243 ありがとうございます。 おおボケかましてました orz ↓で動きました。 chg::[Int] Int->Int chg _ 0 = 1 chg [] _ = 0 chg denoms amount | amount < hd denoms = chg (tl denoms) amount | otherwise = chg (tl denoms) amount + chg denoms (amount- hd denoms)
245 名前:デフォルトの名無しさん [2006/10/09(月) 08:44:38 ] ohayo karaage
246 名前:デフォルトの名無しさん mailto:sage [2006/12/04(月) 23:17:51 ] hosyu
247 名前:デフォルトの名無しさん mailto:sage [2006/12/20(水) 05:05:32 ] 2.2 出た
248 名前:デフォルトの名無しさん mailto:sage [2006/12/20(水) 20:10:15 ] 午前5時5分ですか。。。
249 名前:デフォルトの名無しさん [2007/01/27(土) 22:06:10 ] よくわからんのだが、これって分散計算とかサポートしてるの?
250 名前:デフォルトの名無しさん mailto:sage [2007/01/27(土) 22:21:38 ] Intel Mac には対応してないの?
251 名前:デフォルトの名無しさん mailto:sage [2007/03/06(火) 00:15:44 ] 中野豚子 フジテレビ 中野美奈子 噛み過ぎ ブタ ブス
252 名前:デフォルトの名無しさん [2007/03/26(月) 20:43:42 ] あげ
253 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 17:29:51 ] hosh
254 名前:デフォルトの名無しさん mailto:sage [2007/05/17(木) 21:39:26 ] FreeBSDのcompat/linuxな環境で動かせますか?
255 名前:デフォルトの名無しさん [2007/05/17(木) 21:40:06 ] あげてみるdesu
256 名前:デフォルトの名無しさん [2007/05/17(木) 22:19:30 ] この言語もう終わりだろ・・普通に考えて。 更新なんかもう2年もされてないし。
257 名前:デフォルトの名無しさん [2007/05/17(木) 22:22:25 ] Cleanの成果はすべてHaskellに取り込まれてるから、これからCleanさわろうとする人はHaskellをやった方が将来性あると思うよ。 っていうか、Haskellは研究用としてすでにデフォルトだから新しい研究成果はほとんどHaskellに組み込まれるよ。
258 名前:デフォルトの名無しさん mailto:sage [2007/05/17(木) 23:23:31 ] >>257 >Cleanの成果はすべてHaskellに取り込まれてるから、 Haskell はマクロも無いし、変数に代入出来ないでしょ。 しかも将来性だって嵩が知れてるがな。 Haskell は嫌いじゃないけど、Haskell 信者は嫌いだ。
259 名前:デフォルトの名無しさん [2007/05/17(木) 23:29:06 ] >>258 信者じゃねーよ 俺もHaskellは使いにくいと思ってるが、それはおいといて・・ 変数はあるよ。IORefモナドとか。 でも、こういうものはなるべくなくすべきだというのが一般的な見解。 マクロは成果でも何でもないと思う。
260 名前:デフォルトの名無しさん [2007/05/17(木) 23:30:00 ] あと、「将来性」というのは関数型言語陣営の将来性という意味で。
261 名前:デフォルトの名無しさん mailto:sage [2007/05/17(木) 23:36:41 ] 流行物に付いて行こうとするなら最初から Clean なんて興味持たないと思うけどね。
262 名前:デフォルトの名無しさん mailto:sage [2007/05/18(金) 01:18:47 ] 将来性で関数型選ぶ自体がミーハーだからな
263 名前:デフォルトの名無しさん mailto:sage [2007/05/18(金) 01:20:21 ] >>261 むしろ、流行好きだから、一時期Cleanに興味持つのでは? お、今度はこんな言語でてきたかーって。 で、流行がすぎさった、と。
264 名前:デフォルトの名無しさん mailto:sage [2007/05/18(金) 06:06:58 ] IORef モナドって、一旦複製を作って、 一定の領域内でその複製を値を変えることができる、 という認識でいいのかな? 純粋な変数とは言いがたいようなそうでないような。
265 名前:デフォルトの名無しさん mailto:sage [2007/05/18(金) 19:25:19 ] > この言語もう終わりだろ・・普通に考えて。 > 更新なんかもう2年もされてないし。 そうなの? モナドつかわなくて良くて 速いっていう夢の言語かと思ったのに
266 名前:デフォルトの名無しさん mailto:sage [2007/06/15(金) 18:11:33 ] 2年前に完成したんだよ!
267 名前:265 [2007/06/21(木) 20:58:01 ] > 2年前に完成したんだよ! なるほど! djbメソッド
268 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 00:00:18 ] >モナドつかわなくて良くて >速いっていう夢の言語かと思ったのに ocamlでも使え
269 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 00:04:48 ] OCaml は見た目が汚いから嫌
270 名前:デフォルトの名無しさん [2007/06/24(日) 02:45:52 ] どこが汚いんですか あなたのまんこですか
271 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 13:44:23 ] セミコロン多用する所が気持ち悪い
272 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 14:38:48 ] ;; は確かにくどいな。
273 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 14:46:30 ] 確かリストの区切りも ; じゃなかったっけ? 節操が無いよな。
274 名前:デフォルトの名無しさん [2007/06/24(日) 16:15:35 ] >>272 それ別に書かなくても良くなったんだぜ
275 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 16:31:42 ] そうなのか
276 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 16:38:17 ] セミコロン無しで、文の区切りはどうするの?
277 名前:デフォルトの名無しさん mailto:sage [2007/08/15(水) 19:42:22 ] fcloseするのが面倒だから、withFileとか作ろうかと思ったんだけど、できねー Haskellだと簡単に作れるのに やっぱり、一意性よりもモナドの方が優れてるってことだね
278 名前:デフォルトの名無しさん mailto:sage [2007/08/17(金) 03:08:37 ] // cleanでも余裕でこんなコードは書けるがな。 ただし... module x import MyHakell Start w = main w where main = readFile "c:/a.txt" >>= print
279 名前:デフォルトの名無しさん [2007/11/24(土) 10:37:07 ] つい、昨日Cleanを知ったばかりだがこのスレ大分過疎ってるね・・・。
280 名前:デフォルトの名無しさん mailto:sage [2007/11/25(日) 04:07:13 ] Clean 2.2 っていつ出たの?
281 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 00:34:32 ] 掃除などせずに、はすければいいんだよ。