1 名前:デフォルトの名無しさん [04/02/01 18:55] 純粋関数型言語Cleanに関するスレッドです。 関数型には珍しくIDEと、IO,Gameライブラリが標準でついてきます。 関連リンク 本家 www.cs.kun.nl/~clean/ 日本語ドキュメントなど sky.zero.ad.jp/~zaa54437/programming/clean/
196 名前:デフォルトの名無しさん mailto:sage [2005/11/05(土) 08:15:35 ] 一度書いてしまうと、急にはやめられないのでした。 Clean のゲームライブラリとかも結構強力ですね。 ゲームというより、ゲーム的な操作性・表現力を持つ物と考えれば幅は広がります。 Charlie が二週間でできたとのことです。 パフォーマンスが問題なければ実用にも。 …自分だけが書いていることには問題がありますが。
197 名前:デフォルトの名無しさん mailto:sage [2005/11/16(水) 00:17:45 ] 最近ようやくgenericがわかりました。 haskellにも Generic Haskell なんてのがあるんだな。
198 名前:デフォルトの名無しさん mailto:sage [2005/11/27(日) 20:34:15 ] Cleanについて加筆 ・産業指向であるため、活発な開発が行なわれない。(投資額が少ない場合) ・GUI や TCP などの関数型の苦手な部分こそ自前で持つという 新しい物を産みだすための良い哲学を持っている。 取り敢えず動く(CleanIDE や sample プログラムが動いている)。 ・実行速度は安定しない (OS・ほんのちょっとのコードの変化で変わる) が2倍速いマシンを買えば他より速くなるので問題ない ・前も書いたけどライブラリはほとんど無い。というか 有用なライブラリが美しく書けないのかもしれない。 Haskellでは Tree 等の複合的な型クラス に対する型クラスが書けるがCleanでは書けない。 class x1 a :: a -> a class x2 a b :: (a b) -> (a b) が別クラスになる。 または instance x1 Class1ElementXYZ のようにインスタンスの数だけinstanceが必要だ。 ・タイムプロファイラーとか簡単に使えて便利だ。 >>195 のコードについて 意味的には TestDataはコピーされ * TestDataになるっぽい。(ただしメモリ上ではコピーではない) これと似たようなことを配列でやっても失敗する。(コーピーされる場面もあるようだ) 言語的には OCaml よりは Clean の方がいいと思うんだが。
199 名前:デフォルトの名無しさん [2005/11/28(月) 00:54:27 ] 書き忘れ、 一意配列について lp :: *x a -> *(a , *x) | dup, f, end x // dup 架空の 複製関数 lp x y # (x , x2) = dup x # end x2 = (y , x) # lp x (f x2 y) dup で 複製した領域は再利用されなかった。されれば実装上fが一つに決まり楽になる。 //連想配列書いてみる。lookupはdynamic使ったりMaybeを使わないから実装多い assoc e [] = Nothing assoc e [x=:(a,b):xs] | a == e = Just x = assoc e xs (%|%) infixl 9 :: (Maybe a) a -> a (%|%) Nothing y = y (%|%) (Just x) _ = x assocx x alist :== (@) infix 9 :: [(!String,!a)] !String ->a (@) alist x = snd (assoc x alist %|% (abort ("assoc not match " +++ x))) (:-) infixl 9 :: a b -> (a,b) (:-) a b = (a,b) al1 = ["test":-"test2","test2":-"test3","test3":-"test4"] al2 = ["key1" :- ("key2", al1),"key3" :- ("key4", al1)] Start#(str2, alist) = al2@"key1" = str2 +++ alist@"test"
200 名前:デフォルトの名無しさん mailto:sage [2005/11/30(水) 20:36:55 ] 200000000000000
201 名前:デフォルトの名無しさん mailto:sage [2005/12/01(木) 23:16:38 ] >>199 訂正 // 連想配列 ではなく 連想リスト (@) infixl 9 :: [(!String,!a)] !String ->a // infixlでないと ["key1":-["key2":-"val1"]]@"key1"@"key2" ができない x@"test"@"test2" って見ても何が何だかわからないけど。 :: X2 = {test2::String} :: X = {test::{#X2}} x = {test={test2="val1"}} Start = x.test.test2 // test , test2 は symbol nameとして出力できない // また、リストは無限を含むこともできる >>200 200000000000000 と言わず一言どうぞ
202 名前:デフォルトの名無しさん [2005/12/01(木) 23:42:59 ] Ocamlを調べてみるとgenericなしで 型クラスもない。 普通のオブジェクト指向はあるみたい。 ………使いたくなくなった。
203 名前:デフォルトの名無しさん mailto:sage [2005/12/02(金) 05:45:07 ] Cleanをあまりよく知らないので関数型言語一般の話寄りになってしまいますが、 COMだとかActiveXだとかの外部のコンテナを扱いたい際は データの副作用は純粋関数型言語ではどういった扱いになるんでしょうか?
204 名前:デフォルトの名無しさん mailto:sage [2005/12/02(金) 21:20:09 ] >>203 ここは参考になるかな? www.haskell.org/hdirect/
205 名前:デフォルトの名無しさん mailto:sage [2005/12/02(金) 23:16:49 ] cleanではwrapper関数とか作ったり、一意ポインタを使ったりする。htoclean周辺参考 あまり実用ではない。
206 名前:デフォルトの名無しさん mailto:sage [2005/12/09(金) 01:18:06 ] 一部語弊あり >>198 > Haskellでは Tree 等の複合的な型クラス に対する型クラスが書けるがCleanでは書けない。 > class x1 a :: a -> a > class x2 a b :: (a b) -> (a b) > が別クラスになる。 > または instance x1 Class1ElementXYZ のようにインスタンスの数だけinstanceが必要だ。 arrayCopyRange:: !*(a e) !*(a e) !Int !Int -> *(!*(a e) , !*(a e)) | Array a e arrayCopyRange x=:{[i]=xi} y i j | i > j = (x,y) = arrayCopyRange x {y&[i]=xi} (i+1) j ちょっと面倒だが一応?書ける 一意性伝播がよくわからない。(エラーメッセージが…) ** 面白そうなファイル ** StdOverloadedList special なんてのがある
207 名前:デフォルトの名無しさん mailto:sage [2005/12/15(木) 03:29:16 ] 遊び。 Haskell で書くとどうなるでしょうか? //省略 readFile :: !String *World -> *([String],*World) (<&|>) infixr 6 (<&|>) p1 p2 :== \x w= (\(y,ww)=(p2 y,ww)) (p1 x w) a2l a = [e \\ e <-: a] // uMap 既にありそう uMap :: (a *w-> *(b, *w)) [a] *w -> *([b], *w) uMap f [] w = ( [],w) uMap f [x:xs] w # (v , w) = f x w # (vs , w) = uMap f xs w = ([v:vs], w) Start :: *World -> [[String]] Start w =fst (uMap (readFile <&|> (map downcase)) (tl (a2l getCommandLine)) w)
208 名前:デフォルトの名無しさん mailto:sage [2005/12/15(木) 03:31:03 ] 抜け落ち部分 downcase :: !String -> String downcase str = {toLower x\\x<-:str}
209 名前:デフォルトの名無しさん mailto:sage [2005/12/15(木) 09:35:19 ] >207 Cleanはよく知らない俺がHaskellで書いてみましたよ。 import System.Environment main = getArgs >>= mapM_ (putStr . map downcase . readFile)
210 名前:デフォルトの名無しさん mailto:sage [2005/12/15(木) 09:38:57 ] あ、しまった。 Haskell にも別に downcase はなかった。 import Data.Char した上で map toLower だった。
211 名前:デフォルトの名無しさん mailto:sage [2005/12/15(木) 09:42:13 ] あー mapM_ の引数もおかしいし。 (\ fname -> readFile fname >>= putStr . map toLower) ですかね
212 名前:デフォルトの名無しさん mailto:sage [2005/12/15(木) 20:45:16 ] LISPスレにIO関係の簡単なプログラムの例みたいなのがあったので ちょっと変形してでもいいから Cleanで書いてみたんですが…適当過ぎました。 目標は以下の通り (Haskellはあまり良くはわかってません) ・モナドの持ち上げ(ここがわかってない)が必要そうな場所でも コンビネータで繋げられる ・ m >>= (\ v -> f v) のようにλを明示的に書かない(無駄を省く & LISPより簡潔に) 僕が書いた >>188 readFile と HaskellのreadFileは違うのでご注意。 >>209-211 ありがとうございます。 compileすらできなかったので助かりマックス。 Haskellなら超簡単に書けますね。 import Data.Char import System.Environment main = getArgs >>= mapM_ (\ fname -> readFile fname >>= putStr . map toLower) infixr 6 >>>= (>>>=) p1 p2 = \x -> p1 x >>= p2 --main = getArgs >>= mapM_ (readFile >>>= putStr . map toLower)
213 名前:デフォルトの名無しさん mailto:sage [2005/12/17(土) 01:05:21 ] 個人的な意見だけど、確かに陽に無名関数を使わない方が簡潔になる場合も多 いが、しかし、あるものを使わないのは馬鹿げていると思う。 ところでこの mapM_ の引数だと、 ((>>= putStr . map toLower) . readFile) と書ける。 その方が綺麗だと思うかどうかは人によると思うが、個人的にはどちらにせよ 新しい演算子を作るほどではない気がする。
214 名前:デフォルトの名無しさん mailto:sage [2005/12/17(土) 16:28:11 ] >>213 確かにそうですね。 中間演算子が便利そうだったので何も考えずに使った感はあります。 1. 手続き的にプログラムをしたい場合には素直にdoを使う。 (無駄が多いように見える) 2. 関数型で無駄を省きたいなら >>213 のように書く 3. 1で無駄を省くなら (a 匿名関数を用いる) か (b 新しい演算子を用いる)。 自分一人なら3.bで書くのも悪いかもしれませんが、そうでなければ2又は3.a番が妥当かもしれません。 また、2で書けるのに3.bで書くとコンパイルに通すのが目的になって無駄が生じる可能性があるとも思いました。 あと、こんなのを見つけました ttp://pub.cozmixng.org/~the-rwiki/rw-cgi.rb?cmd=view;name=%3E%3E%3D+%A4%C7%B7%D2%A4%B4%A4%A6%A5%D1%A5%A4%A5%D7%A5%E9%A5%A4%A5%F3
215 名前:デフォルトの名無しさん mailto:sage [2005/12/18(日) 15:50:07 ] もしかして、最近Cleanユーザ増えてますか? そうであれば、僕の独り言状態になってるのでそろそろ終了しようかと思います。 N体問題 ttp://shootout.alioth.debian.org/benchmark.php?test=nbody&lang=clean&id=0 (特徴 :: 一意構造体の一意配列がある。*{*Planet}) 改良したら 188行 が 100行位? // 実質部分40行位 (型・データ宣言・ライブラリ化されてもよさそうな関数等を除く) になりました。実行速度重視版(+3行程度)で Cの2倍時間が書かる程度 (1.5倍改善 windowsで実装中)。 この *{*Planet}の *Planet部分を更新するため dummy::{*Planet} を常に持ち運ぶ必要があります。 結果としてかなり綺麗に書けましたが大変でした。 実際にコード書かないと、わからないことは多いと思いました。 便利そうな関数 stdioBy f w :== exec w where exec w#!(io, w)= stdio w #! (_, w)= fclose (f io) w =w //例 Start world #! (e,bodies) = energy N $ momentum ini_bodies #! (e2,bodies) = energy N $ advance (toInt arg1) N 0.01 dummy dummy bodies = stdioBy (\io-> io <<< toStringWith 9 e <<< "\n" <<< toStringWith 9 e2 <<< "\n") world where N = size ini_bodies Haskell.icl dcl というのを 作ってます 一例 ($) infixr 1 ($) a b :== a b
216 名前:デフォルトの名無しさん mailto:sage [2005/12/31(土) 00:19:12 ] 同じような関数を書かないでいいようにライブラリを公開してみました。 home1.tigers-net.com/~th003751/
217 名前:デフォルトの名無しさん [2006/01/03(火) 21:07:29 ] 今年一番伸びる言語
218 名前:デフォルトの名無しさん mailto:sage [2006/01/15(日) 01:13:42 ] 本家が過疎化してるように見えるが・・・
219 名前:デフォルトの名無しさん mailto:sage [2006/01/15(日) 12:32:23 ] 自分は学問としては触ってないのだけど、 論文の発表すら過疎ってるの?
220 名前:デフォルトの名無しさん [2006/01/15(日) 13:05:57 ] CleanってIDE内でないとコンパイルができない? VBみたいでイヤンなんだけど・・・。
221 名前:デフォルトの名無しさん [2006/01/15(日) 20:06:28 ] Concurrent Cleanの「Concurrent」って、並列のConcurrent? コードに自分でスレッド関連の事をなんも書かないで、 普通に書くだけで、マルチCPUやマルチコアをフル活用して並列処理してくれるの?
222 名前:デフォルトの名無しさん mailto:sage [2006/01/15(日) 21:55:30 ] 俺も前から気になってたが、本家の方はConcurrent抜きのただのCleanしかないような。
223 名前:デフォルトの名無しさん mailto:sage [2006/01/15(日) 22:01:20 ] >>221-222 これか? ttp://mailman.science.ru.nl/pipermail/clean-list/2003/002485.html
224 名前:デフォルトの名無しさん mailto:sage [2006/01/15(日) 22:07:44 ] あまり古傷をえぐらないように
225 名前:221 mailto:sage [2006/01/16(月) 00:42:19 ] >>223 d。 > we dropped the feature due to lack off parallel machines. なんとショボイ理由w(つうか言い訳?)。 1990年代後半なら個人でもデュアルCPUマシン位所有できただろ。 つうか俺実際"Dualon"使ってたし。って違うのか? あと、プロセス単位だったような説明だが、 言語が本質的に並列性を備えてるならスレッドで良いじゃん。 マルチコア時代に向けて復活させろよ。
226 名前:デフォルトの名無しさん mailto:sage [2006/01/17(火) 00:54:01 ] >>220 linuxならclmでCUIコンパイルができるよ。 windows だと, CleanIDE.exe --batch-build <FULL path to project> なんてできるらしいけど、成功しなかった。
227 名前:226 mailto:sage [2006/01/17(火) 00:58:36 ] full pathでやったら成功したorz >>220 サンクス
228 名前:デフォルトの名無しさん mailto:sage [2006/03/08(水) 22:40:20 ] Clean のページが変わってますね。 といっても、変更先もアクセス不能ですが。 The Clean Homepage has been moved to: www.cs.kun.nl/~clean/ Please update your bookmarks accordingly.
229 名前:デフォルトの名無しさん mailto:sage [2006/04/15(土) 14:21:38 ] ちょっと興味を持ったので触ってみようと思ったんだけど、 今はどこからダウンロードできるの?
230 名前:デフォルトの名無しさん mailto:sage [2006/04/17(月) 06:06:02 ] dekiruyo
231 名前:デフォルトの名無しさん mailto:sage [2006/04/22(土) 21:40:48 ] CleanってHaskellよりもよさそうなのに人気ないね 欠点でもあるん?
232 名前:231 mailto:sage [2006/04/24(月) 03:37:56 ] Cleanを勉強中。 分かりやすい日本語のチュートリアルがあるのがいいね。 Haskellはわけ分からん。 Cleanを気に入った人間はここにもいるぞってことで、足跡を残しておく。 しかし、他スレでHaskellの欠点をCleanなら解決できるって書き込みがあるが、 見事にスルーされてるね。 Cleanを気に入った人間としては悲しい限りだ。
233 名前:デフォルトの名無しさん mailto:sage [2006/04/24(月) 14:12:26 ] > 分かりやすい日本語のチュートリアル どこすか?
234 名前:デフォルトの名無しさん mailto:sage [2006/04/24(月) 14:28:26 ] www.geocities.jp/lethevert/softwares/clean/ のことかな? sky.zero.ad.jp のやつはわかりづらいと思うが……
235 名前:デフォルトの名無しさん mailto:sage [2006/04/24(月) 17:51:20 ] >>234 おおそこか thanx
236 名前:デフォルトの名無しさん mailto:sage [2006/04/28(金) 21:08:19 ] >>232 haskellの欠点を回避といっても 表面的なもの・・・ というか、環境変数を変更できないだけ。 また、cから配列で情報を得ようとする場合は、副作用を生じるし、 それによってうまくいかない場合があるかもしれない。 配列が使えないっていうのは文字列も副作用なしでは使えないってこと。 class とかも 型ClassのList を 引数?に取れないで (List a)にしなきゃいけない とかいろいろ欠点はあると思う。
237 名前:デフォルトの名無しさん [2006/05/04(木) 16:20:52 ] C
238 名前:デフォルトの名無しさん [2006/05/21(日) 16:27:05 ] L
239 名前:デフォルトの名無しさん mailto:sage [2006/05/21(日) 18:18:32 ] Haskellの本でてるね。Cleanもでないかなあ
240 名前:デフォルトの名無しさん mailto:sage [2006/05/21(日) 21:16:40 ] 誰かが書かなきゃ出ないわな
241 名前:デフォルトの名無しさん mailto:sage [2006/06/21(水) 16:39:57 ] スタックオーバーフローになるのですがどこが悪いのでしょうか? Haskellだと、うまく行ったんですが…。 Start = chg [10,5,1] 2 chg::[Int] Int->Int chg _ 0 = 1 chg [] _ = 0 chg denoms amount | tl denoms == [] = chg denoms (amount- hd denoms) | otherwise = (chg (tl denoms) amount) + (chg denoms (amount - hd denoms))
242 名前:デフォルトの名無しさん [2006/06/21(水) 16:52:28 ] age
243 名前:デフォルトの名無しさん mailto:sage [2006/06/21(水) 17:58:35 ] Haskell でも止まらないと思うし、 amount が負値になったら止まらなくなると思うんだけど。
244 名前:241 mailto:sage [2006/06/21(水) 23:31:10 ] >>243 ありがとうございます。 おおボケかましてました orz ↓で動きました。 chg::[Int] Int->Int chg _ 0 = 1 chg [] _ = 0 chg denoms amount | amount < hd denoms = chg (tl denoms) amount | otherwise = chg (tl denoms) amount + chg denoms (amount- hd denoms)
245 名前:デフォルトの名無しさん [2006/10/09(月) 08:44:38 ] ohayo karaage
246 名前:デフォルトの名無しさん mailto:sage [2006/12/04(月) 23:17:51 ] hosyu
247 名前:デフォルトの名無しさん mailto:sage [2006/12/20(水) 05:05:32 ] 2.2 出た
248 名前:デフォルトの名無しさん mailto:sage [2006/12/20(水) 20:10:15 ] 午前5時5分ですか。。。
249 名前:デフォルトの名無しさん [2007/01/27(土) 22:06:10 ] よくわからんのだが、これって分散計算とかサポートしてるの?
250 名前:デフォルトの名無しさん mailto:sage [2007/01/27(土) 22:21:38 ] Intel Mac には対応してないの?
251 名前:デフォルトの名無しさん mailto:sage [2007/03/06(火) 00:15:44 ] 中野豚子 フジテレビ 中野美奈子 噛み過ぎ ブタ ブス
252 名前:デフォルトの名無しさん [2007/03/26(月) 20:43:42 ] あげ
253 名前:デフォルトの名無しさん mailto:sage [2007/05/14(月) 17:29:51 ] hosh
254 名前:デフォルトの名無しさん mailto:sage [2007/05/17(木) 21:39:26 ] FreeBSDのcompat/linuxな環境で動かせますか?
255 名前:デフォルトの名無しさん [2007/05/17(木) 21:40:06 ] あげてみるdesu
256 名前:デフォルトの名無しさん [2007/05/17(木) 22:19:30 ] この言語もう終わりだろ・・普通に考えて。 更新なんかもう2年もされてないし。
257 名前:デフォルトの名無しさん [2007/05/17(木) 22:22:25 ] Cleanの成果はすべてHaskellに取り込まれてるから、これからCleanさわろうとする人はHaskellをやった方が将来性あると思うよ。 っていうか、Haskellは研究用としてすでにデフォルトだから新しい研究成果はほとんどHaskellに組み込まれるよ。
258 名前:デフォルトの名無しさん mailto:sage [2007/05/17(木) 23:23:31 ] >>257 >Cleanの成果はすべてHaskellに取り込まれてるから、 Haskell はマクロも無いし、変数に代入出来ないでしょ。 しかも将来性だって嵩が知れてるがな。 Haskell は嫌いじゃないけど、Haskell 信者は嫌いだ。
259 名前:デフォルトの名無しさん [2007/05/17(木) 23:29:06 ] >>258 信者じゃねーよ 俺もHaskellは使いにくいと思ってるが、それはおいといて・・ 変数はあるよ。IORefモナドとか。 でも、こういうものはなるべくなくすべきだというのが一般的な見解。 マクロは成果でも何でもないと思う。
260 名前:デフォルトの名無しさん [2007/05/17(木) 23:30:00 ] あと、「将来性」というのは関数型言語陣営の将来性という意味で。
261 名前:デフォルトの名無しさん mailto:sage [2007/05/17(木) 23:36:41 ] 流行物に付いて行こうとするなら最初から Clean なんて興味持たないと思うけどね。
262 名前:デフォルトの名無しさん mailto:sage [2007/05/18(金) 01:18:47 ] 将来性で関数型選ぶ自体がミーハーだからな
263 名前:デフォルトの名無しさん mailto:sage [2007/05/18(金) 01:20:21 ] >>261 むしろ、流行好きだから、一時期Cleanに興味持つのでは? お、今度はこんな言語でてきたかーって。 で、流行がすぎさった、と。
264 名前:デフォルトの名無しさん mailto:sage [2007/05/18(金) 06:06:58 ] IORef モナドって、一旦複製を作って、 一定の領域内でその複製を値を変えることができる、 という認識でいいのかな? 純粋な変数とは言いがたいようなそうでないような。
265 名前:デフォルトの名無しさん mailto:sage [2007/05/18(金) 19:25:19 ] > この言語もう終わりだろ・・普通に考えて。 > 更新なんかもう2年もされてないし。 そうなの? モナドつかわなくて良くて 速いっていう夢の言語かと思ったのに
266 名前:デフォルトの名無しさん mailto:sage [2007/06/15(金) 18:11:33 ] 2年前に完成したんだよ!
267 名前:265 [2007/06/21(木) 20:58:01 ] > 2年前に完成したんだよ! なるほど! djbメソッド
268 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 00:00:18 ] >モナドつかわなくて良くて >速いっていう夢の言語かと思ったのに ocamlでも使え
269 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 00:04:48 ] OCaml は見た目が汚いから嫌
270 名前:デフォルトの名無しさん [2007/06/24(日) 02:45:52 ] どこが汚いんですか あなたのまんこですか
271 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 13:44:23 ] セミコロン多用する所が気持ち悪い
272 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 14:38:48 ] ;; は確かにくどいな。
273 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 14:46:30 ] 確かリストの区切りも ; じゃなかったっけ? 節操が無いよな。
274 名前:デフォルトの名無しさん [2007/06/24(日) 16:15:35 ] >>272 それ別に書かなくても良くなったんだぜ
275 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 16:31:42 ] そうなのか
276 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 16:38:17 ] セミコロン無しで、文の区切りはどうするの?
277 名前:デフォルトの名無しさん mailto:sage [2007/08/15(水) 19:42:22 ] fcloseするのが面倒だから、withFileとか作ろうかと思ったんだけど、できねー Haskellだと簡単に作れるのに やっぱり、一意性よりもモナドの方が優れてるってことだね
278 名前:デフォルトの名無しさん mailto:sage [2007/08/17(金) 03:08:37 ] // cleanでも余裕でこんなコードは書けるがな。 ただし... module x import MyHakell Start w = main w where main = readFile "c:/a.txt" >>= print
279 名前:デフォルトの名無しさん [2007/11/24(土) 10:37:07 ] つい、昨日Cleanを知ったばかりだがこのスレ大分過疎ってるね・・・。
280 名前:デフォルトの名無しさん mailto:sage [2007/11/25(日) 04:07:13 ] Clean 2.2 っていつ出たの?
281 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 00:34:32 ] 掃除などせずに、はすければいいんだよ。