トップページ⇒tech
309コメント108KB

純粋関数型言語Concurent Clean

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG

純粋関数型言語Cleanに関するスレッドです。
関数型には珍しくIDEと、IO,Gameライブラリが標準でついてきます。


関連リンク
本家
http://www.cs.kun.nl/~clean/
日本語ドキュメントなど
http://sky.zero.ad.jp/~zaa54437/programming/clean/
0002デフォルトの名無しさんNGNG
あっConcurentじゃなくてConcurrentね。
間違えちゃった、許して。
00033NGNG
本気(maji)ですか!?
0004デフォルトの名無しさん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デフォルトの名無しさんNGNG
純粋関数型って何?
0007デフォルトの名無しさんNGNG
Haskellとどっちが純粋ですか?
0008デフォルトの名無しさんNGNG
Cleanは型一意性によって副作用の問題を克服しています。
一意性についてはココをみてください。
ttp://sky.zero.ad.jp/~zaa54437/programming/clean/CleanBook/part1/Chap4.html#sc16
なお、Haskellと同じくモナドも使えます。
ドッチが純粋かはわかりません。
たぶん同じぐらいじゃないっすかね?
0009デフォルトの名無しさんNGNG
ユーザーに歩み寄りをかなり強いる言語な気がする。

>>8
'*'を付ける〜とかの純粋さの証明って、あれで説明になってるの?
さっぱりわからねえよ
0010デフォルトの名無しさんNGNG
綴りが間違ってる。
0011デフォルトの名無しさんNGNG
>>9
何を言っているか分からんが、
評価結果が評価順序から独立していれば、
一応は参照透明だということになってるよ。
副作用がないってのが厳密な純粋性だけどね。
0012デフォルトの名無しさんNGNG
ここでは「純粋」ならば「strictでない」のだそうだ
0013デフォルトの名無しさん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
>>12
該当箇所が分からんが。
0015デフォルトの名無しさんNGNG
Windows版に興味がでたのですが、
cleanって日本語も扱えるのでしょうか?
0016デフォルトの名無しさんNGNG
>>13
その場合は他の関数型言語と変わらんな。
0017デフォルトの名無しさんNGNG
>>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
0018デフォルトの名無しさんNGNG
indent崩れた…
# Cleanスレだから張り直さないほうがいいかな。
0019デフォルトの名無しさんNGNG
>>15
使ってみれば分かる。
0020デフォルトの名無しさんNGNG
>>15
使えません
0021デフォルトの名無しさんNGNG
ユニコードに対応したライブラリはない。
従って、表示はともかく、操作はできない。
0022AranskNGNG
最近は徐々に相手の神経を逆撫でする発言スタイルを
モデレートタイプに修正中です。是非早くHaskellスレPart3
を立ち上げて下さい。それとも、このCleanスレと
目出度く合体!でも当方としては、全然問題ありません。
HakellとCleanは兄弟のようなもんですから(^^;
ttp://homepage3.nifty.com/Aransk/
0023デフォルトの名無しさんNGNG
>>17
ファイルの読込であれば、
こんな関数を作ればよい。
↓
Read :: File -> [Char] // ファイルから読み込んで文字リストを作る
Read f
# (b,ch,filerest) = sfreadc f
| not b = []
| otherwise = [ch : Read filerest]

要するにFile型の引数を操作すればいいだけ。
その前にsfopen関数当たりで関連付けるけどな。
0024デフォルトの名無しさんNGNG
で、実際13はどうなるんだ
0025デフォルトの名無しさんNGNG
>>22
せっかくリファレンスの日本語訳が出たんだから Python でもやってろ
0026デフォルトの名無しさんNGNG
いいからNGネームに追加しとけ
0027デフォルトの名無しさんNGNG
>>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));
}
0028 NGNG
今週末に考えるので気長に待ってろ。
0029 NGNG
といってもそれを変換するとは限らない。
0030デフォルトの名無しさんNGNG
haskell の新スレまだぁー?
0031デフォルトの名無しさんNGNG
まだ立ってなかったのか
0032AranskNGNG
新しいスレ立てんなら立てる。
Cleanと一緒ならそう宣言する。
どっちか早く決めてもらいたい!
ワタクシ、
言いたいことが山のように溜まっておるのです。
キミ,恐るることなかれ。(^^;)
ttp://homepage3.nifty.com/Aransk/
0033デフォルトの名無しさんNGNG
↑のアホがいないときに立てるよ
0034デフォルトの名無しさんNGNG
>>32
自分の名前でスレッド立てれば?
少しぐらいなら相手してあげてもいいよ
ただし場所は
http://pc.2ch.net/prog/
こっちでどうぞ。
0035デフォルトの名無しさんNGNG
>>32
お前が立てろよ
まあ直後にネタ板と化すだろうが
0036デフォルトの名無しさんNGNG
おまえら
あんま会話するな
0037デフォルトの名無しさんNGNG
なんで>>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


つづけて宜しゅうございますか?
0038デフォルトの名無しさんNGNG
もったいぶってどうするんだ?
ここは1が密かに努力するスレだと思うぞ
0039デフォルトの名無しさんNGNG
>>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はインデントがずれているので、適当に脳内補完しといてくれ。
0040デフォルトの名無しさんNGNG
いいぞがんがれ
0041デフォルトの名無しさんNGNG
ん?
俺は考えなくていいみたいだな。
0042デフォルトの名無しさんNGNG
>>41
>>37,>>39は長すぎる。>>17並になるよう考えてくれ。
0043AranskNGNG
>33〜36
ワタクシには、決して悪気が無いことは、良くお分かりの
くせに…(少し毒気はあるが、藁藁)
まあHaskellスレが立つことを気長にお待ちしましょう。
それまでは、このスレに居座りますので、悪しからず(^^;
ttp://homepage3.nifty.com/Aransk/
0044デフォルトの名無しさんNGNG
>>43
名無しで立てて後で「乙」とでも自演しておけばとりあえずはネタスレにならずに立つ
0045デフォルトの名無しさんNGNG
>>43みたいのを「構ってクン」ていうんですね.初めて見ました.
0046デフォルトの名無しさんNGNG
>>43
立ったぞ
早よ逝け
http://pc2.2ch.net/test/read.cgi/tech/1076418993/

…程々にな
0047AranskNGNG
>46
居心地が良さそうなんで、もう少し(微笑)
そう言えばCleanってさあ、普通にダウンロードすると
旧ヴァージョンしか出来なくない?
やはり金を払わないと最新版はダウンロードできないの?
ttp://homepage3.nifty.com/Aransk/
0048デフォルトの名無しさんNGNG
>>42
そう変わらん結果になると思うが、考えてはみよう。
0049AranskNGNG
CleanPjtを推進しているオランダの大学教授も
最近やる気を無くしているみたいね?
やっぱり、商売にならないとキツイんだ。
そりゃぁ、EclipseやJakartaPjtを無償で使っている
連中に売り込むのは、いかにもツライものがあるよねぇ。
ttp://homepage3.nifty.com/Aransk/

0050デフォルトの名無しさんNGNG
誰か Aransk タン専用スレ立てキボンヌ。
0051デフォルトの名無しさんNGNG
>>50
漏れがスレ立てられるようになるまで待ってろ。
関数型言語スレの住人は煽り耐性もdqn耐性も
弱いからな。
0052AranskNGNG
>50,51
でもCleanってさぁ。Haskellとは違って明らかに商用を
目指しているよねぇ?そのビジネスが成立するかどうかって
Cleanスレでは重要じゃないの?でないと
Clean言語自体が消えちゃうじゃんよぉ。
ttp://homepage3.nifty.com/Aransk/


0053デフォルトの名無しさんNGNG
こんなのが流行る気がしないな。
このスレでも一向にコード書く奴出てこないし。
Aransk、おまえここに居座るつもりなら
Cleanでなんかコード書いてみろよ。
0054デフォルトの名無しさんNGNG
元々はオランダの国家プロジェクトの副産物として登場したものなので、
商用を目指しているというのは正確ではない。
大学の研究用の材料にされているという方が正確だ。
0055AranskNGNG
>53
>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
商用ってば、Eiffelのシャチョさん、一昨年の日本のOOカンファレンスに招聘されてたけど
相変わらず精力的だったな。やっぱコンサルとか講演とか、別の収入があるからかw
0058デフォルトの名無しさんNGNG
どうする〜?
Eiffel?
0059デフォルトの名無しさんNGNG
Aransk 様の Clean 講座マダー
0060デフォルトの名無しさんNGNG
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)]
0061デフォルトの名無しさんNGNG
>>55
>Cleanの最新版は金を払わんとダウンロード出来ん。

英語のサイト巡りも禄に出来ない人は来ないで下さい。
006237の配列版NGNG
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 
006337の配列版続きNGNG
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
0064AranskNGNG
>61
1.3じゃなくて、2.1無償ダウンロード出来るの?
ttp://homepage3.nifty.com/Aransk/
0065デフォルトの名無しさんNGNG
Aransk 様が Clean に興味を持たれたようです。
0066デフォルトの名無しさんNGNG
>>64
ここにいるのは元号が大学名の学校出身ばかりだから、
得意の英語でMLに質問したら?

Cleanのメーリングリストのアーカイブ(Discussions )
http://www.cs.kun.nl/pipermail/clean-list/

0067デフォルトの名無しさんNGNG
明治のことかー!!
0068デフォルトの名無しさんNGNG
元禄大学
0069デフォルトの名無しさんNGNG
>>66
Aranskタンには無理だとわかっていてあえてそーゆう提案してるだろ?
0070デフォルトの名無しさんNGNG
Aranskタンは愛すべき糞コテになりました
そろそろ萌え擬人化します
0071AranskNGNG
>70
>Aranskタンは愛すべき
だよね?それがさぁ。
ttp://homepage3.nifty.com/Aransk/のMSGボードに
いつかは、来られるのではと、「密かに」期待はして
おりました。それが、な、なんと、本日7000通もの
大量、カキコがありました。大漁節!です。
お蔭様でMSG板はオシャカ!であります。(^^;
mild_server_super_lights先生を存知より
の方が、もし「2ちゃんねる」にも出入りされて
おられたら、是非、先生にお伝え願いたいのです。
Aranskは、またのお越しをお待ち申し上げて
おりますと。今度は、先生の弊HPに対する
ご意見なり、ご批判なりをご自由にお書き下さい。
但し、「多くても」10通以内にね。(大笑い)

0072デフォルトの名無しさんNGNG
((;゚Д゚))ガクガクブルブル ほ、本物?
0073デフォルトの名無しさんNGNG
Aranskたんの萌えエロ画像キボン
0074デフォルトの名無しさんNGNG
>>66
意味分からん
0075AranskNGNG
>72
>((;゚Д゚))ガクガクブルブル ほ、本物?
mild_server_super_lights先生って、2ちゃんねるでは
「そんなに」有名人なんでしょうか?(^^;
ttp://homepage3.nifty.com/Aransk/
0076デフォルトの名無しさんNGNG
いつの間にAranskだと認めたんだね.
0077AranskNGNG
>76
>いつの間にAranskだと認めたんだね.
もう随分以前から「ヒーロー勇気」や「名無し」を
使用せず、本名で発言しております。(^^;
でないと2ちゃんねるの雑誌に有名コテハンとして
掲載してくれないらしい?(大藁藁)
ttp://homepage3.nifty.com/Aransk/


0078デフォルトの名無しさんNGNG
Aranskは自分がなにか``特別''であると
思い込みたくてしょうがないらしい...

916 :デフォルトの名無しさん :03/12/31 09:02
>913
ム板だけではなく、上の中東情勢板でも結構暴れたらしい?(藁)
ム板と中東板を往復するのは、管理人だけなのにって
西村クンが嘆いていたそうな。
ところでヤフーの年間人気サイトで2ちゃんが表彰されていた。
まずはご同慶の至りです。
でも西村くんってちょっとヤバそうな顔してるね。
あの手の顔はいったん切れると無茶苦茶、恐いか、メッタメタ
オモロイ!かどちらかだな。(藁藁)

>ム板と中東板を往復するのは、管理人だけなのに
プッ,何言ってんの?
0079デフォルトの名無しさんNGNG
>>76,>>78
そっとしといてやれよ。第一Cleanと関係ないぞ。
0080AranskNGNG
>76,78
そうだぁ!Cleanに関係ない質問をするな!
(それに簡単に乗せられる奴も、問題ではある。(^^;)
Javaやその他言語の無償提供環境の中で
Cleanのような弱小言語がビジネスとして
成立するのか?また成立する「必要が」あるのか?
それを問いたい。(^^;
ttp://homepage3.nifty.com/Aransk/

0081デフォルトの名無しさんNGNG
>Javaやその他言語の無償提供環境の中で
>Cleanのような弱小言語がビジネスとして
>成立するのか?また成立する「必要が」あるの

「○○言語に関する質問」と「○○言語のスレがビジネスとして
成立するかどうかの議論」は別々のスレでやった方がいいと思う.
0082デフォルトの名無しさんNGNG
つか、それしかネタ無いんか?
0083デフォルトの名無しさんNGNG
Aransk って普段どんなプログラムを作ってるの?
0084デフォルトの名無しさんNGNG
>>80
最新版にこだわるけど
有料の最新版はダウンロード版とどこが違うの?
0085デフォルトの名無しさんNGNG
最新版

無料でダウンロード可能
登録も不要
ライセンスはLGPL

ttp://www.cs.kun.nl/~clean/Download/main/main.htm
0086AranskNGNG
>82
>つか、それしかネタ無いんか?
悪い。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は、非負の引数に適用されるものとする。
0088 NGNG
んじゃ、GUI版でも考えるかな。
今週末くらいを目途に。
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版NGNG
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
0091デフォルトの名無しさんNGNG
他のGUI版も作ろうかと思ったが、まんまマニュアルにある。
0092デフォルトの名無しさんNGNG
// 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
0093デフォルトの名無しさんNGNG
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))
009493NGNG
// 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]
0095デフォルトの名無しさんNGNG
CleanIDEのエディタに日本語入力すると文字化けする(´・ω・`)

それは別のエディタを使えば済む問題だけど、Cleanコンパイラのほうが
ダメ文字(2バイト目に0x5C(「\」記号)がある文字)に対応してないのはちょっと悲しい。

しょうがないからCleanIDEに日本語を直接入力してわざと文字化けさせて、
「\」記号が出てきたら、手入力で「\」記号をもう一つ追加して問題を回避してる。


ダメ文字って、Cleanのパーザをいじらないと対応できないのかな…
0096デフォルトの名無しさんNGNG
ASCII以外には全く対応してないのが現状。
UNICODE担当(?)の人は、なんか違うことやってるので期待できない。
0097デフォルトの名無しさんNGNG
>>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つの(==)は同じ関数である。したがって再帰的な定義である。
0098デフォルトの名無しさんNGNG
Genericの世界は濃いね。
0099デフォルトの名無しさんNGNG
Haskell、Clean辺りだとまだましなのかもしれないが、
関数型言語は思わぬパフォーマンス上の失策をやらかしてそうで怖い。
扱いきれない感がある。もっとクンフーを積まねば・・・。
0100100NGNG
記念くぁwせdrftgyふじこ
0101デフォルトの名無しさんNGNG
http://sky.zero.ad.jp/~zaa54437/programming/clean/LanguageReport20/Chap9.html
これのセクション4以降が意味不明、理解不能。
気にしないほうがいいのか?
・・・にしても静かなスレだね。
0102デフォルトの名無しさんNGNG
一意型付けって同じものは同時に二回以上簡約されない
って事であってる?
0103デフォルトの名無しさんNGNG
同時にという意味が分からん。
0104デフォルトの名無しさんNGNG
型一意性ってのはClean 独自の物なの?それとも最近の関数型言語の流行?
Clean以外で型一意性の考え方のある言語があれば教えてください。
0105デフォルトの名無しさんNGNG
ないといえばない
0106デフォルトの名無しさんNGNG
研究や論文はあったような
0107デフォルトの名無しさんNGNG
まとまったのはない
0108デフォルトの名無しさんNGNG
Cleanで書かれた正規表現やコード変換などの文字列処理ライブラリーはありまつか?
0109デフォルトの名無しさんNGNG
関数型言語スレでは余裕で無視されてますが、僕は気にしません。
コツコツ積み上げていきます。
0110デフォルトの名無しさんNGNG
型一意性について。
ふつうは参照透明性を確保するのに、データのコピーを作ってそいつを変更する必要があるけど、
もし変更後に変更前のデータを使わないことを保証できれば、元のデータはいらないから、わざわざコピーを作る必要もない。
つまり、データの破壊的更新を行っても参照透明性を維持できる。
ってことじゃないかと。
0111デフォルトの名無しさんNGNG
大体そだよ。
0112デフォルトの名無しさんNGNG
つか、グラフを使用した説明はわかりやすいと思うけれども。
0113デフォルトの名無しさんNGNG
せいうちん
0114名無しさん@そうだ選挙に行こうNGNG
kinnikuman 2 sei?
0115デフォルトの名無しさんNGNG
>>104
Mercuryという言語で使える。
http://www.cs.mu.oz.au/mercury

#Clean好きで来てみたら寂しいスレだ(′・ω・`)。
#現在Cleanの一意性型の論文読んるけどわかったようなわからんような。
0116デフォルトの名無しさんNGNG
Cleanで書かれたテトリスのソースはどこかにないでしょうか?
古いバージョンに付いていたそうですが、今のには無さそうなので・・
0117デフォルトの名無しさんNGNG
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)

はだめなのか。
0118デフォルトの名無しさんNGNG
>>117
MyIfについては、一意型の*Fileオブジェクトへの参照数が2になるのがエラーの原因のはず。
このあたりに説明があったと思う:http://sky.zero.ad.jp/~zaa54437/programming/clean/LanguageReport21/Chap9.html

ifは言語組み込みの機能だから、特別扱いだと思う。StdEnv探しても関数の定義がないし。
(_system.abcにifの定義らしき記述があるけど・・・読める人いたら解説きぼん)

言語組み込みのifに相当するMyIfは、通常の関数として書けないような気がするけど
実際のところはどうなんでしょうか>詳しい人
0119デフォルトの名無しさんNGNG
>>117
MyIf b t e =
| b = t
| otherwise = e
処理系が手元にないんで試せないけど、これでもダメかね?
tが評価される時はeがゴミなのでfileへの参照は1になると思うんだが。
0120デフォルトの名無しさんNGNG
要するにAlternativeに書けってことだな。
0121デフォルトの名無しさんNGNG
>>119
ダメですた。

つーか、
MyIf b t e = if b t e
でもダメ。
0122デフォルトの名無しさんNGNG
MyIf b (fwritec 'a' file) (fwritec 'b' file)の時点で、fileへの参照数が2だと認識されている模様。

まあMyIfを使わず、素直にガードで分岐すれば動作するんだけどね。
ガードやcaseなら、ちゃんとAlternativeだと見なしてくれる。
WriteAorB b file
| b = fwritec 'a' file
= fwritec 'b' file
0123デフォルトの名無しさんNGNG
なんかこの言語サンプル見ても意味不明なのがすごいです
構文が抽象化されすぎて余計わかりにくい感じがするのですが
0124デフォルトの名無しさんNGNG
コンピュータに量はおまかせを……
0125デフォルトの名無しさんNGNG
Haskellとあんま変わんないとおもうけど。
IOからまなきゃ
0126デフォルトの名無しさんNGNG
>>122
分岐(if, case, ガード)が陽に見えているところでしか
一意性解析していないということか。

MyIfが使えるようにするには、自分で型に一意性注釈を
書かなければならないのだろうが、分岐のような
「いくつかの引数のうちどれか一つしか評価しない」というような
ことを型レベルで表現するのは無理だから、やっぱできないのかな。
0127デフォルトの名無しさんNGNG
んなもんLISPみたいにquoteがないと作れるわけない
0128デフォルトの名無しさん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デフォルトの名無しさんNGNG
UNIX環境でつかってる人いる?
0130デフォルトの名無しさんNGNG
バイナリ版を試してみようとしたけど、xviewがないと動かない……。
面倒なのでその先はまだやってないっす。

FreeBSD で動かしたくてソースコードもダウンロードしたけど、アセンブリばっ
かしなのでかなり無理っぽい。っていうかどういう風にビルドすればいいのか
ぜんぜんわからない。
0131デフォルトの名無しさんNGNG
そんじゃ最初っから話にならないじゃん(w
0132デフォルトの名無しさんNGNG
開発環境込みの環境だからねえ。
GUI な開発環境なし版が欲しい。

ただ、普通の Linux とか Solaris なら動くんじゃないの?
0133デフォルトの名無しさんNGNG
コンソールでやるにはどうしたら良いんだ?ってのがMLで話題になってたな、随分前
0134デフォルトの名無しさんNGNG
さすがにこれを仕事で使う勇気のある奴はまだ日本にはいないだろうな
0135デフォルトの名無しさんNGNG
一応開発元は実用言語目指してるんだけどねぇ。
今開発って続いてるの?
0136デフォルトの名無しさんNGNG
開発というより研究は続いている
0137デフォルトの名無しさんNGNG
下のがエラーになる理由がわからん

Length :: [a] -> Int
Length = foldr (¥x -> (+) 1) 0
0138デフォルトの名無しさんNGNG
型が違うよー
Lengthは引数を持たず(アリティ0)、リスト[a]をIntに変換する関数を返すので

Length :: ([a] -> Int)

でたぶん通る。
0139デフォルトの名無しさんNGNG
>>138
おおサンクス
型が違ってたのか。Lengthの定義がおかしいのかと思ってたよ。

最近関数型言語の勉強はじめたんだが、楽しすぎるな。
「プログラミング言語は思考の増幅器である」って昔誰かが言ってたが
まさにそんな感じ。脳汁出まくりですよ
0140デフォルトの名無しさん05/01/21 19:21:00
新バージョンが出る予感
0141デフォルトの名無しさん05/03/15 21:08:05
http://www.cs.ru.nl/~clean/Recent_Latest_News/body_recent_latest_news.html
によると、一昨年の10月31日の 2.1.0 から更新されてない様だが、新しいのあるの?
0142デフォルトの名無しさん2005/05/06(金) 16:08:55
Clean I/O と Haskel monadic I/Oの違いを教えてください。
0143デフォルトの名無しさん2005/05/14(土) 00:12:25
唐揚げ
0144デフォルトの名無しさん2005/05/14(土) 00:12:59
唐揚げ
0145デフォルトの名無しさん2005/07/16(土) 14:20:22
新バージョン出てるよ
0146 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
0147デフォルトの名無しさん2005/07/19(火) 08:33:13
ここもdylanスレぐらい寂れてんな
Cleanが話題にならない理由として考えられるのは
基本概念が複雑なことだな
異質すぎて何が効率よいとかが判断できない
0148デフォルトの名無しさん2005/07/19(火) 12:46:18
複雑じゃないよ、異質ではあるが
0149デフォルトの名無しさん2005/07/19(火) 20:25:19
どうでも良い事かもしれんが、ダウンロードにレジストレーションが必要なのは面倒。
ライセンスも分かりにくい。自分が書いたコードはライセンス汚染を受けるの?
0150デフォルトの名無しさん2005/07/19(火) 20:48:23
>>149
非商用の場合はLGPL、商用の場合は要問合せ。
そもそも、registしなくてもダウンロードできるし。
0151デフォルトの名無しさん2005/07/19(火) 21:15:51
>>150
static なライブラリを作るのか知りたかったんだけど、レジスト不要なら自分で試してみます。
サンクス。

static でもソース公開の義務がないのは知ってるけど、ちょっと面倒だね。
0152デフォルトの名無しさん2005/07/20(水) 20:33:06
>>148
異質ってことは、複雑かどうかもわからんてことよw
難解だよな
0153デフォルトの名無しさん2005/08/06(土) 12:24:17
Concurrent Clean 日本語化プロジェクト 期待あげ
ttp://www.geocities.jp/lethevert/softwares/clean/localize.html
0154デフォルトの名無しさん2005/08/06(土) 12:52:50
ここ見てるか知らないけど
がんばれよー
0155デフォルトの名無しさん2005/08/06(土) 19:36:04
GUIライブラリまで揃ってるのに…もう少し人気出ないもんかね
0156デフォルトの名無しさん2005/08/06(土) 20:14:56
人気が出る要素がまるでないからな
0157デフォルトの名無しさん2005/08/07(日) 00:09:29
せめてHaskell程度には…
0158デフォルトの名無しさん2005/08/07(日) 14:50:44
ベンチマークとか
他言語とのコードの比較表とか
そういったもので優位性というか、
どんだけ違うか示していくというのはどうか
0159デフォルトの名無しさん2005/08/08(月) 14:13:59
>>156
( ´_ゝ`)フーン
「まるでない」と言い切れるほど詳しくご存知なんですね。
0160デフォルトの名無しさん2005/08/10(水) 23:11:26
たぶんClean理解してる奴日本全国数えても20人いなさそう。
0161デフォルトの名無しさん2005/08/25(木) 21:50:11
Linuxでやってみました。
CUIは問題無く動きました。
GUIはXView無しでもWINE使って、
Hello World 程度を動かせました。
Wineでもいいから一通り動いて、
1.3のlibraryも使えて、
Emacsのclean-modeがhaskell-mode並に使えれば…と思います。
0162勉強中2005/09/07(水) 22:28:59
HaskellよりCleanの方が有望に見える。
0163デフォルトの名無しさん2005/09/07(水) 23:42:54
>>162
詳しく
0164デフォルトの名無しさん2005/09/08(木) 00:11:17
土方プログラマやりながら勉強してるから、
勉強終わるまでちょっとまって。
0165デフォルトの名無しさん2005/09/11(日) 21:05:30
Haskellはコンパイル遅杉
0166名無しさん@そうだ選挙に行こう2005/09/11(日) 23:03:09
>>165
ここはCleanのスレですが
0167デフォルトの名無しさん2005/09/23(金) 10:59:05
Clean は完璧主義のデレツン言語。
Haskell は他言語で1文字でも短く書けるコードがありましたら、
お申し出下さい言語。
0168デフォルトの名無しさん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])]) +++""
0169デフォルトの名無しさん2005/09/25(日) 04:14:55
意味不明度120%言語
0170デフォルトの名無しさん2005/09/25(日) 18:29:33
>>169
言語のせいにするなって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:48
Cleanの編集モードだけど clean-mode より haskell-modeの方が書きやすいと思った。
0173デフォルトの名無しさん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
0174デフォルトの名無しさん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
0175デフォルトの名無しさん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)) +++ ";"
0176デフォルトの名無しさん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
//これを動かしたい人はいろいろ組合わせて下さい。
// *組*を作成しなければ、無駄なメモリ消費量を抑えられるはず。
0177デフォルトの名無しさん2005/10/03(月) 21:42:37
>>176
*組* ってちょっと…
「タプル」でいいんじゃない?
0178デフォルトの名無しさん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に翻訳とかやるかも。では、さよーなら。
0179デフォルトの名無しさん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
0180デフォルトの名無しさん2005/10/09(日) 08:26:13
先生!質問です。
この言語には整数は32bitしかないのでしょうか?64bitは無し?
0181デフォルトの名無しさん2005/10/09(日) 09:29:44
せっかくnon-strict関数型言語の標準をhaskellとして定めたのに、方言を作りやがって……
これじゃMLと同じ轍を踏むことになるじゃないか

とSPJが言ってました。
0182勉強中の人2005/10/09(日) 14:37:00
>>180
windows版で BigInt、Rational, Complexのライブラリはあるようです。

>>181
バートランド・ラッセルが
「宗教の数は時代の遷移に共なって、指数関数的(対数だったっけ?)に変化する」
とか言ったのに似て、プログラミング言語も人間の頭の中からできたものだから、
ある程度分裂する感じがする。(指数関数的 1- e^(-n*x))
最適化問題として捉えても、研究者じゃない人間が遊んだり、
一部の研究者が触っても問題ないどころか良い事だと思うし。
Privateで工学・政治的な理由に付き合う理由はあまりないと思う。

モナドで包まれない状態が生で触れるためCleanはhaskellの勉強になる。
ただ、generic も モナド もよくわかってないが、
モナドの方が良くできてる感じがする。
他にも hasktags はあるけど、 cleantags はないとかかなり不便。

ちなみに、SPJとか知らんですよ。
01831802005/10/10(月) 05:33:09
>>182
ありがとうございます。
日本語使えるよう頑張ってるヒトいるみたいだし勉強してみようかなぁ...


> ちなみに、SPJとか知らんですよ。 
Simon Peyton-Jonesさんではないかと。Glasgow Haskellの中のヒトかと。
0184デフォルトの名無しさん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
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:37
Linux版でfopenしてもファイルが生成されない。恐いw
readはできたが。
0187勉強中の人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 とかにも向いてると思う。(配列以外は)
0188デフォルトの名無しさん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
0189デフォルトの名無しさん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
0190デフォルトの名無しさん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 のマニュアルも使えるかもしれない。
0191デフォルトの名無しさん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}
0192デフォルトの名無しさん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
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: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}
0196デフォルトの名無しさん2005/11/05(土) 08:15:35
一度書いてしまうと、急にはやめられないのでした。

Clean のゲームライブラリとかも結構強力ですね。
ゲームというより、ゲーム的な操作性・表現力を持つ物と考えれば幅は広がります。
Charlie が二週間でできたとのことです。
パフォーマンスが問題なければ実用にも。

…自分だけが書いていることには問題がありますが。
0197デフォルトの名無しさん2005/11/16(水) 00:17:45
最近ようやくgenericがわかりました。
haskellにも Generic Haskell なんてのがあるんだな。
0198デフォルトの名無しさん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 の方がいいと思うんだが。
0199デフォルトの名無しさん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"
0200デフォルトの名無しさん2005/11/30(水) 20:36:55
200000000000000
0201デフォルトの名無しさん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
と言わず一言どうぞ
0202デフォルトの名無しさん2005/12/01(木) 23:42:59
Ocamlを調べてみるとgenericなしで
型クラスもない。
普通のオブジェクト指向はあるみたい。

………使いたくなくなった。
0203デフォルトの名無しさん2005/12/02(金) 05:45:07
Cleanをあまりよく知らないので関数型言語一般の話寄りになってしまいますが、
COMだとかActiveXだとかの外部のコンテナを扱いたい際は
データの副作用は純粋関数型言語ではどういった扱いになるんでしょうか?
0204デフォルトの名無しさん2005/12/02(金) 21:20:09
>>203
ここは参考になるかな?
http://www.haskell.org/hdirect/
0205デフォルトの名無しさん2005/12/02(金) 23:16:49
cleanではwrapper関数とか作ったり、一意ポインタを使ったりする。htoclean周辺参考

あまり実用ではない。
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
遊び。 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)

0208デフォルトの名無しさん2005/12/15(木) 03:31:03
抜け落ち部分

downcase :: !String -> String
downcase str = {toLower x\\x<-:str}
0209デフォルトの名無しさん2005/12/15(木) 09:35:19
>207
Cleanはよく知らない俺がHaskellで書いてみましたよ。

import System.Environment
main = getArgs >>= mapM_ (putStr . map downcase . readFile)

0210デフォルトの名無しさん2005/12/15(木) 09:38:57
あ、しまった。 Haskell にも別に downcase はなかった。
import Data.Char
した上で
map toLower
だった。
0211デフォルトの名無しさん2005/12/15(木) 09:42:13
あー mapM_ の引数もおかしいし。
(\ fname -> readFile fname >>= putStr . map toLower)
ですかね
0212デフォルトの名無しさん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)
0213デフォルトの名無しさん2005/12/17(土) 01:05:21
個人的な意見だけど、確かに陽に無名関数を使わない方が簡潔になる場合も多
いが、しかし、あるものを使わないのは馬鹿げていると思う。

ところでこの mapM_ の引数だと、
((>>= putStr . map toLower) . readFile)
と書ける。
その方が綺麗だと思うかどうかは人によると思うが、個人的にはどちらにせよ
新しい演算子を作るほどではない気がする。
0214デフォルトの名無しさん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
0215デフォルトの名無しさん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
0216デフォルトの名無しさん2005/12/31(土) 00:19:12
同じような関数を書かないでいいようにライブラリを公開してみました。
home1.tigers-net.com/~th003751/
0217デフォルトの名無しさん2006/01/03(火) 21:07:29
今年一番伸びる言語
0218デフォルトの名無しさん2006/01/15(日) 01:13:42
本家が過疎化してるように見えるが・・・
0219デフォルトの名無しさん2006/01/15(日) 12:32:23
自分は学問としては触ってないのだけど、
論文の発表すら過疎ってるの?
0220デフォルトの名無しさん2006/01/15(日) 13:05:57
CleanってIDE内でないとコンパイルができない?
VBみたいでイヤンなんだけど・・・。
0221デフォルトの名無しさん2006/01/15(日) 20:06:28
Concurrent Cleanの「Concurrent」って、並列のConcurrent?
コードに自分でスレッド関連の事をなんも書かないで、
普通に書くだけで、マルチCPUやマルチコアをフル活用して並列処理してくれるの?
0222デフォルトの名無しさん2006/01/15(日) 21:55:30
俺も前から気になってたが、本家の方はConcurrent抜きのただのCleanしかないような。
0223デフォルトの名無しさん2006/01/15(日) 22:01:20
>>221-222
これか?
ttp://mailman.science.ru.nl/pipermail/clean-list/2003/002485.html
0224デフォルトの名無しさん2006/01/15(日) 22:07:44
あまり古傷をえぐらないように
02252212006/01/16(月) 00:42:19
>>223
�d。

> we dropped the feature due to lack off parallel machines.
なんとショボイ理由w(つうか言い訳?)。
1990年代後半なら個人でもデュアルCPUマシン位所有できただろ。
つうか俺実際"Dualon"使ってたし。って違うのか?

あと、プロセス単位だったような説明だが、
言語が本質的に並列性を備えてるならスレッドで良いじゃん。
マルチコア時代に向けて復活させろよ。
0226デフォルトの名無しさん2006/01/17(火) 00:54:01
>>220
linuxならclmでCUIコンパイルができるよ。
windows だと, CleanIDE.exe --batch-build <FULL path to project>
なんてできるらしいけど、成功しなかった。
02272262006/01/17(火) 00:58:36
full pathでやったら成功したorz
>>220サンクス
0228デフォルトの名無しさん2006/03/08(水) 22:40:20
Clean のページが変わってますね。
といっても、変更先もアクセス不能ですが。

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:02
dekiruyo
0231デフォルトの名無しさん2006/04/22(土) 21:40:48
CleanってHaskellよりもよさそうなのに人気ないね
欠点でもあるん?
02322312006/04/24(月) 03:37:56
Cleanを勉強中。
分かりやすい日本語のチュートリアルがあるのがいいね。
Haskellはわけ分からん。
Cleanを気に入った人間はここにもいるぞってことで、足跡を残しておく。

しかし、他スレでHaskellの欠点をCleanなら解決できるって書き込みがあるが、
見事にスルーされてるね。
Cleanを気に入った人間としては悲しい限りだ。
0233デフォルトの名無しさん2006/04/24(月) 14:12:26
> 分かりやすい日本語のチュートリアル
どこすか?
0234デフォルトの名無しさん2006/04/24(月) 14:28:26
http://www.geocities.jp/lethevert/softwares/clean/
のことかな?
sky.zero.ad.jp のやつはわかりづらいと思うが……
0235デフォルトの名無しさん2006/04/24(月) 17:51:20
>>234
おおそこか thanx
0236デフォルトの名無しさん2006/04/28(金) 21:08:19
>>232
haskellの欠点を回避といっても
表面的なもの・・・
というか、環境変数を変更できないだけ。

また、cから配列で情報を得ようとする場合は、副作用を生じるし、
それによってうまくいかない場合があるかもしれない。
配列が使えないっていうのは文字列も副作用なしでは使えないってこと。

class とかも 型ClassのList を 引数?に取れないで
(List a)にしなきゃいけない
とかいろいろ欠点はあると思う。
0237デフォルトの名無しさん2006/05/04(木) 16:20:52
C
0238デフォルトの名無しさん2006/05/21(日) 16:27:05
L
0239デフォルトの名無しさん2006/05/21(日) 18:18:32
Haskellの本でてるね。Cleanもでないかなあ
0240デフォルトの名無しさん2006/05/21(日) 21:16:40
誰かが書かなきゃ出ないわな
0241デフォルトの名無しさん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))
0242デフォルトの名無しさん2006/06/21(水) 16:52:28
age
0243デフォルトの名無しさん2006/06/21(水) 17:58:35
Haskell でも止まらないと思うし、 amount が負値になったら止まらなくなると思うんだけど。
02442412006/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)
0245デフォルトの名無しさん2006/10/09(月) 08:44:38
ohayo karaage
0246デフォルトの名無しさん2006/12/04(月) 23:17:51
hosyu
0247デフォルトの名無しさん2006/12/20(水) 05:05:32
2.2 出た
0248デフォルトの名無しさん2006/12/20(水) 20:10:15
午前5時5分ですか。。。
0249デフォルトの名無しさん2007/01/27(土) 22:06:10
よくわからんのだが、これって分散計算とかサポートしてるの?
0250デフォルトの名無しさん2007/01/27(土) 22:21:38
Intel Mac には対応してないの?
0251デフォルトの名無しさん2007/03/06(火) 00:15:44
中野豚子 フジテレビ 中野美奈子 噛み過ぎ ブタ ブス
0252デフォルトの名無しさん2007/03/26(月) 20:43:42
あげ
0253デフォルトの名無しさん2007/05/14(月) 17:29:51
hosh
0254デフォルトの名無しさん2007/05/17(木) 21:39:26
FreeBSDのcompat/linuxな環境で動かせますか?
0255デフォルトの名無しさん2007/05/17(木) 21:40:06
あげてみるdesu
0256デフォルトの名無しさん2007/05/17(木) 22:19:30
この言語もう終わりだろ・・普通に考えて。
更新なんかもう2年もされてないし。
0257デフォルトの名無しさん2007/05/17(木) 22:22:25
Cleanの成果はすべてHaskellに取り込まれてるから、これからCleanさわろうとする人はHaskellをやった方が将来性あると思うよ。
っていうか、Haskellは研究用としてすでにデフォルトだから新しい研究成果はほとんどHaskellに組み込まれるよ。
0258デフォルトの名無しさん2007/05/17(木) 23:23:31
>>257
>Cleanの成果はすべてHaskellに取り込まれてるから、

Haskell はマクロも無いし、変数に代入出来ないでしょ。
しかも将来性だって嵩が知れてるがな。
Haskell は嫌いじゃないけど、Haskell 信者は嫌いだ。
0259デフォルトの名無しさん2007/05/17(木) 23:29:06
>>258
信者じゃねーよ
俺もHaskellは使いにくいと思ってるが、それはおいといて・・
変数はあるよ。IORefモナドとか。
でも、こういうものはなるべくなくすべきだというのが一般的な見解。
マクロは成果でも何でもないと思う。
0260デフォルトの名無しさん2007/05/17(木) 23:30:00
あと、「将来性」というのは関数型言語陣営の将来性という意味で。
0261デフォルトの名無しさん2007/05/17(木) 23:36:41
流行物に付いて行こうとするなら最初から Clean なんて興味持たないと思うけどね。
0262デフォルトの名無しさん2007/05/18(金) 01:18:47
将来性で関数型選ぶ自体がミーハーだからな
0263デフォルトの名無しさん2007/05/18(金) 01:20:21
>>261
むしろ、流行好きだから、一時期Cleanに興味持つのでは?
お、今度はこんな言語でてきたかーって。
で、流行がすぎさった、と。
0264デフォルトの名無しさん2007/05/18(金) 06:06:58
IORef モナドって、一旦複製を作って、
一定の領域内でその複製を値を変えることができる、
という認識でいいのかな?
純粋な変数とは言いがたいようなそうでないような。
0265デフォルトの名無しさん2007/05/18(金) 19:25:19
> この言語もう終わりだろ・・普通に考えて。
> 更新なんかもう2年もされてないし。

そうなの?
モナドつかわなくて良くて
速いっていう夢の言語かと思ったのに
0266デフォルトの名無しさん2007/06/15(金) 18:11:33
2年前に完成したんだよ!
02672652007/06/21(木) 20:58:01
> 2年前に完成したんだよ!

なるほど! djbメソッド
0268デフォルトの名無しさん2007/06/24(日) 00:00:18
>モナドつかわなくて良くて
>速いっていう夢の言語かと思ったのに
ocamlでも使え
0269デフォルトの名無しさん2007/06/24(日) 00:04:48
OCaml は見た目が汚いから嫌
0270デフォルトの名無しさん2007/06/24(日) 02:45:52
どこが汚いんですか
あなたのまんこですか
0271デフォルトの名無しさん2007/06/24(日) 13:44:23
セミコロン多用する所が気持ち悪い
0272デフォルトの名無しさん2007/06/24(日) 14:38:48
;; は確かにくどいな。
0273デフォルトの名無しさん2007/06/24(日) 14:46:30
確かリストの区切りも ; じゃなかったっけ?
節操が無いよな。
0274デフォルトの名無しさん2007/06/24(日) 16:15:35
>>272
それ別に書かなくても良くなったんだぜ
0275デフォルトの名無しさん2007/06/24(日) 16:31:42
そうなのか
0276デフォルトの名無しさん2007/06/24(日) 16:38:17
セミコロン無しで、文の区切りはどうするの?
0277デフォルトの名無しさん2007/08/15(水) 19:42:22
fcloseするのが面倒だから、withFileとか作ろうかと思ったんだけど、できねー
Haskellだと簡単に作れるのに
やっぱり、一意性よりもモナドの方が優れてるってことだね
0278デフォルトの名無しさん2007/08/17(金) 03:08:37
// cleanでも余裕でこんなコードは書けるがな。 ただし...
module x
import MyHakell
Start w = main w where main = readFile "c:/a.txt" >>= print
0279デフォルトの名無しさん2007/11/24(土) 10:37:07
つい、昨日Cleanを知ったばかりだがこのスレ大分過疎ってるね・・・。
0280デフォルトの名無しさん2007/11/25(日) 04:07:13
Clean 2.2 っていつ出たの?
0281デフォルトの名無しさん2007/12/18(火) 00:34:32
掃除などせずに、はすければいいんだよ。
0282デフォルトの名無しさん2008/04/12(土) 09:24:50
age
0283デフォルトの名無しさん2008/10/21(火) 01:44:15
今年ひとつしかレスねえじゃんw
しかしIDEがあるのは良いけど、
コマンドラインで一通りできるようにしてくれんとなあ。
こういうのはただですら利用者いないんだから
もっとunix系に媚び売らんと誰も使わんってのw

0284デフォルトの名無しさん2009/03/24(火) 04:48:43
浮上
0285デフォルトの名無しさん2009/03/26(木) 03:39:29
>>283
MLでもCleanは死んだ?なんて話題が出る位だしなぁ(汗。

つか学会の告知SPAMばっかで……
0286デフォルトの名無しさん2009/03/30(月) 03:14:51
haskellよか春香に実用的
0287デフォルトの名無しさん2009/03/31(火) 00:33:11
OCamlはだめっすか?
0288デフォルトの名無しさん2009/03/31(火) 14:34:19
cleanはhaskellに取り込まれました
0289デフォルトの名無しさん2009/03/31(火) 22:50:43
haskell はここ暫く concurrent に注力してるからな…
STM とか VM の改修とか

Haskell に無くて Clean の良い所って参照透明性を確保しつつ
破壊的な操作が出来る所じゃなかったっけ?
0290デフォルトの名無しさん2009/04/01(水) 13:03:15
つ achp2007-CleanHaskellQuickGuide.pdf
0291デフォルトの名無しさん2009/04/06(月) 04:02:06
そうかなあ
0292デフォルトの名無しさん2009/04/13(月) 03:23:26
cyclic structureが扱えると書いてあるけど、
Javaで言えば

class A {
A a;
}

のようなことができるということですか?
こういう使い方ができるなら使ってみたいのだけど、
どう書けばいいか説明してある資料が見つからないorz
02932922009/04/13(月) 03:24:59
間違って上げてしまった。。
わざとらしいかもですが、わざとではないです。
逝きます。

02942922009/04/21(火) 21:14:57
色々調べていて以下のコードに辿り着きました。
Haskellですが、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:36
Clean の情報探してたんだけれど、ここくるまで Concurent Clean が Clean に変わった事が判らなくて難儀したぜ。
0296デフォルトの名無しさん2010/10/14(木) 17:45:31
age
0297デフォルトの名無しさん2011/01/04(火) 15:42:34
test
0298デフォルトの名無しさん2011/05/10(火) 19:46:20.90
@functional2ch に監視されているか確認してみる
0299デフォルトの名無しさん2011/05/18(水) 16:11:12.67
>>295->>297
激動の一年過ぎて吹いた
0300デフォルトの名無しさん2011/05/19(木) 21:57:04.47
名前が悪いわ
0301デフォルトの名無しさん2011/05/25(水) 13:52:16.77
<●><●>
0302デフォルトの名無しさん2011/07/09(土) 22:29:39.34
勉強会とかあったらしいけど
0303デフォルトの名無しさん2011/07/10(日) 15:51:21.24
公式のトップが、2010/7からwikiに転送されてるな
http://wiki.clean.cs.ru.nl/Clean
0304デフォルトの名無しさん2011/08/31(水) 12:46:39.63
また勉強会とかやるらしいけど
0305デフォルトの名無しさん2011/12/24(土) 00:33:27.82
静岡のほう?
0306デフォルトの名無しさん2011/12/29(木) 18:57:20.72
2.4が出たな
0307デフォルトの名無しさん2012/01/27(金) 05:58:22.01
はじめてのClean
0308デフォルトの名無しさん2012/02/21(火) 02:39:23.57
Clean Coder
ttp://www.amazon.co.jp/dp/4048860690
0309デフォルトの名無しさん2012/02/21(火) 08:25:35.92
いやいやいやw
■ このスレッドは過去ログ倉庫に格納されています