純粋関数型言語Concurent Clean
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
NGNG純粋関数型言語Cleanに関するスレッドです。
関数型には珍しくIDEと、IO,Gameライブラリが標準でついてきます。
関連リンク
本家
http://www.cs.kun.nl/~clean/
日本語ドキュメントなど
http://sky.zero.ad.jp/~zaa54437/programming/clean/
0002デフォルトの名無しさん
NGNG間違えちゃった、許して。
00033
NGNG0004デフォルトの名無しさん
NGNG関連リンク
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/
0005デフォルトの名無しさん
NGNG関数型プログラミング言語Haskell
http://pc2.2ch.net/test/read.cgi/tech/1013846140/
関数型言語Part3
http://pc2.2ch.net/test/read.cgi/tech/1037527388/
0006デフォルトの名無しさん
NGNG0007デフォルトの名無しさん
NGNG0008デフォルトの名無しさん
NGNG一意性についてはココをみてください。
ttp://sky.zero.ad.jp/~zaa54437/programming/clean/CleanBook/part1/Chap4.html#sc16
なお、Haskellと同じくモナドも使えます。
ドッチが純粋かはわかりません。
たぶん同じぐらいじゃないっすかね?
0009デフォルトの名無しさん
NGNG>>8
'*'を付ける〜とかの純粋さの証明って、あれで説明になってるの?
さっぱりわからねえよ
0010デフォルトの名無しさん
NGNG0011デフォルトの名無しさん
NGNG何を言っているか分からんが、
評価結果が評価順序から独立していれば、
一応は参照透明だということになってるよ。
副作用がないってのが厳密な純粋性だけどね。
0012デフォルトの名無しさん
NGNG0013デフォルトの名無しさん
NGNG例えば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
0014デフォルトの名無しさん
NGNG該当箇所が分からんが。
0015デフォルトの名無しさん
NGNGcleanって日本語も扱えるのでしょうか?
0016デフォルトの名無しさん
NGNGその場合は他の関数型言語と変わらんな。
0017デフォルトの名無しさん
NGNGミクロなところ(実際にどうなるのか)を聞きたいんだと思うよ。
おれはそう。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
0018デフォルトの名無しさん
NGNG# Cleanスレだから張り直さないほうがいいかな。
0019デフォルトの名無しさん
NGNG使ってみれば分かる。
0020デフォルトの名無しさん
NGNG使えません
0021デフォルトの名無しさん
NGNG従って、表示はともかく、操作はできない。
0022Aransk
NGNGモデレートタイプに修正中です。是非早くHaskellスレPart3
を立ち上げて下さい。それとも、このCleanスレと
目出度く合体!でも当方としては、全然問題ありません。
HakellとCleanは兄弟のようなもんですから(^^;
ttp://homepage3.nifty.com/Aransk/
0023デフォルトの名無しさん
NGNGファイルの読込であれば、
こんな関数を作ればよい。
↓
Read :: File -> [Char] // ファイルから読み込んで文字リストを作る
Read f
# (b,ch,filerest) = sfreadc f
| not b = []
| otherwise = [ch : Read filerest]
要するにFile型の引数を操作すればいいだけ。
その前にsfopen関数当たりで関連付けるけどな。
0024デフォルトの名無しさん
NGNG0025デフォルトの名無しさん
NGNGせっかくリファレンスの日本語訳が出たんだから Python でもやってろ
0026デフォルトの名無しさん
NGNG0027デフォルトの名無しさん
NGNGおまいらこれを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));
}
0030デフォルトの名無しさん
NGNG0031デフォルトの名無しさん
NGNG0032Aransk
NGNGCleanと一緒ならそう宣言する。
どっちか早く決めてもらいたい!
ワタクシ、
言いたいことが山のように溜まっておるのです。
キミ,恐るることなかれ。(^^;)
ttp://homepage3.nifty.com/Aransk/
0033デフォルトの名無しさん
NGNG0034デフォルトの名無しさん
NGNG自分の名前でスレッド立てれば?
少しぐらいなら相手してあげてもいいよ
ただし場所は
http://pc.2ch.net/prog/
こっちでどうぞ。
0035デフォルトの名無しさん
NGNGお前が立てろよ
まあ直後にネタ板と化すだろうが
0036デフォルトの名無しさん
NGNGあんま会話するな
0037デフォルトの名無しさん
NGNGmodule 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
つづけて宜しゅうございますか?
0038デフォルトの名無しさん
NGNGここは1が密かに努力するスレだと思うぞ
0039デフォルトの名無しさん
NGNG続き
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はインデントがずれているので、適当に脳内補完しといてくれ。
0040デフォルトの名無しさん
NGNG0041デフォルトの名無しさん
NGNG俺は考えなくていいみたいだな。
0042デフォルトの名無しさん
NGNG>>37,>>39は長すぎる。>>17並になるよう考えてくれ。
0043Aransk
NGNGワタクシには、決して悪気が無いことは、良くお分かりの
くせに…(少し毒気はあるが、藁藁)
まあHaskellスレが立つことを気長にお待ちしましょう。
それまでは、このスレに居座りますので、悪しからず(^^;
ttp://homepage3.nifty.com/Aransk/
0044デフォルトの名無しさん
NGNG名無しで立てて後で「乙」とでも自演しておけばとりあえずはネタスレにならずに立つ
0045デフォルトの名無しさん
NGNG0046デフォルトの名無しさん
NGNG立ったぞ
早よ逝け
http://pc2.2ch.net/test/read.cgi/tech/1076418993/
…程々にな
0047Aransk
NGNG居心地が良さそうなんで、もう少し(微笑)
そう言えばCleanってさあ、普通にダウンロードすると
旧ヴァージョンしか出来なくない?
やはり金を払わないと最新版はダウンロードできないの?
ttp://homepage3.nifty.com/Aransk/
0048デフォルトの名無しさん
NGNGそう変わらん結果になると思うが、考えてはみよう。
0049Aransk
NGNG最近やる気を無くしているみたいね?
やっぱり、商売にならないとキツイんだ。
そりゃぁ、EclipseやJakartaPjtを無償で使っている
連中に売り込むのは、いかにもツライものがあるよねぇ。
ttp://homepage3.nifty.com/Aransk/
0050デフォルトの名無しさん
NGNG0051デフォルトの名無しさん
NGNG漏れがスレ立てられるようになるまで待ってろ。
関数型言語スレの住人は煽り耐性もdqn耐性も
弱いからな。
0052Aransk
NGNGでもCleanってさぁ。Haskellとは違って明らかに商用を
目指しているよねぇ?そのビジネスが成立するかどうかって
Cleanスレでは重要じゃないの?でないと
Clean言語自体が消えちゃうじゃんよぉ。
ttp://homepage3.nifty.com/Aransk/
0053デフォルトの名無しさん
NGNGこのスレでも一向にコード書く奴出てこないし。
Aransk、おまえここに居座るつもりなら
Cleanでなんかコード書いてみろよ。
0054デフォルトの名無しさん
NGNG商用を目指しているというのは正確ではない。
大学の研究用の材料にされているという方が正確だ。
0055Aransk
NGNG>This site is about functional programming
>and purely functional language : Concurrent Clean.
これCleanのプログラムじゃなかったっけ?(^^;
>54
Cleanの最新版は金を払わんとダウンロード出来ん。
それを商用と言わずして何を商用と言うのか?(^^)
IBMが5千万ドル開発費を注ぎ込んだ、Eclipseが
無償でダウンロードできる。これも大学の研究用の
材料であろうか?(^^;
ttp://homepage3.nifty.com/Aransk/
0056デフォルトの名無しさん
NGNGこれ程とは・・・
0057デフォルトの名無しさん
NGNG相変わらず精力的だったな。やっぱコンサルとか講演とか、別の収入があるからかw
0058デフォルトの名無しさん
NGNGEiffel?
0059デフォルトの名無しさん
NGNG0060デフォルトの名無しさん
NGNGmodule hello
import StdEnv, StdIO
Start world = startIO NDI Void (snd o openDialog undef hello) [] world
where hello= Dialog "" (TextControl "Hello world!" []) [WindowClose (noLS closeProcess)]
0061デフォルトの名無しさん
NGNG>Cleanの最新版は金を払わんとダウンロード出来ん。
英語のサイト巡りも禄に出来ない人は来ないで下さい。
006237の配列版
NGNGimport 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
006337の配列版続き
NGNGgetCsv 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
0064Aransk
NGNG1.3じゃなくて、2.1無償ダウンロード出来るの?
ttp://homepage3.nifty.com/Aransk/
0065デフォルトの名無しさん
NGNG0066デフォルトの名無しさん
NGNGここにいるのは元号が大学名の学校出身ばかりだから、
得意の英語でMLに質問したら?
Cleanのメーリングリストのアーカイブ(Discussions )
http://www.cs.kun.nl/pipermail/clean-list/
0067デフォルトの名無しさん
NGNG0068デフォルトの名無しさん
NGNG0069デフォルトの名無しさん
NGNGAranskタンには無理だとわかっていてあえてそーゆう提案してるだろ?
0070デフォルトの名無しさん
NGNGそろそろ萌え擬人化します
0071Aransk
NGNG>Aranskタンは愛すべき
だよね?それがさぁ。
ttp://homepage3.nifty.com/Aransk/のMSGボードに
いつかは、来られるのではと、「密かに」期待はして
おりました。それが、な、なんと、本日7000通もの
大量、カキコがありました。大漁節!です。
お蔭様でMSG板はオシャカ!であります。(^^;
mild_server_super_lights先生を存知より
の方が、もし「2ちゃんねる」にも出入りされて
おられたら、是非、先生にお伝え願いたいのです。
Aranskは、またのお越しをお待ち申し上げて
おりますと。今度は、先生の弊HPに対する
ご意見なり、ご批判なりをご自由にお書き下さい。
但し、「多くても」10通以内にね。(大笑い)
0072デフォルトの名無しさん
NGNG0073デフォルトの名無しさん
NGNG0074デフォルトの名無しさん
NGNG意味分からん
0075Aransk
NGNG>((;゚Д゚))ガクガクブルブル ほ、本物?
mild_server_super_lights先生って、2ちゃんねるでは
「そんなに」有名人なんでしょうか?(^^;
ttp://homepage3.nifty.com/Aransk/
0076デフォルトの名無しさん
NGNG0077Aransk
NGNG>いつの間にAranskだと認めたんだね.
もう随分以前から「ヒーロー勇気」や「名無し」を
使用せず、本名で発言しております。(^^;
でないと2ちゃんねるの雑誌に有名コテハンとして
掲載してくれないらしい?(大藁藁)
ttp://homepage3.nifty.com/Aransk/
0078デフォルトの名無しさん
NGNG思い込みたくてしょうがないらしい...
916 :デフォルトの名無しさん :03/12/31 09:02
>913
ム板だけではなく、上の中東情勢板でも結構暴れたらしい?(藁)
ム板と中東板を往復するのは、管理人だけなのにって
西村クンが嘆いていたそうな。
ところでヤフーの年間人気サイトで2ちゃんが表彰されていた。
まずはご同慶の至りです。
でも西村くんってちょっとヤバそうな顔してるね。
あの手の顔はいったん切れると無茶苦茶、恐いか、メッタメタ
オモロイ!かどちらかだな。(藁藁)
>ム板と中東板を往復するのは、管理人だけなのに
プッ,何言ってんの?
0079デフォルトの名無しさん
NGNGそっとしといてやれよ。第一Cleanと関係ないぞ。
0080Aransk
NGNGそうだぁ!Cleanに関係ない質問をするな!
(それに簡単に乗せられる奴も、問題ではある。(^^;)
Javaやその他言語の無償提供環境の中で
Cleanのような弱小言語がビジネスとして
成立するのか?また成立する「必要が」あるのか?
それを問いたい。(^^;
ttp://homepage3.nifty.com/Aransk/
0081デフォルトの名無しさん
NGNG>Cleanのような弱小言語がビジネスとして
>成立するのか?また成立する「必要が」あるの
「○○言語に関する質問」と「○○言語のスレがビジネスとして
成立するかどうかの議論」は別々のスレでやった方がいいと思う.
0082デフォルトの名無しさん
NGNG0083デフォルトの名無しさん
NGNG0084デフォルトの名無しさん
NGNG最新版にこだわるけど
有料の最新版はダウンロード版とどこが違うの?
0085デフォルトの名無しさん
NGNG無料でダウンロード可能
登録も不要
ライセンスはLGPL
ttp://www.cs.kun.nl/~clean/Download/main/main.htm
0086Aransk
NGNG>つか、それしかネタ無いんか?
悪い。Cleanで知ってることってこれだけなんです。(^^;
>83
普段はプログラムに触っておりません。
ひたすら面白そうな新しい言語を探し、言語仕様を
読んで、DLして験すだけ。だから、公平な評価が可能なので
あります。純粋の鑑定団!
現在SimkinとIoを調査中であります。
>85
えぇ!ホントですか?ビジネス・プラクティスの変更か?
どうやって、開発部隊は食っていけるのだろう?
ttp://homepage3.nifty.com/Aransk/
0087デフォルトの名無しさん
NGNGネタフリとして
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は、非負の引数に適用されるものとする。
0089デフォルトの名無しさん
NGNG残りの問題も解いてみたけど、ネタ切れしそうなので投下は止めときます。
あ、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))
009042の表示GUI版
NGNGimport 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
0091デフォルトの名無しさん
NGNG0092デフォルトの名無しさん
NGNGdivable :: 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
0093デフォルトの名無しさん
NGNG人もいないし、黙々と解いてみる。
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))
009493
NGNGcountday :: (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]
0095デフォルトの名無しさん
NGNGそれは別のエディタを使えば済む問題だけど、Cleanコンパイラのほうが
ダメ文字(2バイト目に0x5C(「\」記号)がある文字)に対応してないのはちょっと悲しい。
しょうがないからCleanIDEに日本語を直接入力してわざと文字化けさせて、
「\」記号が出てきたら、手入力で「\」記号をもう一つ追加して問題を回避してる。
ダメ文字って、Cleanのパーザをいじらないと対応できないのかな…
0096デフォルトの名無しさん
NGNGUNICODE担当(?)の人は、なんか違うことやってるので期待できない。
0097デフォルトの名無しさん
NGNGそうですか…日本語の扱いは少し面倒ですね。
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つの(==)は同じ関数である。したがって再帰的な定義である。
0098デフォルトの名無しさん
NGNG0099デフォルトの名無しさん
NGNG関数型言語は思わぬパフォーマンス上の失策をやらかしてそうで怖い。
扱いきれない感がある。もっとクンフーを積まねば・・・。
0100100
NGNG0101デフォルトの名無しさん
NGNGこれのセクション4以降が意味不明、理解不能。
気にしないほうがいいのか?
・・・にしても静かなスレだね。
0102デフォルトの名無しさん
NGNGって事であってる?
0103デフォルトの名無しさん
NGNG0104デフォルトの名無しさん
NGNGClean以外で型一意性の考え方のある言語があれば教えてください。
0105デフォルトの名無しさん
NGNG0106デフォルトの名無しさん
NGNG0107デフォルトの名無しさん
NGNG0108デフォルトの名無しさん
NGNG0109デフォルトの名無しさん
NGNGコツコツ積み上げていきます。
0110デフォルトの名無しさん
NGNGふつうは参照透明性を確保するのに、データのコピーを作ってそいつを変更する必要があるけど、
もし変更後に変更前のデータを使わないことを保証できれば、元のデータはいらないから、わざわざコピーを作る必要もない。
つまり、データの破壊的更新を行っても参照透明性を維持できる。
ってことじゃないかと。
0111デフォルトの名無しさん
NGNG0112デフォルトの名無しさん
NGNG0113デフォルトの名無しさん
NGNG0114名無しさん@そうだ選挙に行こう
NGNG0115デフォルトの名無しさん
NGNGMercuryという言語で使える。
http://www.cs.mu.oz.au/mercury
#Clean好きで来てみたら寂しいスレだ(′・ω・`)。
#現在Cleanの一意性型の論文読んるけどわかったようなわからんような。
0116デフォルトの名無しさん
NGNG古いバージョンに付いていたそうですが、今のには無さそうなので・・
0117デフォルトの名無しさん
NGNGは大丈夫なのに
MyIf True t e = t
MyIf False t e = e
MyIf c (fwritec 'a' file) (fwritec 'b' file)
はだめなのか。
0118デフォルトの名無しさん
NGNGMyIfについては、一意型の*Fileオブジェクトへの参照数が2になるのがエラーの原因のはず。
このあたりに説明があったと思う:http://sky.zero.ad.jp/~zaa54437/programming/clean/LanguageReport21/Chap9.html
ifは言語組み込みの機能だから、特別扱いだと思う。StdEnv探しても関数の定義がないし。
(_system.abcにifの定義らしき記述があるけど・・・読める人いたら解説きぼん)
言語組み込みのifに相当するMyIfは、通常の関数として書けないような気がするけど
実際のところはどうなんでしょうか>詳しい人
0119デフォルトの名無しさん
NGNGMyIf b t e =
| b = t
| otherwise = e
処理系が手元にないんで試せないけど、これでもダメかね?
tが評価される時はeがゴミなのでfileへの参照は1になると思うんだが。
0120デフォルトの名無しさん
NGNG0121デフォルトの名無しさん
NGNGダメですた。
つーか、
MyIf b t e = if b t e
でもダメ。
0122デフォルトの名無しさん
NGNGまあMyIfを使わず、素直にガードで分岐すれば動作するんだけどね。
ガードやcaseなら、ちゃんとAlternativeだと見なしてくれる。
WriteAorB b file
| b = fwritec 'a' file
= fwritec 'b' file
0123デフォルトの名無しさん
NGNG構文が抽象化されすぎて余計わかりにくい感じがするのですが
0124デフォルトの名無しさん
NGNG0125デフォルトの名無しさん
NGNGIOからまなきゃ
0126デフォルトの名無しさん
NGNG分岐(if, case, ガード)が陽に見えているところでしか
一意性解析していないということか。
MyIfが使えるようにするには、自分で型に一意性注釈を
書かなければならないのだろうが、分岐のような
「いくつかの引数のうちどれか一つしか評価しない」というような
ことを型レベルで表現するのは無理だから、やっぱできないのかな。
0127デフォルトの名無しさん
NGNG0128デフォルトの名無しさん
NGNG関数はパターンマッチングによる場合分けによって定義されるとする。
その場合の単純な一意性解析の戦略を考えてみると関数の定義が以下の形
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?
それで十分なのか、それができるのかはもうちょっと考えてみないとわからない。
おしえてエライ人。
0129デフォルトの名無しさん
NGNG0130デフォルトの名無しさん
NGNG面倒なのでその先はまだやってないっす。
FreeBSD で動かしたくてソースコードもダウンロードしたけど、アセンブリばっ
かしなのでかなり無理っぽい。っていうかどういう風にビルドすればいいのか
ぜんぜんわからない。
0131デフォルトの名無しさん
NGNG0132デフォルトの名無しさん
NGNGGUI な開発環境なし版が欲しい。
ただ、普通の Linux とか Solaris なら動くんじゃないの?
0133デフォルトの名無しさん
NGNG0134デフォルトの名無しさん
NGNG0135デフォルトの名無しさん
NGNG今開発って続いてるの?
0136デフォルトの名無しさん
NGNG0137デフォルトの名無しさん
NGNGLength :: [a] -> Int
Length = foldr (¥x -> (+) 1) 0
0138デフォルトの名無しさん
NGNGLengthは引数を持たず(アリティ0)、リスト[a]をIntに変換する関数を返すので
Length :: ([a] -> Int)
でたぶん通る。
0139デフォルトの名無しさん
NGNGおおサンクス
型が違ってたのか。Lengthの定義がおかしいのかと思ってたよ。
最近関数型言語の勉強はじめたんだが、楽しすぎるな。
「プログラミング言語は思考の増幅器である」って昔誰かが言ってたが
まさにそんな感じ。脳汁出まくりですよ
0140デフォルトの名無しさん
05/01/21 19:21:000141デフォルトの名無しさん
05/03/15 21:08:05によると、一昨年の10月31日の 2.1.0 から更新されてない様だが、新しいのあるの?
0142デフォルトの名無しさん
2005/05/06(金) 16:08:550143デフォルトの名無しさん
2005/05/14(土) 00:12:250144デフォルトの名無しさん
2005/05/14(土) 00:12:590145デフォルトの名無しさん
2005/07/16(土) 14:20:220146
2005/07/18(月) 21:05:13Clean 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
0147デフォルトの名無しさん
2005/07/19(火) 08:33:13Cleanが話題にならない理由として考えられるのは
基本概念が複雑なことだな
異質すぎて何が効率よいとかが判断できない
0148デフォルトの名無しさん
2005/07/19(火) 12:46:180149デフォルトの名無しさん
2005/07/19(火) 20:25:19ライセンスも分かりにくい。自分が書いたコードはライセンス汚染を受けるの?
0150デフォルトの名無しさん
2005/07/19(火) 20:48:23非商用の場合はLGPL、商用の場合は要問合せ。
そもそも、registしなくてもダウンロードできるし。
0151デフォルトの名無しさん
2005/07/19(火) 21:15:51static なライブラリを作るのか知りたかったんだけど、レジスト不要なら自分で試してみます。
サンクス。
static でもソース公開の義務がないのは知ってるけど、ちょっと面倒だね。
0152デフォルトの名無しさん
2005/07/20(水) 20:33:06異質ってことは、複雑かどうかもわからんてことよw
難解だよな
0153デフォルトの名無しさん
2005/08/06(土) 12:24:17ttp://www.geocities.jp/lethevert/softwares/clean/localize.html
0154デフォルトの名無しさん
2005/08/06(土) 12:52:50がんばれよー
0155デフォルトの名無しさん
2005/08/06(土) 19:36:040156デフォルトの名無しさん
2005/08/06(土) 20:14:560157デフォルトの名無しさん
2005/08/07(日) 00:09:290158デフォルトの名無しさん
2005/08/07(日) 14:50:44他言語とのコードの比較表とか
そういったもので優位性というか、
どんだけ違うか示していくというのはどうか
0159デフォルトの名無しさん
2005/08/08(月) 14:13:59( ´_ゝ`)フーン
「まるでない」と言い切れるほど詳しくご存知なんですね。
0160デフォルトの名無しさん
2005/08/10(水) 23:11:260161デフォルトの名無しさん
2005/08/25(木) 21:50:11CUIは問題無く動きました。
GUIはXView無しでもWINE使って、
Hello World 程度を動かせました。
Wineでもいいから一通り動いて、
1.3のlibraryも使えて、
Emacsのclean-modeがhaskell-mode並に使えれば…と思います。
0162勉強中
2005/09/07(水) 22:28:590163デフォルトの名無しさん
2005/09/07(水) 23:42:54詳しく
0164デフォルトの名無しさん
2005/09/08(木) 00:11:17勉強終わるまでちょっとまって。
0165デフォルトの名無しさん
2005/09/11(日) 21:05:300166名無しさん@そうだ選挙に行こう
2005/09/11(日) 23:03:09ここはCleanのスレですが
0167デフォルトの名無しさん
2005/09/23(金) 10:59:05Haskell は他言語で1文字でも短く書けるコードがありましたら、
お申し出下さい言語。
0168デフォルトの名無しさん
2005/09/25(日) 03:21:36// (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])]) +++""
0169デフォルトの名無しさん
2005/09/25(日) 04:14:550170デフォルトの名無しさん
2005/09/25(日) 18:29:33言語のせいにするなってw
0171勉強中
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
0172デフォルトの名無しさん
2005/09/30(金) 00:06:480173デフォルトの名無しさん
2005/10/02(日) 01:10:08countFlips 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
0174デフォルトの名無しさん
2005/10/02(日) 01:13:23where
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
0175デフォルトの名無しさん
2005/10/02(日) 23:34:16gcc -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)) +++ ";"
0176デフォルトの名無しさん
2005/10/02(日) 23:40:08arrayReverse 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
//これを動かしたい人はいろいろ組合わせて下さい。
// *組*を作成しなければ、無駄なメモリ消費量を抑えられるはず。
0177デフォルトの名無しさん
2005/10/03(月) 21:42:37*組* ってちょっと…
「タプル」でいいんじゃない?
0178デフォルトの名無しさん
2005/10/03(月) 23:22:07助言サンクス
で一応まとめ 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に翻訳とかやるかも。では、さよーなら。
0179デフォルトの名無しさん
2005/10/09(日) 03:44:31trimNewline::!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
0180デフォルトの名無しさん
2005/10/09(日) 08:26:13この言語には整数は32bitしかないのでしょうか?64bitは無し?
0181デフォルトの名無しさん
2005/10/09(日) 09:29:44これじゃMLと同じ轍を踏むことになるじゃないか
とSPJが言ってました。
0182勉強中の人
2005/10/09(日) 14:37:00windows版で BigInt、Rational, Complexのライブラリはあるようです。
>>181
バートランド・ラッセルが
「宗教の数は時代の遷移に共なって、指数関数的(対数だったっけ?)に変化する」
とか言ったのに似て、プログラミング言語も人間の頭の中からできたものだから、
ある程度分裂する感じがする。(指数関数的 1- e^(-n*x))
最適化問題として捉えても、研究者じゃない人間が遊んだり、
一部の研究者が触っても問題ないどころか良い事だと思うし。
Privateで工学・政治的な理由に付き合う理由はあまりないと思う。
モナドで包まれない状態が生で触れるためCleanはhaskellの勉強になる。
ただ、generic も モナド もよくわかってないが、
モナドの方が良くできてる感じがする。
他にも hasktags はあるけど、 cleantags はないとかかなり不便。
ちなみに、SPJとか知らんですよ。
0183180
2005/10/10(月) 05:33:09ありがとうございます。
日本語使えるよう頑張ってるヒトいるみたいだし勉強してみようかなぁ...
> ちなみに、SPJとか知らんですよ。
Simon Peyton-Jonesさんではないかと。Glasgow Haskellの中のヒトかと。
0184デフォルトの名無しさん
2005/10/10(月) 09:43:14茨の道ですよ。多分。
//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
0185デフォルトの名無しさん
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 [] _ = ""
ライブラリはよく吟味した上で一元管理がよさそう
0186デフォルトの名無しさん
2005/10/11(火) 00:30:37readはできたが。
0187勉強中の人
2005/10/13(木) 22:54:27// 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 とかにも向いてると思う。(配列以外は)
0188デフォルトの名無しさん
2005/10/25(火) 23:17:03foldrWithReadline:: !(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
0189デフォルトの名無しさん
2005/10/25(火) 23:46:25Start = /*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
0190デフォルトの名無しさん
2005/10/26(水) 00:50:31StateMonad はどこかに落ちてるから、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 のマニュアルも使えるかもしれない。
0191デフォルトの名無しさん
2005/10/29(土) 23:11:18// 行列線形代数(一意なし) ちょっと遅い 小さい行列やループが入れば
// 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}
0192デフォルトの名無しさん
2005/10/29(土) 23:13:54(*) :: !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
0193デフォルトの名無しさん
2005/10/30(日) 19:22:17実用ならocamlのほうがよさそうだ。
本格派なら言語そのものの研究といった所かな?
ocamlは見た目が美しく感じないので好きじゃないんだけど。
素人の感想
Haskell :: スピードが遅く scheme で十分なので魅力を感じない
ocaml :: ライブラリが比較的充実?純粋関数型ではない
Clean :: マイナーでライブラリ作成が大変
0194デフォルトの名無しさん
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)
0195デフォルトの名無しさん
2005/11/03(木) 21:12:26module 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}
0196デフォルトの名無しさん
2005/11/05(土) 08:15:35Clean のゲームライブラリとかも結構強力ですね。
ゲームというより、ゲーム的な操作性・表現力を持つ物と考えれば幅は広がります。
Charlie が二週間でできたとのことです。
パフォーマンスが問題なければ実用にも。
…自分だけが書いていることには問題がありますが。
0197デフォルトの名無しさん
2005/11/16(水) 00:17:45haskellにも Generic Haskell なんてのがあるんだな。
0198デフォルトの名無しさん
2005/11/27(日) 20:34:15・産業指向であるため、活発な開発が行なわれない。(投資額が少ない場合)
・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 の方がいいと思うんだが。
0199デフォルトの名無しさん
2005/11/28(月) 00:54:27lp :: *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"
0200デフォルトの名無しさん
2005/11/30(水) 20:36:550201デフォルトの名無しさん
2005/12/01(木) 23:16:38// 連想配列 ではなく 連想リスト
(@) 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
と言わず一言どうぞ
0202デフォルトの名無しさん
2005/12/01(木) 23:42:59型クラスもない。
普通のオブジェクト指向はあるみたい。
………使いたくなくなった。
0203デフォルトの名無しさん
2005/12/02(金) 05:45:07COMだとかActiveXだとかの外部のコンテナを扱いたい際は
データの副作用は純粋関数型言語ではどういった扱いになるんでしょうか?
0204デフォルトの名無しさん
2005/12/02(金) 21:20:09ここは参考になるかな?
http://www.haskell.org/hdirect/
0205デフォルトの名無しさん
2005/12/02(金) 23:16:49あまり実用ではない。
0206デフォルトの名無しさん
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 なんてのがある
0207デフォルトの名無しさん
2005/12/15(木) 03:29:16//省略
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)
0208デフォルトの名無しさん
2005/12/15(木) 03:31:03downcase :: !String -> String
downcase str = {toLower x\\x<-:str}
0209デフォルトの名無しさん
2005/12/15(木) 09:35:19Cleanはよく知らない俺がHaskellで書いてみましたよ。
import System.Environment
main = getArgs >>= mapM_ (putStr . map downcase . readFile)
0210デフォルトの名無しさん
2005/12/15(木) 09:38:57import Data.Char
した上で
map toLower
だった。
0211デフォルトの名無しさん
2005/12/15(木) 09:42:13(\ fname -> readFile fname >>= putStr . map toLower)
ですかね
0212デフォルトの名無しさん
2005/12/15(木) 20:45:16ちょっと変形してでもいいから 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)
0213デフォルトの名無しさん
2005/12/17(土) 01:05:21いが、しかし、あるものを使わないのは馬鹿げていると思う。
ところでこの mapM_ の引数だと、
((>>= putStr . map toLower) . readFile)
と書ける。
その方が綺麗だと思うかどうかは人によると思うが、個人的にはどちらにせよ
新しい演算子を作るほどではない気がする。
0214デフォルトの名無しさん
2005/12/17(土) 16:28:11確かにそうですね。
中間演算子が便利そうだったので何も考えずに使った感はあります。
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
0215デフォルトの名無しさん
2005/12/18(日) 15:50:07そうであれば、僕の独り言状態になってるのでそろそろ終了しようかと思います。
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
0216デフォルトの名無しさん
2005/12/31(土) 00:19:12home1.tigers-net.com/~th003751/
0217デフォルトの名無しさん
2006/01/03(火) 21:07:290218デフォルトの名無しさん
2006/01/15(日) 01:13:420219デフォルトの名無しさん
2006/01/15(日) 12:32:23論文の発表すら過疎ってるの?
0220デフォルトの名無しさん
2006/01/15(日) 13:05:57VBみたいでイヤンなんだけど・・・。
0221デフォルトの名無しさん
2006/01/15(日) 20:06:28コードに自分でスレッド関連の事をなんも書かないで、
普通に書くだけで、マルチCPUやマルチコアをフル活用して並列処理してくれるの?
0222デフォルトの名無しさん
2006/01/15(日) 21:55:300223デフォルトの名無しさん
2006/01/15(日) 22:01:20これか?
ttp://mailman.science.ru.nl/pipermail/clean-list/2003/002485.html
0224デフォルトの名無しさん
2006/01/15(日) 22:07:440225221
2006/01/16(月) 00:42:19�d。
> we dropped the feature due to lack off parallel machines.
なんとショボイ理由w(つうか言い訳?)。
1990年代後半なら個人でもデュアルCPUマシン位所有できただろ。
つうか俺実際"Dualon"使ってたし。って違うのか?
あと、プロセス単位だったような説明だが、
言語が本質的に並列性を備えてるならスレッドで良いじゃん。
マルチコア時代に向けて復活させろよ。
0226デフォルトの名無しさん
2006/01/17(火) 00:54:01linuxならclmでCUIコンパイルができるよ。
windows だと, CleanIDE.exe --batch-build <FULL path to project>
なんてできるらしいけど、成功しなかった。
0228デフォルトの名無しさん
2006/03/08(水) 22:40:20といっても、変更先もアクセス不能ですが。
The Clean Homepage has been moved to:
http://www.cs.kun.nl/~clean/
Please update your bookmarks accordingly.
0229デフォルトの名無しさん
2006/04/15(土) 14:21:38今はどこからダウンロードできるの?
0230デフォルトの名無しさん
2006/04/17(月) 06:06:020231デフォルトの名無しさん
2006/04/22(土) 21:40:48欠点でもあるん?
0232231
2006/04/24(月) 03:37:56分かりやすい日本語のチュートリアルがあるのがいいね。
Haskellはわけ分からん。
Cleanを気に入った人間はここにもいるぞってことで、足跡を残しておく。
しかし、他スレでHaskellの欠点をCleanなら解決できるって書き込みがあるが、
見事にスルーされてるね。
Cleanを気に入った人間としては悲しい限りだ。
0233デフォルトの名無しさん
2006/04/24(月) 14:12:26どこすか?
0234デフォルトの名無しさん
2006/04/24(月) 14:28:26のことかな?
sky.zero.ad.jp のやつはわかりづらいと思うが……
0235デフォルトの名無しさん
2006/04/24(月) 17:51:20おおそこか thanx
0236デフォルトの名無しさん
2006/04/28(金) 21:08:19haskellの欠点を回避といっても
表面的なもの・・・
というか、環境変数を変更できないだけ。
また、cから配列で情報を得ようとする場合は、副作用を生じるし、
それによってうまくいかない場合があるかもしれない。
配列が使えないっていうのは文字列も副作用なしでは使えないってこと。
class とかも 型ClassのList を 引数?に取れないで
(List a)にしなきゃいけない
とかいろいろ欠点はあると思う。
0237デフォルトの名無しさん
2006/05/04(木) 16:20:520238デフォルトの名無しさん
2006/05/21(日) 16:27:050239デフォルトの名無しさん
2006/05/21(日) 18:18:320240デフォルトの名無しさん
2006/05/21(日) 21:16:400241デフォルトの名無しさん
2006/06/21(水) 16:39:57Haskellだと、うまく行ったんですが…。
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))
0242デフォルトの名無しさん
2006/06/21(水) 16:52:280243デフォルトの名無しさん
2006/06/21(水) 17:58:350244241
2006/06/21(水) 23:31:10ありがとうございます。
おおボケかましてました 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)
0245デフォルトの名無しさん
2006/10/09(月) 08:44:380246デフォルトの名無しさん
2006/12/04(月) 23:17:510247デフォルトの名無しさん
2006/12/20(水) 05:05:320248デフォルトの名無しさん
2006/12/20(水) 20:10:150249デフォルトの名無しさん
2007/01/27(土) 22:06:100250デフォルトの名無しさん
2007/01/27(土) 22:21:380251デフォルトの名無しさん
2007/03/06(火) 00:15:440252デフォルトの名無しさん
2007/03/26(月) 20:43:420253デフォルトの名無しさん
2007/05/14(月) 17:29:510254デフォルトの名無しさん
2007/05/17(木) 21:39:260255デフォルトの名無しさん
2007/05/17(木) 21:40:060256デフォルトの名無しさん
2007/05/17(木) 22:19:30更新なんかもう2年もされてないし。
0257デフォルトの名無しさん
2007/05/17(木) 22:22:25っていうか、Haskellは研究用としてすでにデフォルトだから新しい研究成果はほとんどHaskellに組み込まれるよ。
0258デフォルトの名無しさん
2007/05/17(木) 23:23:31>Cleanの成果はすべてHaskellに取り込まれてるから、
Haskell はマクロも無いし、変数に代入出来ないでしょ。
しかも将来性だって嵩が知れてるがな。
Haskell は嫌いじゃないけど、Haskell 信者は嫌いだ。
0259デフォルトの名無しさん
2007/05/17(木) 23:29:06信者じゃねーよ
俺もHaskellは使いにくいと思ってるが、それはおいといて・・
変数はあるよ。IORefモナドとか。
でも、こういうものはなるべくなくすべきだというのが一般的な見解。
マクロは成果でも何でもないと思う。
0260デフォルトの名無しさん
2007/05/17(木) 23:30:000261デフォルトの名無しさん
2007/05/17(木) 23:36:410262デフォルトの名無しさん
2007/05/18(金) 01:18:470263デフォルトの名無しさん
2007/05/18(金) 01:20:21むしろ、流行好きだから、一時期Cleanに興味持つのでは?
お、今度はこんな言語でてきたかーって。
で、流行がすぎさった、と。
0264デフォルトの名無しさん
2007/05/18(金) 06:06:58一定の領域内でその複製を値を変えることができる、
という認識でいいのかな?
純粋な変数とは言いがたいようなそうでないような。
0265デフォルトの名無しさん
2007/05/18(金) 19:25:19> 更新なんかもう2年もされてないし。
そうなの?
モナドつかわなくて良くて
速いっていう夢の言語かと思ったのに
0266デフォルトの名無しさん
2007/06/15(金) 18:11:330267265
2007/06/21(木) 20:58:01なるほど! djbメソッド
0268デフォルトの名無しさん
2007/06/24(日) 00:00:18>速いっていう夢の言語かと思ったのに
ocamlでも使え
0269デフォルトの名無しさん
2007/06/24(日) 00:04:480270デフォルトの名無しさん
2007/06/24(日) 02:45:52あなたのまんこですか
0271デフォルトの名無しさん
2007/06/24(日) 13:44:230272デフォルトの名無しさん
2007/06/24(日) 14:38:480273デフォルトの名無しさん
2007/06/24(日) 14:46:30節操が無いよな。
0274デフォルトの名無しさん
2007/06/24(日) 16:15:35それ別に書かなくても良くなったんだぜ
0275デフォルトの名無しさん
2007/06/24(日) 16:31:420276デフォルトの名無しさん
2007/06/24(日) 16:38:170277デフォルトの名無しさん
2007/08/15(水) 19:42:22Haskellだと簡単に作れるのに
やっぱり、一意性よりもモナドの方が優れてるってことだね
0278デフォルトの名無しさん
2007/08/17(金) 03:08:37module x
import MyHakell
Start w = main w where main = readFile "c:/a.txt" >>= print
0279デフォルトの名無しさん
2007/11/24(土) 10:37:070280デフォルトの名無しさん
2007/11/25(日) 04:07:130281デフォルトの名無しさん
2007/12/18(火) 00:34:320282デフォルトの名無しさん
2008/04/12(土) 09:24:500283デフォルトの名無しさん
2008/10/21(火) 01:44:15しかしIDEがあるのは良いけど、
コマンドラインで一通りできるようにしてくれんとなあ。
こういうのはただですら利用者いないんだから
もっとunix系に媚び売らんと誰も使わんってのw
0284デフォルトの名無しさん
2009/03/24(火) 04:48:430285デフォルトの名無しさん
2009/03/26(木) 03:39:29MLでもCleanは死んだ?なんて話題が出る位だしなぁ(汗。
つか学会の告知SPAMばっかで……
0286デフォルトの名無しさん
2009/03/30(月) 03:14:510287デフォルトの名無しさん
2009/03/31(火) 00:33:110288デフォルトの名無しさん
2009/03/31(火) 14:34:190289デフォルトの名無しさん
2009/03/31(火) 22:50:43STM とか VM の改修とか
Haskell に無くて Clean の良い所って参照透明性を確保しつつ
破壊的な操作が出来る所じゃなかったっけ?
0290デフォルトの名無しさん
2009/04/01(水) 13:03:150291デフォルトの名無しさん
2009/04/06(月) 04:02:060292デフォルトの名無しさん
2009/04/13(月) 03:23:26Javaで言えば
class A {
A a;
}
のようなことができるということですか?
こういう使い方ができるなら使ってみたいのだけど、
どう書けばいいか説明してある資料が見つからないorz
0293292
2009/04/13(月) 03:24:59わざとらしいかもですが、わざとではないです。
逝きます。
0294292
2009/04/21(火) 21:14:57Haskellですが、Cleanでも同じような方法が使えそうですね。
(こういう機能はHaskellがCleanから取り込んだのかな?)
-- 引用元は'Dynamic Cyclic Data Structures in Lazy Functional Languages (1995)'
data Graph a = Node a [Graph a]
glist :: [Graph [Char]]
glist = [ Node "A" [glist!!2, glist!!1],
Node "B" [glist!!3],
Node "C" [glist!!0, glist!!3],
Node "D" [] ]
graph :: Graph [Char]
graph = head glist
循環データ構造を部分ごとに別のタイミングで作りたい場合や、
既にある循環データ構造の一部を変更したい場合
(後者は全体を作り直す必要がある) が、まだ大変そうですね。
0295デフォルトの名無しさん
2009/12/04(金) 02:38:360296デフォルトの名無しさん
2010/10/14(木) 17:45:310297デフォルトの名無しさん
2011/01/04(火) 15:42:340298デフォルトの名無しさん
2011/05/10(火) 19:46:20.900299デフォルトの名無しさん
2011/05/18(水) 16:11:12.67激動の一年過ぎて吹いた
0300デフォルトの名無しさん
2011/05/19(木) 21:57:04.470301デフォルトの名無しさん
2011/05/25(水) 13:52:16.770302デフォルトの名無しさん
2011/07/09(土) 22:29:39.340303デフォルトの名無しさん
2011/07/10(日) 15:51:21.24http://wiki.clean.cs.ru.nl/Clean
0304デフォルトの名無しさん
2011/08/31(水) 12:46:39.630305デフォルトの名無しさん
2011/12/24(土) 00:33:27.820306デフォルトの名無しさん
2011/12/29(木) 18:57:20.720307デフォルトの名無しさん
2012/01/27(金) 05:58:22.010308デフォルトの名無しさん
2012/02/21(火) 02:39:23.57ttp://www.amazon.co.jp/dp/4048860690
0309デフォルトの名無しさん
2012/02/21(火) 08:25:35.92■ このスレッドは過去ログ倉庫に格納されています