5ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

純粋関数型言語Concurent Clean

1 :デフォルトの名無しさん:04/02/01 18:55

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


関連リンク
本家
http://www.cs.kun.nl/~clean/
日本語ドキュメントなど
http://sky.zero.ad.jp/~zaa54437/programming/clean/

2 :デフォルトの名無しさん:04/02/01 18:57
あっConcurentじゃなくてConcurrentね。
間違えちゃった、許して。

3 :3:04/02/01 19:08
本気(maji)ですか!?

4 :デフォルトの名無しさん:04/02/01 19:10

関連リンク

Sparkle
http://www.cs.kun.nl/Sparkle/
(定理証明系)
ゲームライブラリ
http://cleangl.sourceforge.net/

Gast
http://www.cs.kun.nl/~pieter/gentest/gentest.html
(自動テストシステム)

Clean要望リスト
http://www.cs.kun.nl/~clean/wish/main.html

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


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


5 :デフォルトの名無しさん:04/02/01 19:14
関連ありそうなスレ

関数型プログラミング言語Haskell
http://pc2.2ch.net/test/read.cgi/tech/1013846140/

関数型言語Part3
http://pc2.2ch.net/test/read.cgi/tech/1037527388/


6 :デフォルトの名無しさん:04/02/01 19:33
純粋関数型って何?

7 :デフォルトの名無しさん:04/02/01 19:52
Haskellとどっちが純粋ですか?

8 :デフォルトの名無しさん:04/02/01 19:57
Cleanは型一意性によって副作用の問題を克服しています。
一意性についてはココをみてください。
ttp://sky.zero.ad.jp/~zaa54437/programming/clean/CleanBook/part1/Chap4.html#sc16
なお、Haskellと同じくモナドも使えます。
ドッチが純粋かはわかりません。
たぶん同じぐらいじゃないっすかね?

9 :デフォルトの名無しさん:04/02/03 13:56
ユーザーに歩み寄りをかなり強いる言語な気がする。

>>8
'*'を付ける〜とかの純粋さの証明って、あれで説明になってるの?
さっぱりわからねえよ

10 :デフォルトの名無しさん:04/02/03 15:02
綴りが間違ってる。

11 :デフォルトの名無しさん:04/02/03 15:04
>>9
何を言っているか分からんが、
評価結果が評価順序から独立していれば、
一応は参照透明だということになってるよ。
副作用がないってのが厳密な純粋性だけどね。

12 :デフォルトの名無しさん:04/02/03 17:30
ここでは「純粋」ならば「strictでない」のだそうだ

13 :デフォルトの名無しさん:04/02/03 19:24
色々コード見てみないとよくわからないね。
例えばCSV形式のファイルがあるとして、第n列のデータを抜き出して
行ごとに出力する、みたいなコードはCleanで書くとどうなるの?
(空データは空行として出力、引用符の認識は不要)

インタフェースはこんな感じで。
csvref <n> <file> //n列目を出力する

入力データ(test.csv)
aaa,bbb,ccc
,eee,fff
ggg.hhh.iii


csvref 1 test.csv の結果
aaa

ggg

csvref 2 test.csv の結果
bbb
eee
hhh


14 :デフォルトの名無しさん:04/02/05 14:28
>>12
該当箇所が分からんが。

15 :デフォルトの名無しさん:04/02/05 16:18
Windows版に興味がでたのですが、
cleanって日本語も扱えるのでしょうか?


16 :デフォルトの名無しさん:04/02/06 16:27
>>13
その場合は他の関数型言語と変わらんな。

17 :デフォルトの名無しさん:04/02/06 18:23
>>16
ミクロなところ(実際にどうなるのか)を聞きたいんだと思うよ。
おれはそう。IOとか。

Haskellだと
-------
module Main where
import System
import System.IO

main
= do(sn:sfn:_) <- getArgs
ss <- openFile sfn ReadMode >>= hGetContents
putStrLn $ unlines $ map ((!! (read sn - 1)) . cols) $ lines ss

cols s = case break (\c -> or (map (c ==) ",.")) s of
(w, []) -> [w]
(w, _:ws) -> w: cols ws

18 :デフォルトの名無しさん:04/02/06 18:29
indent崩れた…
# Cleanスレだから張り直さないほうがいいかな。

19 :デフォルトの名無しさん:04/02/07 17:22
>>15
使ってみれば分かる。

20 :デフォルトの名無しさん:04/02/08 00:03
>>15
使えません

21 :デフォルトの名無しさん:04/02/08 16:45
ユニコードに対応したライブラリはない。
従って、表示はともかく、操作はできない。

22 :Aransk:04/02/08 18:08
最近は徐々に相手の神経を逆撫でする発言スタイルを
モデレートタイプに修正中です。是非早くHaskellスレPart3
を立ち上げて下さい。それとも、このCleanスレと
目出度く合体!でも当方としては、全然問題ありません。
HakellとCleanは兄弟のようなもんですから(^^;
ttp://homepage3.nifty.com/Aransk/

23 :デフォルトの名無しさん:04/02/08 18:25
>>17
ファイルの読込であれば、
こんな関数を作ればよい。

Read :: File -> [Char] // ファイルから読み込んで文字リストを作る
Read f
# (b,ch,filerest) = sfreadc f
| not b = []
| otherwise = [ch : Read filerest]

要するにFile型の引数を操作すればいいだけ。
その前にsfopen関数当たりで関連付けるけどな。

24 :デフォルトの名無しさん:04/02/09 00:28
で、実際13はどうなるんだ

25 :デフォルトの名無しさん:04/02/09 01:07
>>22
せっかくリファレンスの日本語訳が出たんだから Python でもやってろ

26 :デフォルトの名無しさん:04/02/09 01:18
いいからNGネームに追加しとけ

27 :デフォルトの名無しさん:04/02/09 01:49
>>13をC言語で適当に書いたコード
おまいらこれをCleanに変換してくれよ
#include <stdio.h>
#define deref(x,i) *(int *)((x) + ((i)*4))
cvsref_fp(no, in, out) {
 int c, column = 1;
 while ((c = fgetc(in)) != EOF)
  if (c == ',') ++column;
  else if (c == '\n')   fputc(c, out), column = 1;
  else if (column == no) fputc(c, out);
}
cvsref(no, filename) {
 int fp = fopen(filename, "r");
 !fp ? printf("Error: File not found.\n"),exit(1) :
  cvsref_fp(no, fp, stdout);
 fclose(fp);
}
main(c,v) {
 c != 3 ? printf("Usage: csvref <no> <filename>\n"),exit(1) :
  cvsref(atoi(deref(v, 1)), deref(v, 2));
}

28 : :04/02/09 11:58
今週末に考えるので気長に待ってろ。

29 : :04/02/09 12:01
といってもそれを変換するとは限らない。

30 :デフォルトの名無しさん:04/02/09 13:58
haskell の新スレまだぁー?

31 :デフォルトの名無しさん:04/02/09 15:38
まだ立ってなかったのか

32 :Aransk:04/02/09 17:34
新しいスレ立てんなら立てる。
Cleanと一緒ならそう宣言する。
どっちか早く決めてもらいたい!
ワタクシ、
言いたいことが山のように溜まっておるのです。
キミ,恐るることなかれ。(^^;)
ttp://homepage3.nifty.com/Aransk/

33 :デフォルトの名無しさん:04/02/09 17:45
↑のアホがいないときに立てるよ

34 :デフォルトの名無しさん:04/02/09 17:48
>>32
自分の名前でスレッド立てれば?
少しぐらいなら相手してあげてもいいよ
ただし場所は
http://pc.2ch.net/prog/
こっちでどうぞ。

35 :デフォルトの名無しさん:04/02/09 19:30
>>32
お前が立てろよ
まあ直後にネタ板と化すだろうが

36 :デフォルトの名無しさん:04/02/09 22:09
おまえら
あんま会話するな

37 :デフォルトの名無しさん:04/02/10 00:23
なんで>>13にこだわるんだろ?


module getcsv
import StdEnv,ArgEnv

Start world
= StartCSV world

StartCSV world
# (readok, read_file, f)= sfopen filename FReadText world
| not readok= abort ""
# (write_file, f)= stdio f
# (file)= CharListWrite (getCsvData col (CharListRead read_file)) write_file
# (closeok, f)= fclose file f
| not closeok= abort ""
| otherwise= f
where
col= toInt argv.[1]
filename= argv.[2]
argv=getCommandLine


つづけて宜しゅうございますか?

38 :デフォルトの名無しさん:04/02/10 00:34
もったいぶってどうするんだ?
ここは1が密かに努力するスレだと思うぞ

39 :デフォルトの名無しさん:04/02/10 00:44
>>1ではないのだが・・・
続き

getCsvData :: Int [Char] -> [Char]
getCsvData num [x:xs]    = getCsvData` num [x:xs]
where
    getCsvData` n [x:xs]
        | x == '\n'       = ['\n'] ++ getCsvData`     num xs
        | x == ','        = getCsvData`     (n-1) xs
        | n == 0          = [x] ++ getCsvData`     n   xs
        | otherwise        = getCsvData` n   xs
//    getCsvData`  0 [x:xs]   = [x] ++ getCsvData`     0   xs
     getCsvData` n []        = []

CharListWrite []    f = f
CharListWrite [c:cs] f = CharListWrite cs (fwritec c f)

CharFileCopy infile outfile = CharListWrite (CharListRead infile) outfile

CharListRead f
     | not readok = []
     | otherwise  = [char : CharListRead filepointer]
where
     (readok,char,filepointer) = sfreadc f
エラー処理は考えてません。
>>37はインデントがずれているので、適当に脳内補完しといてくれ。

40 :デフォルトの名無しさん:04/02/10 00:49
いいぞがんがれ

41 :デフォルトの名無しさん:04/02/10 15:28
ん?
俺は考えなくていいみたいだな。

42 :デフォルトの名無しさん:04/02/10 15:34
>>41
>>37,>>39は長すぎる。>>17並になるよう考えてくれ。

43 :Aransk:04/02/10 18:59
>33〜36
ワタクシには、決して悪気が無いことは、良くお分かりの
くせに…(少し毒気はあるが、藁藁)
まあHaskellスレが立つことを気長にお待ちしましょう。
それまでは、このスレに居座りますので、悪しからず(^^;
ttp://homepage3.nifty.com/Aransk/

44 :デフォルトの名無しさん:04/02/10 21:57
>>43
名無しで立てて後で「乙」とでも自演しておけばとりあえずはネタスレにならずに立つ

45 :デフォルトの名無しさん:04/02/10 23:06
>>43みたいのを「構ってクン」ていうんですね.初めて見ました.

46 :デフォルトの名無しさん:04/02/10 23:24
>>43
立ったぞ
早よ逝け
http://pc2.2ch.net/test/read.cgi/tech/1076418993/

…程々にな

47 :Aransk:04/02/11 13:20
>46
居心地が良さそうなんで、もう少し(微笑)
そう言えばCleanってさあ、普通にダウンロードすると
旧ヴァージョンしか出来なくない?
やはり金を払わないと最新版はダウンロードできないの?
ttp://homepage3.nifty.com/Aransk/


48 :デフォルトの名無しさん:04/02/11 14:25
>>42
そう変わらん結果になると思うが、考えてはみよう。

49 :Aransk:04/02/12 16:45
CleanPjtを推進しているオランダの大学教授も
最近やる気を無くしているみたいね?
やっぱり、商売にならないとキツイんだ。
そりゃぁ、EclipseやJakartaPjtを無償で使っている
連中に売り込むのは、いかにもツライものがあるよねぇ。
ttp://homepage3.nifty.com/Aransk/



50 :デフォルトの名無しさん:04/02/12 23:41
誰か Aransk タン専用スレ立てキボンヌ。

51 :デフォルトの名無しさん:04/02/13 07:14
>>50
漏れがスレ立てられるようになるまで待ってろ。
関数型言語スレの住人は煽り耐性もdqn耐性も
弱いからな。

52 :Aransk:04/02/13 17:07
>50,51
でもCleanってさぁ。Haskellとは違って明らかに商用を
目指しているよねぇ?そのビジネスが成立するかどうかって
Cleanスレでは重要じゃないの?でないと
Clean言語自体が消えちゃうじゃんよぉ。
ttp://homepage3.nifty.com/Aransk/




53 :デフォルトの名無しさん:04/02/13 17:14
こんなのが流行る気がしないな。
このスレでも一向にコード書く奴出てこないし。
Aransk、おまえここに居座るつもりなら
Cleanでなんかコード書いてみろよ。

54 :デフォルトの名無しさん:04/02/14 04:39
元々はオランダの国家プロジェクトの副産物として登場したものなので、
商用を目指しているというのは正確ではない。
大学の研究用の材料にされているという方が正確だ。

55 :Aransk:04/02/14 17:52
>53
>This site is about functional programming
>and purely functional language : Concurrent Clean.
これCleanのプログラムじゃなかったっけ?(^^;
>54
Cleanの最新版は金を払わんとダウンロード出来ん。
それを商用と言わずして何を商用と言うのか?(^^)
IBMが5千万ドル開発費を注ぎ込んだ、Eclipseが
無償でダウンロードできる。これも大学の研究用の
材料であろうか?(^^;
ttp://homepage3.nifty.com/Aransk/




56 :デフォルトの名無しさん:04/02/14 18:42
アホとは思っていたが。
これ程とは・・・

57 :デフォルトの名無しさん:04/02/14 19:29
商用ってば、Eiffelのシャチョさん、一昨年の日本のOOカンファレンスに招聘されてたけど
相変わらず精力的だったな。やっぱコンサルとか講演とか、別の収入があるからかw

58 :デフォルトの名無しさん:04/02/14 19:47
どうする〜?
Eiffel?

59 :デフォルトの名無しさん:04/02/14 21:21
Aransk 様の Clean 講座マダー

60 :デフォルトの名無しさん:04/02/14 21:30
Cleanで hello Dialog

module hello
import StdEnv, StdIO
Start world = startIO NDI Void (snd o openDialog undef hello) [] world
where hello= Dialog "" (TextControl "Hello world!" []) [WindowClose (noLS closeProcess)]


61 :デフォルトの名無しさん:04/02/15 03:57
>>55
>Cleanの最新版は金を払わんとダウンロード出来ん。

英語のサイト巡りも禄に出来ない人は来ないで下さい。

62 :37の配列版:04/02/15 12:03
module csvref 
import StdEnv,ArgEnv 

Start world
# (readok, file, world)= sfopen filename FReadText world 
| not readok= abort "open failure"
# (console, world)= stdio world 
  (closeok, world)= fclose (console <<< getCsv col file) world 
| not closeok= abort "close failure" 
             = world
where 
    col= toInt argv.[1] 
    filename= argv.[2] 
    argv=getCommandLine 

63 :37の配列版続き:04/02/15 12:03
getCsv :: Int File -> String
getCsv num file
| num<= 0 = abort "out of range"
          = selectCsv (num-1) (stringRead file) 0
where
    selectCsv :: Int String Int -> String
    selectCsv n s i
    | s.[i] == '\r' = ""
    | s.[i] == '\n' = "\n" +++ selectCsv (num-1) s (i+1)
    | s.[i] == ','  = selectCsv (n-1) s (i+1)
    | n     == 0    = toString s.[i] +++ selectCsv n s (i+1)
                    = selectCsv n s (i+1)

    stringRead :: File -> String
    stringRead f
    | sfend f         = "\r"
    # (line,filerest) = sfreadline f
    = line +++ stringRead filerest

64 :Aransk:04/02/15 17:49
>61
1.3じゃなくて、2.1無償ダウンロード出来るの?
ttp://homepage3.nifty.com/Aransk/


65 :デフォルトの名無しさん:04/02/15 18:07
Aransk 様が Clean に興味を持たれたようです。

66 :デフォルトの名無しさん:04/02/15 18:13
>>64
ここにいるのは元号が大学名の学校出身ばかりだから、
得意の英語でMLに質問したら?

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



67 :デフォルトの名無しさん:04/02/15 19:24
明治のことかー!!

68 :デフォルトの名無しさん:04/02/15 19:35
元禄大学

69 :デフォルトの名無しさん:04/02/15 21:00
>>66
Aranskタンには無理だとわかっていてあえてそーゆう提案してるだろ?

70 :デフォルトの名無しさん:04/02/15 22:17
Aranskタンは愛すべき糞コテになりました
そろそろ萌え擬人化します

71 :Aransk:04/02/16 21:05
>70
>Aranskタンは愛すべき
だよね?それがさぁ。
ttp://homepage3.nifty.com/Aransk/のMSGボードに
いつかは、来られるのではと、「密かに」期待はして
おりました。それが、な、なんと、本日7000通もの
大量、カキコがありました。大漁節!です。
お蔭様でMSG板はオシャカ!であります。(^^;
mild_server_super_lights先生を存知より
の方が、もし「2ちゃんねる」にも出入りされて
おられたら、是非、先生にお伝え願いたいのです。
Aranskは、またのお越しをお待ち申し上げて
おりますと。今度は、先生の弊HPに対する
ご意見なり、ご批判なりをご自由にお書き下さい。
但し、「多くても」10通以内にね。(大笑い)



72 :デフォルトの名無しさん:04/02/16 22:08
((;゚Д゚))ガクガクブルブル ほ、本物?

73 :デフォルトの名無しさん:04/02/16 22:11
Aranskたんの萌えエロ画像キボン

74 :デフォルトの名無しさん:04/02/17 02:59
>>66
意味分からん

75 :Aransk:04/02/17 18:21
>72
>((;゚Д゚))ガクガクブルブル ほ、本物?
mild_server_super_lights先生って、2ちゃんねるでは
「そんなに」有名人なんでしょうか?(^^;
ttp://homepage3.nifty.com/Aransk/


76 :デフォルトの名無しさん:04/02/17 21:24
いつの間にAranskだと認めたんだね.

77 :Aransk:04/02/18 18:23
>76
>いつの間にAranskだと認めたんだね.
もう随分以前から「ヒーロー勇気」や「名無し」を
使用せず、本名で発言しております。(^^;
でないと2ちゃんねるの雑誌に有名コテハンとして
掲載してくれないらしい?(大藁藁)
ttp://homepage3.nifty.com/Aransk/




78 :デフォルトの名無しさん:04/02/19 18:44
Aranskは自分がなにか``特別''であると
思い込みたくてしょうがないらしい...

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

>ム板と中東板を往復するのは、管理人だけなのに
プッ,何言ってんの?

79 :デフォルトの名無しさん:04/02/19 18:52
>>76,>>78
そっとしといてやれよ。第一Cleanと関係ないぞ。

80 :Aransk:04/02/19 19:29
>76,78
そうだぁ!Cleanに関係ない質問をするな!
(それに簡単に乗せられる奴も、問題ではある。(^^;)
Javaやその他言語の無償提供環境の中で
Cleanのような弱小言語がビジネスとして
成立するのか?また成立する「必要が」あるのか?
それを問いたい。(^^;
ttp://homepage3.nifty.com/Aransk/



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

「○○言語に関する質問」と「○○言語のスレがビジネスとして
成立するかどうかの議論」は別々のスレでやった方がいいと思う.

82 :デフォルトの名無しさん:04/02/19 19:57
つか、それしかネタ無いんか?

83 :デフォルトの名無しさん:04/02/19 23:20
Aransk って普段どんなプログラムを作ってるの?

84 :デフォルトの名無しさん:04/02/20 04:39
>>80
最新版にこだわるけど
有料の最新版はダウンロード版とどこが違うの?

85 :デフォルトの名無しさん:04/02/20 13:11
最新版

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

ttp://www.cs.kun.nl/~clean/Download/main/main.htm

86 :Aransk:04/02/20 17:56
>82
>つか、それしかネタ無いんか?
悪い。Cleanで知ってることってこれだけなんです。(^^;
>83
普段はプログラムに触っておりません。
ひたすら面白そうな新しい言語を探し、言語仕様を
読んで、DLして験すだけ。だから、公平な評価が可能なので
あります。純粋の鑑定団!
現在SimkinとIoを調査中であります。
>85
えぇ!ホントですか?ビジネス・プラクティスの変更か?
どうやって、開発部隊は食っていけるのだろう?
ttp://homepage3.nifty.com/Aransk/




87 :デフォルトの名無しさん:04/02/21 02:54
書き込みがあまり無いようなので
ネタフリとして
http://sky.zero.ad.jp/~zaa54437/programming/clean/CleanBook/part1/Chap1.html#sc33
の演習でも順番にといていきましょう。

1.CLEANシステムがあなたのコンピュータにインストールされていることを確かめなさい。そのシステムは、www.cs.kun.nl/~cleanからダウンロードできます。値42を印字するプログラムを書いて実行しなさい。


2.2つの引数、つまり、nとxを取る関数を書き、それらの累乗xnを計算しなさい。その引数を平方する関数を、それを使って構成しなさい。128の平方を計算するプログラムを書きなさい。

3.その引数の数字を加算する関数isum :: Int -> Intを定義しなさい。そうすると、

isum 1234 = 10
isum 0 = 0
isum 1001 = 2

isumは、非負の引数に適用されるものとする。

88 : :04/02/23 14:49
んじゃ、GUI版でも考えるかな。
今週末くらいを目途に。

89 :デフォルトの名無しさん:04/02/25 23:50
関数型言語初心者なので素直にコンソール版で解いてみた。型指定は省略。
残りの問題も解いてみたけど、ネタ切れしそうなので投下は止めときます。

あ、5.以降の関数は全て1行で書けるね。

// 1. /////////////////////////////////
Start = 42

// 2. /////////////////////////////////
pow n 0 = 1
pow n x = n * pow n (x-1)

square n = pow n 2

Start = (pow 2 10, square 128)

// 3. /////////////////////////////////
isum 0 = 0
isum n = n-(n/10)*10 + isum (n/10)

Start = (isum 123456789, isum(-123456789))



90 :42の表示GUI版:04/02/27 18:38
module display42
import StdEnv, StdIO

Start :: *World -> *World
Start w = startIO NDI Void initial [] w
where
    initial pst
    # (err,pst)    = openDialog
                     Void 
                     (Dialog "display 42" (TextControl "42" []) [WindowClose (noLS closeProcess)])
                     pst
    | err<>NoError = closeProcess pst
                   = pst

91 :デフォルトの名無しさん:04/03/06 17:01
他のGUI版も作ろうかと思ったが、まんまマニュアルにある。

92 :デフォルトの名無しさん:04/03/11 00:38
// 4.
divable :: Int -> Bool
divable n
| n < 9 = False
| n == 9 = True
= divable (isum n)
Start = (divable 6, divable 9, divable (-9)) // 定義域は正の値だけ

// 5, 6
max a b = if (a > b) a b
min a b = if (a < b) a b

// 7, 8
MaxOfList :: [a] -> a | Ord a
MaxOfList [x:xs] = foldl max x xs

MinOfList :: [a] -> a | Ord a
MinOfList [x:xs] = foldl min x xs

// 9-12
Last :: [a] -> a
Last [x:xs] = foldl (\_ b = b) x xs

LastTwo :: [a] -> (a, a)
LastTwo [x,y:zs] = foldl (\(_,b) c = (b,c)) (x, y) zs

Reverse :: [a] -> [a]
Reverse [x:xs] = foldl (\cs c = [c:cs]) [x] xs

Palindrome :: [a] -> Bool | Eq a
Palindrome xs = xs == Reverse xs

93 :デフォルトの名無しさん:04/03/17 00:23
http://sky.zero.ad.jp/~zaa54437/programming/clean/CleanBook/part1/Chap2.html#sc20
人もいないし、黙々と解いてみる。

module Chapter2
import StdEnv

// 1
odd = isEven o ((+)1)

// 2
next :: (Real, Real) -> (Real, Real)
next (_, y) = (y, y/10.0)

reachZero :: (Real, Real) -> Bool
reachZero (_, y) = y == 0.0

Start = eps
where (eps, _) = until reachZero next (1.0, 1.0)


ワンライナーだとこんな感じか。さすがに汚い。
Start = fst (until (((==) 0.0) o snd) (\(_,y) = (y, y/10.0)) (1.0, 1.0))

94 :93:04/03/17 00:27
// 3 (かなーり手抜き)
countday :: (Int,Int,Int) (Int,Int,Int) -> Int
countday now bth = absday bth - absday now

absday :: (Int,Int,Int) -> Int
absday (d,m,y) = (y-1)*365 + (y-1)/4 - (y-1)/100 + (y-1)/400 + sum (take (m-1) (months y)) + d

months :: Int -> [Int]
months y = [31, if (leap y) 29 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]

leap :: Int -> Bool
leap y = divisible y 4 && (not(divisible y 100) || divisible y 400)

divisible :: Int Int -> Bool
divisible t n = t rem n == 0

Start = countday (20,2,2004) (20,3,2004)


// 4
mapfun :: [(a->b)] a -> [b]
mapfun [] x = []
mapfun [f:fs] x = [f x : mapfun fs x]

Start = mapfun [sum, avg, prod] [1..10]

95 :デフォルトの名無しさん:04/03/18 01:56
CleanIDEのエディタに日本語入力すると文字化けする(´・ω・`)

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

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


ダメ文字って、Cleanのパーザをいじらないと対応できないのかな…

96 :デフォルトの名無しさん:04/03/19 13:50
ASCII以外には全く対応してないのが現状。
UNICODE担当(?)の人は、なんか違うことやってるので期待できない。

97 :デフォルトの名無しさん:04/03/20 05:24
>>96
そうですか…日本語の扱いは少し面倒ですね。

http://sky.zero.ad.jp/~zaa54437/programming/clean/CleanBook/part1/Chap3.html#sc55
淡々と解いてみる。そろそろ難しくなってきたかも。この先にはAVL木の実装とか面倒臭い問題があるなぁ…
// 1, 2, 4, 5
CountOccurences :: a [a] -> Int | == a
CountOccurences c xs = length [x \\ x<-xs | x==c]

MakeFrequenceTable :: [a] -> [(a, Int)] | Eq a
MakeFrequenceTable xs = [(x, 100*CountOccurences x xs / length xs) \\ x<-removeDup xs]

myflatten :: ([[a]] -> [a])
myflatten = foldr (++) []

Permutations :: [a] -> [[a]]
Permutations []= [[]]
Permutations [x:xs] = [zs \\ ys <- Permutations xs, zs <- interleave x ys]

interleave :: a [a] -> [[a]]
interleave x ys = [insertAt i x ys \\ i <- [0..length ys]]

// 3.
(==) :: (s,t) (s,t) -> bool | Eq s & Eq t
(==) (a,b) (c,d) = a == c && b == d
右辺には2つの(==)があるが、1つめは型s、2つめは型tに対して定義された(==)である。左辺で定義した(==)は、型(s,t)に対して適用される。
この式にある3つの(==)は、すべて属する型が異なっているため別々の関数である。したがって再帰的ではない。

(==) :: [s] [s] -> bool | Eq s
(==) [x:xs] [y:ys] = x==y && xs==ys // セクション3.1.2より抜粋
右辺には2つの(==)があり、1つめは型s、2つめは型[s]に対して定義された(==)である。左辺で定義した(==)は、型[s]に対して適用される。
左辺と右辺に同じ型に属する(==)がある。この2つの(==)は同じ関数である。したがって再帰的な定義である。

98 :デフォルトの名無しさん:04/04/09 16:53
Genericの世界は濃いね。

99 :デフォルトの名無しさん:04/04/10 23:45
Haskell、Clean辺りだとまだましなのかもしれないが、
関数型言語は思わぬパフォーマンス上の失策をやらかしてそうで怖い。
扱いきれない感がある。もっとクンフーを積まねば・・・。

100 :100:04/04/16 22:32
記念くぁwせdrftgyふじこ

90 KB
■ このスレッドは過去ログ倉庫に格納されています

★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.02 2018/11/22 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)