純粋関数型言語Concur ..
193:デフォルトの名無しさん
05/10/30 19:22:17
本当に最後に。
実用ならocamlのほうがよさそうだ。
本格派なら言語そのものの研究といった所かな?
ocamlは見た目が美しく感じないので好きじゃないんだけど。
素人の感想
Haskell :: スピードが遅く scheme で十分なので魅力を感じない
ocaml :: ライブラリが比較的充実?純粋関数型ではない
Clean :: マイナーでライブラリ作成が大変
194:デフォルトの名無しさん
05/10/30 20:18:46
//おまけ 誤差逆伝播ニューラルネット。簡潔だが、知らないと結局わからない
// コンパイルも通してないし、行間を埋めなければならない代物
// local変数は構造体で作成みたいな感じがいいのかな。
learning :== 1.0
forwardPropagation i weights local
| i <= size weights = forwardPropagation (i + 1) weights
(copy local i (sigmoid local.[i] * weights.[i-1]))
= copy local i (sigmoid local.[i] * weights.[i-1])
backPropagation weights local pre i
#! weights = updateVector weights i (weights.[i] +learning@*(`local.[i])*pre)
| 0 == i = weights
= backPropagation weights local
( (1.0 @- local.[i]) .* local.[i] .* (pre * weights.[i]))
teach weights input teach n :== teach` weights
teach` weights _ 0 = weights
teach` weights i
#! local = forwardPropagation weights (makeLocal input)
=teach (backPropagation weights local (bp1 local.[size weights]) (n-1)) (n -1)
where bp1 last = (teach - last) .* last .* (1.0 @- last)
195:デフォルトの名無しさん
05/11/03 21:12:26
一意性誤解してた。便利になると思ったが不都合発見。
module test
import StdEnv
::TestData = {a::!Int, b::!Int}
test1:: TestData -> *TestData
test1 xx=:{a,b} #!xx2 = {xx & a=a+1}
// = {xx & b=a+b+1} // xx , xx2の違い、コンパイルが通る。aの値もわかりにくい
= {xx2& b=a+b+1}
test2 :: *TestData -> *TestData
test2 xx=:{a,b} = {a=100+a,b=100+b}
test3:: {#Real}
test3 = {1.0,2.0}
Start #! (xx, yy) = (test1 cc, test1 cc)
#! xx = test2 xx
= (test1 xx, yy , test1 yy, test3.[1])
where cc = {a=1,b=2}
196:デフォルトの名無しさん
05/11/05 08:15:35
一度書いてしまうと、急にはやめられないのでした。
Clean のゲームライブラリとかも結構強力ですね。
ゲームというより、ゲーム的な操作性・表現力を持つ物と考えれば幅は広がります。
Charlie が二週間でできたとのことです。
パフォーマンスが問題なければ実用にも。
…自分だけが書いていることには問題がありますが。
197:デフォルトの名無しさん
05/11/16 00:17:45
最近ようやくgenericがわかりました。
haskellにも Generic Haskell なんてのがあるんだな。
198:デフォルトの名無しさん
05/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:デフォルトの名無しさん
05/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:デフォルトの名無しさん
05/11/30 20:36:55
200000000000000
201:デフォルトの名無しさん
05/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:デフォルトの名無しさん
05/12/01 23:42:59
Ocamlを調べてみるとgenericなしで
型クラスもない。
普通のオブジェクト指向はあるみたい。
………使いたくなくなった。
203:デフォルトの名無しさん
05/12/02 05:45:07
Cleanをあまりよく知らないので関数型言語一般の話寄りになってしまいますが、
COMだとかActiveXだとかの外部のコンテナを扱いたい際は
データの副作用は純粋関数型言語ではどういった扱いになるんでしょうか?
204:デフォルトの名無しさん
05/12/02 21:20:09
>>203
ここは参考になるかな?
URLリンク(www.haskell.org)
205:デフォルトの名無しさん
05/12/02 23:16:49
cleanではwrapper関数とか作ったり、一意ポインタを使ったりする。htoclean周辺参考
あまり実用ではない。
206:デフォルトの名無しさん
05/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:デフォルトの名無しさん
05/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:デフォルトの名無しさん
05/12/15 03:31:03
抜け落ち部分
downcase :: !String -> String
downcase str = {toLower x\\x<-:str}
209:デフォルトの名無しさん
05/12/15 09:35:19
>207
Cleanはよく知らない俺がHaskellで書いてみましたよ。
import System.Environment
main = getArgs >>= mapM_ (putStr . map downcase . readFile)
210:デフォルトの名無しさん
05/12/15 09:38:57
あ、しまった。 Haskell にも別に downcase はなかった。
import Data.Char
した上で
map toLower
だった。
211:デフォルトの名無しさん
05/12/15 09:42:13
あー mapM_ の引数もおかしいし。
(\ fname -> readFile fname >>= putStr . map toLower)
ですかね
212:デフォルトの名無しさん
05/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:デフォルトの名無しさん
05/12/17 01:05:21
個人的な意見だけど、確かに陽に無名関数を使わない方が簡潔になる場合も多
いが、しかし、あるものを使わないのは馬鹿げていると思う。
ところでこの mapM_ の引数だと、
((>>= putStr . map toLower) . readFile)
と書ける。
その方が綺麗だと思うかどうかは人によると思うが、個人的にはどちらにせよ
新しい演算子を作るほどではない気がする。
214:デフォルトの名無しさん
05/12/17 16:28:11
>>213
確かにそうですね。
中間演算子が便利そうだったので何も考えずに使った感はあります。
1. 手続き的にプログラムをしたい場合には素直にdoを使う。 (無駄が多いように見える)
2. 関数型で無駄を省きたいなら >>213のように書く
3. 1で無駄を省くなら (a 匿名関数を用いる) か (b 新しい演算子を用いる)。
自分一人なら3.bで書くのも悪いかもしれませんが、そうでなければ2又は3.a番が妥当かもしれません。
また、2で書けるのに3.bで書くとコンパイルに通すのが目的になって無駄が生じる可能性があるとも思いました。
あと、こんなのを見つけました
URLリンク(pub.cozmixng.org)
215:デフォルトの名無しさん
05/12/18 15:50:07
もしかして、最近Cleanユーザ増えてますか?
そうであれば、僕の独り言状態になってるのでそろそろ終了しようかと思います。
N体問題 URLリンク(shootout.alioth.debian.org)
(特徴 :: 一意構造体の一意配列がある。*{*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:デフォルトの名無しさん
05/12/31 00:19:12
同じような関数を書かないでいいようにライブラリを公開してみました。
home1.tigers-net.com/~th003751/
217:デフォルトの名無しさん
06/01/03 21:07:29
今年一番伸びる言語
218:デフォルトの名無しさん
06/01/15 01:13:42
本家が過疎化してるように見えるが・・・
219:デフォルトの名無しさん
06/01/15 12:32:23
自分は学問としては触ってないのだけど、
論文の発表すら過疎ってるの?
220:デフォルトの名無しさん
06/01/15 13:05:57
CleanってIDE内でないとコンパイルができない?
VBみたいでイヤンなんだけど・・・。
221:デフォルトの名無しさん
06/01/15 20:06:28
Concurrent Cleanの「Concurrent」って、並列のConcurrent?
コードに自分でスレッド関連の事をなんも書かないで、
普通に書くだけで、マルチCPUやマルチコアをフル活用して並列処理してくれるの?
222:デフォルトの名無しさん
06/01/15 21:55:30
俺も前から気になってたが、本家の方はConcurrent抜きのただのCleanしかないような。
223:デフォルトの名無しさん
06/01/15 22:01:20
>>221-222
これか?
URLリンク(mailman.science.ru.nl)
224:デフォルトの名無しさん
06/01/15 22:07:44
あまり古傷をえぐらないように
225:221
06/01/16 00:42:19
>>223
d。
> we dropped the feature due to lack off parallel machines.
なんとショボイ理由w(つうか言い訳?)。
1990年代後半なら個人でもデュアルCPUマシン位所有できただろ。
つうか俺実際"Dualon"使ってたし。って違うのか?
あと、プロセス単位だったような説明だが、
言語が本質的に並列性を備えてるならスレッドで良いじゃん。
マルチコア時代に向けて復活させろよ。
226:デフォルトの名無しさん
06/01/17 00:54:01
>>220
linuxならclmでCUIコンパイルができるよ。
windows だと, CleanIDE.exe --batch-build <FULL path to project>
なんてできるらしいけど、成功しなかった。
227:226
06/01/17 00:58:36
full pathでやったら成功したorz
>>220サンクス
228:デフォルトの名無しさん
06/03/08 22:40:20
Clean のページが変わってますね。
といっても、変更先もアクセス不能ですが。
The Clean Homepage has been moved to:
URLリンク(www.cs.kun.nl)
Please update your bookmarks accordingly.
229:デフォルトの名無しさん
06/04/15 14:21:38
ちょっと興味を持ったので触ってみようと思ったんだけど、
今はどこからダウンロードできるの?
230:デフォルトの名無しさん
06/04/17 06:06:02
dekiruyo
231:デフォルトの名無しさん
06/04/22 21:40:48
CleanってHaskellよりもよさそうなのに人気ないね
欠点でもあるん?
232:231
06/04/24 03:37:56
Cleanを勉強中。
分かりやすい日本語のチュートリアルがあるのがいいね。
Haskellはわけ分からん。
Cleanを気に入った人間はここにもいるぞってことで、足跡を残しておく。
しかし、他スレでHaskellの欠点をCleanなら解決できるって書き込みがあるが、
見事にスルーされてるね。
Cleanを気に入った人間としては悲しい限りだ。
233:デフォルトの名無しさん
06/04/24 14:12:26
> 分かりやすい日本語のチュートリアル
どこすか?
234:デフォルトの名無しさん
06/04/24 14:28:26
URLリンク(www.geocities.jp)
のことかな?
sky.zero.ad.jp のやつはわかりづらいと思うが……
235:デフォルトの名無しさん
06/04/24 17:51:20
>>234
おおそこか thanx
236:デフォルトの名無しさん
06/04/28 21:08:19
>>232
haskellの欠点を回避といっても
表面的なもの・・・
というか、環境変数を変更できないだけ。
また、cから配列で情報を得ようとする場合は、副作用を生じるし、
それによってうまくいかない場合があるかもしれない。
配列が使えないっていうのは文字列も副作用なしでは使えないってこと。
class とかも 型ClassのList を 引数?に取れないで
(List a)にしなきゃいけない
とかいろいろ欠点はあると思う。
237:デフォルトの名無しさん
06/05/04 16:20:52
C
238:デフォルトの名無しさん
06/05/21 16:27:05
L
239:デフォルトの名無しさん
06/05/21 18:18:32
Haskellの本でてるね。Cleanもでないかなあ
240:デフォルトの名無しさん
06/05/21 21:16:40
誰かが書かなきゃ出ないわな
241:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/06/21 16:52:28
age
243:デフォルトの名無しさん
06/06/21 17:58:35
Haskell でも止まらないと思うし、 amount が負値になったら止まらなくなると思うんだけど。
244:241
06/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:デフォルトの名無しさん
06/10/09 08:44:38
ohayo karaage
246:デフォルトの名無しさん
06/12/04 23:17:51
hosyu
247:デフォルトの名無しさん
06/12/20 05:05:32
2.2 出た
248:デフォルトの名無しさん
06/12/20 20:10:15
午前5時5分ですか。。。
249:デフォルトの名無しさん
07/01/27 22:06:10
よくわからんのだが、これって分散計算とかサポートしてるの?
250:デフォルトの名無しさん
07/01/27 22:21:38
Intel Mac には対応してないの?
251:デフォルトの名無しさん
07/03/06 00:15:44
中野豚子 フジテレビ 中野美奈子 噛み過ぎ ブタ ブス
252:デフォルトの名無しさん
07/03/26 20:43:42
あげ
253:デフォルトの名無しさん
07/05/14 17:29:51
hosh
254:デフォルトの名無しさん
07/05/17 21:39:26
FreeBSDのcompat/linuxな環境で動かせますか?
255:デフォルトの名無しさん
07/05/17 21:40:06
あげてみるdesu
256:デフォルトの名無しさん
07/05/17 22:19:30
この言語もう終わりだろ・・普通に考えて。
更新なんかもう2年もされてないし。
257:デフォルトの名無しさん
07/05/17 22:22:25
Cleanの成果はすべてHaskellに取り込まれてるから、これからCleanさわろうとする人はHaskellをやった方が将来性あると思うよ。
っていうか、Haskellは研究用としてすでにデフォルトだから新しい研究成果はほとんどHaskellに組み込まれるよ。
258:デフォルトの名無しさん
07/05/17 23:23:31
>>257
>Cleanの成果はすべてHaskellに取り込まれてるから、
Haskell はマクロも無いし、変数に代入出来ないでしょ。
しかも将来性だって嵩が知れてるがな。
Haskell は嫌いじゃないけど、Haskell 信者は嫌いだ。
259:デフォルトの名無しさん
07/05/17 23:29:06
>>258
信者じゃねーよ
俺もHaskellは使いにくいと思ってるが、それはおいといて・・
変数はあるよ。IORefモナドとか。
でも、こういうものはなるべくなくすべきだというのが一般的な見解。
マクロは成果でも何でもないと思う。
260:デフォルトの名無しさん
07/05/17 23:30:00
あと、「将来性」というのは関数型言語陣営の将来性という意味で。
261:デフォルトの名無しさん
07/05/17 23:36:41
流行物に付いて行こうとするなら最初から Clean なんて興味持たないと思うけどね。
262:デフォルトの名無しさん
07/05/18 01:18:47
将来性で関数型選ぶ自体がミーハーだからな
263:デフォルトの名無しさん
07/05/18 01:20:21
>>261
むしろ、流行好きだから、一時期Cleanに興味持つのでは?
お、今度はこんな言語でてきたかーって。
で、流行がすぎさった、と。
264:デフォルトの名無しさん
07/05/18 06:06:58
IORef モナドって、一旦複製を作って、
一定の領域内でその複製を値を変えることができる、
という認識でいいのかな?
純粋な変数とは言いがたいようなそうでないような。
265:デフォルトの名無しさん
07/05/18 19:25:19
> この言語もう終わりだろ・・普通に考えて。
> 更新なんかもう2年もされてないし。
そうなの?
モナドつかわなくて良くて
速いっていう夢の言語かと思ったのに
266:デフォルトの名無しさん
07/06/15 18:11:33
2年前に完成したんだよ!
267:265
07/06/21 20:58:01
> 2年前に完成したんだよ!
なるほど! djbメソッド
268:デフォルトの名無しさん
07/06/24 00:00:18
>モナドつかわなくて良くて
>速いっていう夢の言語かと思ったのに
ocamlでも使え
269:デフォルトの名無しさん
07/06/24 00:04:48
OCaml は見た目が汚いから嫌
270:デフォルトの名無しさん
07/06/24 02:45:52
どこが汚いんですか
あなたのまんこですか
271:デフォルトの名無しさん
07/06/24 13:44:23
セミコロン多用する所が気持ち悪い
272:デフォルトの名無しさん
07/06/24 14:38:48
;; は確かにくどいな。
273:デフォルトの名無しさん
07/06/24 14:46:30
確かリストの区切りも ; じゃなかったっけ?
節操が無いよな。
274:デフォルトの名無しさん
07/06/24 16:15:35
>>272
それ別に書かなくても良くなったんだぜ
275:デフォルトの名無しさん
07/06/24 16:31:42
そうなのか
276:デフォルトの名無しさん
07/06/24 16:38:17
セミコロン無しで、文の区切りはどうするの?
277:デフォルトの名無しさん
07/08/15 19:42:22
fcloseするのが面倒だから、withFileとか作ろうかと思ったんだけど、できねー
Haskellだと簡単に作れるのに
やっぱり、一意性よりもモナドの方が優れてるってことだね
278:デフォルトの名無しさん
07/08/17 03:08:37
// cleanでも余裕でこんなコードは書けるがな。 ただし...
module x
import MyHakell
Start w = main w where main = readFile "c:/a.txt" >>= print
279:デフォルトの名無しさん
07/11/24 10:37:07
つい、昨日Cleanを知ったばかりだがこのスレ大分過疎ってるね・・・。
280:デフォルトの名無しさん
07/11/25 04:07:13
Clean 2.2 っていつ出たの?
281:デフォルトの名無しさん
07/12/18 00:34:32
掃除などせずに、はすければいいんだよ。
最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
5386日前に更新/85 KB
担当:undef