1read 100read
2011年10月1期プログラム純粋関数型言語Concurent Clean
TOP カテ一覧 スレ一覧 削除依頼 ▼
・ 次のスレ
WebObjects 質問スレ Java系スクリプト言語Groovy 【汚物】痛い変数名・関数名【破廉恥】 wide studioについて
純粋関数型言語Concurent Clean
1 :04/02/01 〜 最終レス :11/12/29 純粋関数型言語Cleanに関するスレッドです。 関数型には珍しくIDEと、IO,Gameライブラリが標準でついてきます。 関連リンク 本家 http://www.cs.kun.nl/~clean/ 日本語ドキュメントなど http://sky.zero.ad.jp/~zaa54437/programming/clean/
2 : あっConcurentじゃなくてConcurrentね。 間違えちゃった、許して。
3 : 本気(maji)ですか!?
4 : 関連リンク Sparkle http://www.cs.kun.nl/Sparkle/ (定理証明系) ゲームライブラリ http://cleangl.sourceforge.net/ Gast http://www.cs.kun.nl/~pieter/gentest/gentest.html (自動テストシステム) Clean要望リスト http://www.cs.kun.nl/~clean/wish/main.html Cleanのメーリングリストのアーカイブ(Discussions ) http://www.cs.kun.nl/pipermail/clean-list/ Cleanのメーリングリストのアーカイブ (Announce ) http://www.cs.kun.nl/pipermail/clean-announce/
5 : 関連ありそうなスレ 関数型プログラミング言語Haskell http://pc2.2ch.net/test/read.cgi/tech/1013846140/ 関数型言語Part3 http://pc2.2ch.net/test/read.cgi/tech/1037527388/
6 : 純粋関数型って何?
7 : Haskellとどっちが純粋ですか?
8 : Cleanは型一意性によって副作用の問題を克服しています。 一意性についてはココをみてください。 ttp://sky.zero.ad.jp/~zaa54437/programming/clean/CleanBook/part1/Chap4.html#sc16 なお、Haskellと同じくモナドも使えます。 ドッチが純粋かはわかりません。 たぶん同じぐらいじゃないっすかね?
9 : ユーザーに歩み寄りをかなり強いる言語な気がする。 >>8 '*'を付ける〜とかの純粋さの証明って、あれで説明になってるの? さっぱりわからねえよ
10 : 綴りが間違ってる。
11 : >>9 何を言っているか分からんが、 評価結果が評価順序から独立していれば、 一応は参照透明だということになってるよ。 副作用がないってのが厳密な純粋性だけどね。
12 : ここでは「純粋」ならば「strictでない」のだそうだ
13 : 色々コード見てみないとよくわからないね。 例えばCSV形式のファイルがあるとして、第n列のデータを抜き出して 行ごとに出力する、みたいなコードはCleanで書くとどうなるの? (空データは空行として出力、引用符の認識は不要) インタフェースはこんな感じで。 csvref <n> <file> //n列目を出力する 入力データ(test.csv) aaa,bbb,ccc ,eee,fff ggg.hhh.iii csvref 1 test.csv の結果 aaa ggg csvref 2 test.csv の結果 bbb eee hhh
14 : >>12 該当箇所が分からんが。
15 : Windows版に興味がでたのですが、 cleanって日本語も扱えるのでしょうか?
16 : >>13 その場合は他の関数型言語と変わらんな。
17 : >>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 : indent崩れた… # Cleanスレだから張り直さないほうがいいかな。
19 : >>15 使ってみれば分かる。
20 : >>15 使えません
21 : ユニコードに対応したライブラリはない。 従って、表示はともかく、操作はできない。
22 : 最近は徐々に相手の神経を逆撫でする発言スタイルを モデレートタイプに修正中です。是非早くHaskellスレPart3 を立ち上げて下さい。それとも、このCleanスレと 目出度く合体!でも当方としては、全然問題ありません。 HakellとCleanは兄弟のようなもんですから(^^; ttp://homepage3.nifty.com/Aransk/
23 : >>17 ファイルの読込であれば、 こんな関数を作ればよい。 ↓ Read :: File -> [Char] // ファイルから読み込んで文字リストを作る Read f # (b,ch,filerest) = sfreadc f | not b = [] | otherwise = [ch : Read filerest] 要するにFile型の引数を操作すればいいだけ。 その前にsfopen関数当たりで関連付けるけどな。
24 : で、実際13はどうなるんだ
25 : >>22 せっかくリファレンスの日本語訳が出たんだから Python でもやってろ
26 : いいからNGネームに追加しとけ
27 : >>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 : 今週末に考えるので気長に待ってろ。
29 : といってもそれを変換するとは限らない。
30 : haskell の新スレまだぁー?
31 : まだ立ってなかったのか
32 : 新しいスレ立てんなら立てる。 Cleanと一緒ならそう宣言する。 どっちか早く決めてもらいたい! ワタクシ、 言いたいことが山のように溜まっておるのです。 キミ,恐るることなかれ。(^^;) ttp://homepage3.nifty.com/Aransk/
33 : ↑のアホがいないときに立てるよ
34 : >>32 自分の名前でスレッド立てれば? 少しぐらいなら相手してあげてもいいよ ただし場所は http://pc.2ch.net/prog/ こっちでどうぞ。
35 : >>32 お前が立てろよ まあ直後にネタ板と化すだろうが
36 : おまえら あんま会話するな
37 : なんで>>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 : もったいぶってどうするんだ? ここは1が密かに努力するスレだと思うぞ
39 : >>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 : いいぞがんがれ
41 : ん? 俺は考えなくていいみたいだな。
42 : >>41 >>37, >>39 は長すぎる。>>17 並になるよう考えてくれ。
43 : >33 〜36 ワタクシには、決して悪気が無いことは、良くお分かりの くせに…(少し毒気はあるが、藁藁) まあHaskellスレが立つことを気長にお待ちしましょう。 それまでは、このスレに居座りますので、悪しからず(^^; ttp://homepage3.nifty.com/Aransk/
44 : >>43 名無しで立てて後で「乙」とでも自演しておけばとりあえずはネタスレにならずに立つ
45 : >>43 みたいのを「構ってクン」ていうんですね.初めて見ました.
46 : >>43 立ったぞ 早よけ http://pc2.2ch.net/test/read.cgi/tech/1076418993/ …程々にな
47 : >46 居心地が良さそうなんで、もう少し(微笑) そう言えばCleanってさあ、普通にダウンロードすると 旧ヴァージョンしか出来なくない? やはり金を払わないと最新版はダウンロードできないの? ttp://homepage3.nifty.com/Aransk/
48 : >>42 そう変わらん結果になると思うが、考えてはみよう。
49 : CleanPjtを推進しているオランダの大学教授も 最近やる気を無くしているみたいね? やっぱり、商売にならないとキツイんだ。 そりゃぁ、EclipseやJakartaPjtを無償で使っている 連中に売り込むのは、いかにもツライものがあるよねぇ。 ttp://homepage3.nifty.com/Aransk/
50 : 誰か Aransk タン専用スレ立てキボンヌ。
51 : >>50 漏れがスレ立てられるようになるまで待ってろ。 関数型言語スレの住人は煽り耐性もdqn耐性も 弱いからな。
52 : >50,51 でもCleanってさぁ。Haskellとは違って明らかに商用を 目指しているよねぇ?そのビジネスが成立するかどうかって Cleanスレでは重要じゃないの?でないと Clean言語自体が消えちゃうじゃんよぉ。 ttp://homepage3.nifty.com/Aransk/
53 : こんなのが流行る気がしないな。 このスレでも一向にコード書く奴出てこないし。 Aransk、おまえここに居座るつもりなら Cleanでなんかコード書いてみろよ。
54 : 元々はオランダの国家プロジェクトの副産物として登場したものなので、 商用を目指しているというのは正確ではない。 大学の研究用の材料にされているという方が正確だ。
55 : >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 : アホとは思っていたが。 これ程とは・・・
57 : 商用ってば、Eiffelのシャチョさん、一昨年の日本のOOカンファレンスに招聘されてたけど 相変わらず精力的だったな。やっぱコンサルとか講演とか、別の収入があるからかw
58 : どうする〜? Eiffel?
59 : Aransk 様の Clean 講座マダー
60 : 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 : >>55 >Cleanの最新版は金を払わんとダウンロード出来ん。 英語のサイト巡りも禄に出来ない人は来ないで下さい。
62 : 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 : 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 : >61 1.3じゃなくて、2.1無償ダウンロード出来るの? ttp://homepage3.nifty.com/Aransk/
65 : Aransk 様が Clean に興味を持たれたようです。
66 : >>64 ここにいるのは元号が大学名の学校出身ばかりだから、 得意の英語でMLに質問したら? Cleanのメーリングリストのアーカイブ(Discussions ) http://www.cs.kun.nl/pipermail/clean-list/
67 : 明治のことかー!!
68 : 元禄大学
69 : >>66 Aranskタンには無理だとわかっていてあえてそーゆう提案してるだろ?
70 : Aranskタンは愛すべき糞コテになりました そろそろ萌え擬人化します
71 : >70 >Aranskタンは愛すべき だよね?それがさぁ。 ttp://homepage3.nifty.com/Aransk/ のMSGボードに いつかは、来られるのではと、「密かに」期待はして おりました。それが、な、なんと、本日7000通もの 大量、カキコがありました。大漁節!です。 お蔭様でMSG板はオシャカ!であります。(^^; mild_server_super_lights先生を存知より の方が、もし「2ちゃんねる」にも出入りされて おられたら、是非、先生にお伝え願いたいのです。 Aranskは、またのお越しをお待ち申し上げて おりますと。今度は、先生の弊HPに対する ご意見なり、ご批判なりをご自由にお書き下さい。 但し、「多くても」10通以内にね。(大笑い)
72 : ((;゚Д゚))ガクガクブルブル ほ、本物?
73 : Aranskたんの萌えエロ画像キボン
74 : >>66 意味分からん
75 : >72 >((;゚Д゚))ガクガクブルブル ほ、本物? mild_server_super_lights先生って、2ちゃんねるでは 「そんなに」有名人なんでしょうか?(^^; ttp://homepage3.nifty.com/Aransk/
76 : いつの間にAranskだと認めたんだね.
77 : >76 >いつの間にAranskだと認めたんだね. もう随分以前から「ヒーロー勇気」や「名無し」を 使用せず、本名で発言しております。(^^; でないと2ちゃんねるの雑誌に有名コテハンとして 掲載してくれないらしい?(大藁藁) ttp://homepage3.nifty.com/Aransk/
78 : Aranskは自分がなにか``特別''であると 思い込みたくてしょうがないらしい... 916 :デフォルトの名無しさん :03/12/31 09:02 >913 ム板だけではなく、上の中東情勢板でも結構暴れたらしい?(藁) ム板と中東板を往復するのは、管理人だけなのにって 西村クンが嘆いていたそうな。 ところでヤフーの年間人気サイトで2ちゃんが表彰されていた。 まずはご同慶の至りです。 でも西村くんってちょっとヤバそうな顔してるね。 あの手の顔はいったん切れると無茶苦茶、恐いか、メッタメタ オモロイ!かどちらかだな。(藁藁) >ム板と中東板を往復するのは、管理人だけなのに プッ,何言ってんの?
79 : >>76, >>78 そっとしといてやれよ。第一Cleanと関係ないぞ。
80 : >76,78 そうだぁ!Cleanに関係ない質問をするな! (それに簡単に乗せられる奴も、問題ではある。(^^;) Javaやその他言語の無償提供環境の中で Cleanのような弱小言語がビジネスとして 成立するのか?また成立する「必要が」あるのか? それを問いたい。(^^; ttp://homepage3.nifty.com/Aransk/
81 : >Javaやその他言語の無償提供環境の中で >Cleanのような弱小言語がビジネスとして >成立するのか?また成立する「必要が」あるの 「○○言語に関する質問」と「○○言語のスレがビジネスとして 成立するかどうかの議論」は別々のスレでやった方がいいと思う.
82 : つか、それしかネタ無いんか?
83 : Aransk って普段どんなプログラムを作ってるの?
84 : >>80 最新版にこだわるけど 有料の最新版はダウンロード版とどこが違うの?
85 : 最新版 無料でダウンロード可能 登録も不要 ライセンスはLGPL ttp://www.cs.kun.nl/~clean/Download/main/main.htm
86 : >82 >つか、それしかネタ無いんか? 悪い。Cleanで知ってることってこれだけなんです。(^^; >83 普段はプログラムに触っておりません。 ひたすら面白そうな新しい言語を探し、言語仕様を 読んで、DLして験すだけ。だから、公平な評価が可能なので あります。純粋の鑑定団! 現在SimkinとIoを調査中であります。 >85 えぇ!ホントですか?ビジネス・プラクティスの変更か? どうやって、開発部隊は食っていけるのだろう? ttp://homepage3.nifty.com/Aransk/
87 : 書き込みがあまり無いようなので ネタフリとして http://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 : んじゃ、GUI版でも考えるかな。 今週末くらいを目途に。
89 : 関数型言語初心者なので素直にコンソール版で解いてみた。型指定は省略。 残りの問題も解いてみたけど、ネタ切れしそうなので投下は止めときます。 あ、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 : 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 : 他のGUI版も作ろうかと思ったが、まんまマニュアルにある。
92 : // 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 : http://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 : // 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 : CleanIDEのエディタに日本語入力すると文字化けする(´・ω・`) それは別のエディタを使えば済む問題だけど、Cleanコンパイラのほうが ダメ文字(2バイト目に0x5C(「\」記号)がある文字)に対応してないのはちょっと悲しい。 しょうがないからCleanIDEに日本語を直接入力してわざと文字化けさせて、 「\」記号が出てきたら、手入力で「\」記号をもう一つ追加して問題を回避してる。 ダメ文字って、Cleanのパーザをいじらないと対応できないのかな…
96 : ASCII以外には全く対応してないのが現状。 UNICODE担当(?)の人は、なんか違うことやってるので期待できない。
97 : >>96 そうですか…日本語の扱いは少し面倒ですね。 http://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 : Genericの世界は濃いね。
99 : Haskell、Clean辺りだとまだましなのかもしれないが、 関数型言語は思わぬパフォーマンス上の失策をやらかしてそうで怖い。 扱いきれない感がある。もっとクンフーを積まねば・・・。
100read 1read 1read 100read
TOP カテ一覧 スレ一覧 削除依頼 ▲
・ 次のスレ
WebObjects 質問スレ Java系スクリプト言語Groovy 【汚物】痛い変数名・関数名【破廉恥】 wide studioについて