関数型プログラミング言語Haskell Part7
・日本語の扱いについて Haskell98によると、Charは一つのUnicode文字を表す(6.1.2)。 これに従って、比較的新しいHugsやGHC(6.4系を含む)ではCharは32ビット整数になっている。 ただし、どちらも入出力に際しての変換が完全でない。具体的には、 ・ソースコード中の文字列リテラル ・System.IOライブラリでの入出力 が問題になる。 1. GHC6.4.2以前 ソースコード・入出力ともLatin-1を仮定する。Latin-1ではバイト値と コードポイントが一致するので、入力時には外部エンコードの各バイトがそのままCharに 入り、出力時にはCharの下位8ビットのみが出力されるような実装になっている。 このため、あるエンコーディング(Latin-1とは限らない)の入力をgetLineで受け取り、 それをそのままputStrで表示すれば、入力時とおなじエンコードにおいて正しく表示される。 これを利用して、[Char]を、本来のコードポイントの列としてではなく、特定のエンコードの下での バイト列として使うことができる。ただし文字列リテラルについては、GHCはLatin-1として 不正な文字を受け付けないので、EUC-JPのような例外を除くと、単純にリテラルを使うことはできない。 2. GHC6.6 ソースコードにはUTF-8、入出力にはLatin-1を仮定する。このため、EUC-JPでリテラルを直に 書くことはできない。 (続く)
(続き) 3.最近のHugs(非WindowsかつCのwchar_tがUnicodeの環境、というかLinux) ソースコード・入出力ともロケールのエンコードを利用する。 4.最近のHugs(Windows) ソースコード・入出力ともLatin-1を仮定する。ただし文字列リテラルにShift-JISを使ってもエラーにならない。 5.最近のHugs(それ以外) 未調査。 ・結局どうするか。 規格どおりにCharにUnicodeを入れるか、Charを単なるバイトとして扱うかの二択。 i. CharをUnicodeとして扱う (3)以外の場合入出力で変換が必要。(2)または(3)以外の場合文字列リテラルでは 明示的なエスケープ(たとえば"\22234")が必要。 ii. Charをバイトとして扱う (3)ではファイルをバイナリモードで開くなどの対策が必要。(1)でEUC-JPを使う場合と(4) を除き文字列リテラルでは明示的なエスケープ(たとえば"\143\153")が必要。 lengthやisAlphaのような関数、およびwin32パッケージの関数(win32API)が正しく動作しない。
6 :
デフォルトの名無しさん :2007/03/18(日) 19:12:44
>>1 乙。
で、前スレのネタを投下
989 名前:デフォルトの名無しさん[sage] 投稿日:2007/03/18(日) 16:51:08
hoge (x:xs) = fuga x : hoge xs
は、
データ構造の実装を直接触る、汚い・忌むべきコードなんだよ!
hoge xs = cons (fuga.head xs) $ hoge.tail xs
みたいにちゃんと関数で書くべきなんだ!!
もちろん、
bar Just a = foo a
bar Nothing = baz
もダメダメだ!!!
単なる皮肉だと思うけど
じゃあそれが出来ないStringableがダメダメって事で。
型クラスとかを弄った程度じゃどうにもならん。 (:)の引数にMyStringも取れるようにしようと思うと、 class List container element | container -> element where (:) :: element -> container -> container instance List MyString Char where (:) = cons_mystring といった感じで(:)を総称関数にしておかないといけないけど、無理。 もし、それが出来るようになったとしても、パターンマッチは出来ない。 だって、(:)はMyStringのデータ構築子じゃないから。
データ構築子じゃないとマッチングできないなら、 演算子でマッチングできるようにしてしまえばいいじゃない。 ただし、逆関数を定義する条件で。
11 :
デフォルトの名無しさん :2007/03/19(月) 03:39:45
機能的にはそれで解決としても、性能的には。。。??
12 :
デフォルトの名無しさん :2007/03/19(月) 05:57:58
13 :
初心者 :2007/03/20(火) 06:49:06
パターンマッチのコード書いてみたけどうまくいきましぇん blueと打ってもblueと返ってきます なんででしょーか main = do cs <- getContents putStr $ aaaa cs aaaa :: String -> String aaaa cs = if cs == "blue" then "sky" else cs
話題にしてるHaskellのパターンマッチではなくて、Stringの比較ね。 putStr $ aaaa cs を putStr $ aaaa.head.lines $ cs とかしたらskyと返るかと。 あるいは、getContentsをgetLineにしてとか。
どういう意図でgetContentsを使ったんだろ・・・。 延々とユーザーに入力させたいのか、入力は1回だけでいいのか。
延々と入力させたいなら interact aaaa でもOKだな。
17 :
16 :2007/03/20(火) 12:55:26
OKじゃないや。interactの動作を勘違いしてた。
18 :
13 :2007/03/21(水) 00:01:34
ふつうのHaslekellプログラミング読んで、 map関数までしかやってないから、自然にgetContentsになりました なんすか、aaaa.head.linesって
linesしたものをheadしたものをaaaaする関数。 ふつけるにも出てない訳がない。
え 「.」も「$」も同じ効果があるの?
($) :: (a -> b) -> a -> b $は最後までの括弧の代わり。 x$yの値は、(値yでの)関数xの「結果」。 (.) :: (b -> c) -> (a -> b) -> a -> c .は関数の合成。 x.yの値は、関数yの結果を関数xに掛ける「関数」。
×掛ける ○適用する
難しいよママン
a $ b $ c $ d は (a . b . c) d と書ける。 mapとかで処理を渡すときに map (\x -> a $ b $ c $ d) と書く代わりに map (a . b . c) とちょっとだけ楽ができる。 日本語で読むと「cしてからbしてaする」。 なぜか普通のaしてからbしてcするようなやつはない。>>=が似たようなもんだけど。
map (\x -> a $ b $ c $ d) の時点で意味不明な僕はスレ違いでしょうか
それを読んで意味不明でもスレ違いではないが、 それを理解すべく調べて考えようとしないなら板違い。
×(\x -> a $ b $ c $ d) ○(\d -> a $ b $ c $ d) ってことでは?
>>24 > なぜか普通のaしてからbしてcするようなやつはない。
つControl.Arrow
map (a >>> b >>> c)
彼女とはaの前にcしちゃいました
でもお金はきちんと払いました
31 :
デフォルトの名無しさん :2007/03/22(木) 15:19:29
GHCでSDLを使おうと思って、
ttp://hackage.haskell.org/cgi-bin/hackage-scripts/package/SDL-0.4.0 にあるSDLのラッパーをインストールしようとしたんですけど、
下みたいになって途中で止まっちゃうんですけど、何ででしょう……。
C:\downloads\SDL-0.4.0>runghc Setup.lhs build
Preprocessing library SDL-0.4.0...
C:/ghc/ghc-6.6/libHSrts.a(Main.o):Main.c:(.text+0x1b): undefined reference to `_
_stginit_ZCMain'
C:/ghc/ghc-6.6/libHSrts.a(Main.o):Main.c:(.text+0x3f): undefined reference to `Z
CMain_main_closure'
collect2: ld returned 1 exit status
linking Graphics\UI\SDL\General_hsc_make.o failed
command was: C:\ghc\ghc-6.6\bin\ghc.exe -lSDL Graphics\UI\SDL\General_hsc_make.o
-o Graphics\UI\SDL\General_hsc_make.exe
Setup.lhs: got error code while preprocessing: Graphics.UI.SDL.General
>>31 念のために聞くけど、buildの前にconfigureしてるよね?
33 :
31 :2007/03/22(木) 16:30:23
はい、configureはしてます。長くなると思ったのでログは書きませんでしたが、いちおうこんな感じで。 Configuring SDL-0.4.0... configure: C:\ghc\ghc-6.6\bin\ghc-pkg.exe configure: Dependency base-any: using base-2.0 configure: Using install prefix: C:\Program Files configure: Binaries installed in: C:\Program Files\Haskell\bin configure: Libraries installed in: C:\Program Files\Haskell\SDL-0.4.0\ghc-6.6 configure: Private binaries installed in: C:\Program Files\SDL-0.4.0 configure: Data files installed in: C:\Program Files\Common Files\SDL-0.4.0 configure: Using compiler: C:\ghc\ghc-6.6\bin\ghc.exe configure: Compiler flavor: GHC configure: Compiler version: 6.6 configure: Using package tool: C:\ghc\ghc-6.6\bin\ghc-pkg.exe configure: Using ar found on system at: C:\ghc\ghc-6.6\bin\ar.exe configure: No haddock found configure: No pfesetup found configure: No ranlib found configure: Using runghc found on system at: C:\ghc\ghc-6.6\bin\runghc.exe configure: No runhugs found configure: No happy found configure: No alex found configure: Using hsc2hs: C:\ghc\ghc-6.6\bin\hsc2hs.exe configure: No c2hs found configure: No cpphs found configure: No greencard found
34 :
デフォルトの名無しさん :2007/03/25(日) 04:38:43
で、Stringableはリストになるの?
型が充実してるって言うから、ちょっと勉強してみたけど、 簡単に実行時例外が発生するじゃん。なんだよこれ。 コンパイルが通れば論理的な誤り以外、 ほとんどバグが取れてるのかと思ったのに。 実行時に読み込むデータとかの誤りなら仕方ないにしても、 そんなのない静的にすべて決まってるプログラムでも 実行時例外が起きえるなんて、全然だめじゃんwww
36 :
35 :2007/03/25(日) 14:46:59
そっちのスレは見てないんだが head [] が実行時エラーになるという話を言っているのかな。 HLIST のような方法を取ることでその辺は解決可能じゃないかと思うんだけど、 どうだろう(head [] は型エラーとして検出できる)。
同じモジュール内で、複数の代数的データ型に、 同じ名前のフィールドラベルを持たせるのはダメなんでしょうか。 セレクタがぶつかっているようです。 フィールドラベルを付けずに、classを作ってセレクタ相当の関数をいちいち実装するしかないんでしょうか。 セレクタはそれでよいとして、フィールドラベルを使ったパターンマッチはどうすればよいでしょうか。 型だけだと、それが何であるのかの情報が(セレクタしか)なくなって、可読性に不安を感じてしまいます。 あと、ふつけるを読了したのですが、 この後はHaskell98Reportを読むしかないのでしょうか。 かなり古くなってるみたいですけど。
>>38 >同じ名前のフィールドラベルを持たせるのはダメなんでしょうか。
ダメ。
>フィールドラベルを付けずに、classを作ってセレクタ相当の関数をいちいち実装するしかないんでしょうか。
>セレクタはそれでよいとして、フィールドラベルを使ったパターンマッチはどうすればよいでしょうか。
フィールド名になんらかの接頭辞を付けて区別するのが常套手段だと思う。
フィールド名の名前空間がモジュール全体だと考えれば納得しやすいかもしれない。
それでも馬鹿馬鹿しいことには変わりないので、改善案がいくつもでていたはず。
>型だけだと、それが何であるのかの情報が(セレクタしか)なくなって、可読性に不安を感じてしまいます。
意味が分からん。
>この後はHaskell98Reportを読むしかないのでしょうか。
なんでも好きなものを読めば良いと思うが、Haskell98のうちふつけるで
取り上げられていない部分を知りたいなら、「やさしいHaskell入門」はどうだろう。
半分以上は既に知っていることだと思うので、飛ばしながら。
レポートは言語の詳細な規定を知りたいとき以外読まなくても良いと思う。
他には、GHCのマニュアルに、GHCに実装されている言語拡張について書いてある。
>かなり古くなってるみたいですけど。
Haskell98についての現役の定義であって、その意味では古くない。
ただ、Haskell98への拡張で、かなり広く使われている機能もあるので、
それについては別のものを読む必要がある。
Haskellの界隈いったい最近どうなってるの? なんか雰囲気がどんどんどんどん変になってるんだけど。 圏論もういいじゃん。普通にプログラミングとかやらねーの?
普通にプログラミングやってるが。
Fランク大の落ちこぼれが 東大学部生の教養プログラミングに 物申す展開か
43 :
デフォルトの名無しさん :2007/03/31(土) 17:33:50
> Fランク大の落ちこぼれが > 東大学部生の教養プログラミングに > 物申す展開か インターネットだと顔が見れないし、無駄に距離感が無いし、 こういう認識は大事である。
44 :
デフォルトの名無しさん :2007/03/31(土) 20:52:49
>>40 今後の関数型言語界のために基礎を築いている段階。
ゆくゆくの関数型言語プログラミングがどうあるべきかを論じるには基礎研究が大切なの。
お分かり?
H++マダー?
「圏論もういいじゃん」は「基礎研究が大切なの」と反論されて当然ですが、 「普通にプログラミングとかやらねーの?」はまっとうな質問だと思います。 仮説検証用のごく小さなプログラムしか必要としない研究もあるでしょう。 しかしプログラミング言語は本来コンピュータに何らかの仕事をさせる手段であって 理論研究のためだけの道具ではないはずです。 大きなソフトウェアを実際に書いてみないと発見できない問題はたくさんあります。 昔、IBMが九州医大のシステムをSmalltalkで作ろうとしてSmalltalk界の有名人を 人月数百万円でかき集めたにもかかわらず失敗に終わった事がありました。 言語仕様を隅々まで把握しアーキテクチャに関する持論を唱えていた有名人達は 大規模システム開発を成功させる方法を知らなかったという事になります。 関数型言語が実用言語として広く使われるようになるためには理論研究だけでなく 実用ソフトウェアを書いて問題を見つけていく事も欠かせないと思います。 私からも改めてお聞きします。 Haskellでどんなソフトウェアを作っていますか?
九大病院のSmalltalk事件はデスマーチが先。その状態からSmalltalk界の グルをかき集めたけれど、手遅れだったというだけのこと。 それから、そのグルというのは現場の人達であり、理論屋ではなかった。 そもそもSmalltalkは学術的な面で特段価値のある言語ではないからね。
まず、勘違いしないでほしいのは、haskellは研究用の言語ということ。 数多くの関数型言語があふれる中で標準として決められた言語。 研究の集大成としての言語。 実用が二の次だというのはしかたがないと思う。
>haskellは研究用 マジデスカ (゚ロ゚)!!!! 職業プログラマーとしてはショック
, - ─- 、_ / `丶 rー‐<::/ ン-―ー- 、 、 \ {(こ 〆.:::/ ____ \ ヽ..::::ヽ __/'´/ 〃7了.:.:.:.:.:.:.:.:`ヽ.j ::ヤ¬寸 /,イ>/ .:::/,':::{:::::!:::::::::::::::::ヽ ::|:. ::::Vヽ_,イ レ/,イ ::/ :{:ハ\{ ::、::ヽ ::::::}::_|_: :::::l >::| {/::| :!{.::ィ'f坏ト\{ヽ ,><ム:!:::::::: Kヽ:ト、 |::::ヽ::i:ヽi. r'_;メ ヽ´ イ圷ハ|::::::::::|\/ヽ> |i:::::::トl::ハ. , r';ン´j::::::::: l: V |i::::::::!:::: ヘ {>ーァ /:!::::::::/::/ lN:ヽ:ヽ::',:::ヽ、ヽ _,ノ ,.ィ::/::::::/ / ヾ /}::}八::::ヽ>.-‐か/7::/∨ あんた二十歳超えてるくせに処女なんだ? r<¨ リ\`ヽ、\__ { 〉/イ l )} いつもみたいに寂しく一人で寝てなさいよ f⌒ \ \ヽ )' \ニニ∧ | |!彡ヘ 私はキョンに抱きしめられながら寝るからさあ | \ ヽム ヽ‐' .| | }ヘ,__,イ r-ヽ  ̄ )\ Vrj/ ̄ヽ ヽ | \ // /)ミ ー-∨ / ̄ ヽ | (>―‐'/ /勺ヽ¨ア / } | \三三‐'ノ ^ヽ/ /-―一 '
【注意と警告】
関数型言語コミュニティの一員として、大切なお知らせがあります。
>>46-47 は、現実世界で多数のトラブルを巻き起こしている人物(東京在住44歳)
ですので、きっぱりとスルーするのがよろしいでしょう。
公衆の場でいきなり赤の他人相手に、第三者の失敗例を持ち出して
ベラベラと中傷しだす人物の人間性などというものは、容易に想像がつく事ですし、
また万が一そのような人物と関わったら、多大なトラブルと時間的消耗を蒙る
事は、火を見るより明らかです。
実際これまで現実のビジネスで、多くの人々が彼の言動に迷惑してきました。
その中には、彼と一緒に仕事をしていた一流大学出身の経営者や、エンジニア、
サイエンティスト、大学病院関係者等も含まれています。
彼の人間性を確認するには、ネット上での彼自身がこれまで行ってきたスレ荒し
の例を見れば十分でしょう。
・デザインパターンスレ
http://pc11.2ch.net/test/read.cgi/tech/1141846078/ 特別な利害関係がきっかけで、繰り返し議論妨害を行っているのが彼です。
彼の議論妨害には、精神性疾患の俗称の連呼という特徴があるので一目瞭然です。
私が察するに、彼の症状は「自己愛性人格障害」と呼ばれるものと存じます。
ここでは詳しく述べませんが、ピンときた方は症例を調べてみるとよろしいでしょう。
最終的な判断は聡明なみなさんにお任せ致します。それでは。
なんという初厨の断末魔
53 :
デフォルトの名無しさん :2007/04/01(日) 05:57:29
>>52 おい、おっさん 終わってるのはおまえだ
はやく病院に逝って適切な処置受けりゃえぇーのに(w
HaskellでRSSを引っ張って最新の数件表示するだけのサンプルに挑戦してるけど かれこれ1ヶ月以上掛かってる。w XML操作 → HXTでArrowの基礎から挑戦 日付のパース → MissingHを利用 表示 → 今はCGIライブラリで妥協してるけど本当はHAppS使いたい 難しすぎるわ。('A`)
56 :
デフォルトの名無しさん :2007/04/01(日) 07:05:45
お前の学力では無理だから諦めろ 普通一ヶ月もあればツールやアプリの一本位書ける。
そりゃどんだけエネルギーを割いてるかにもよるだろ。 ってかなんで煽ってんの?
お前スレに張り付いてそんなことばかり言ってるな。 いい加減消えろ。
お前にはムリ
>>55 で、最後に日本語の扱いで泥沼になりそうだな
C や Fortran プログラムで保存したバイナリファイルから、 データを読み込んで来て、ビットデータの処理をして int や double のデータを取得するにはどうするの? Lisp では、read-byte で読んでファイルを読んで、logand 等を使い、 double 等のデータを取得出来る様にはできてるんだけど、 Haskell ではどのように?
まじめな研究に使う研究材料ですので、無駄です。
>>62 「ビットデータの処理」って何?
バイナリファイルの操作の道具は整ってない。
とりあえずopenBinaryFileでファイルを開いて、
hGetByte :: Handle -> IO Word8
hGetByte h = liftM (fromIntegral . ord) $ hGetChar h
みたいなのを使ってバイトを読む。
ビット演算はData.Bitsを使う。
あるいは、メモリを直接操作することに耐えられるなら、hGetBufを
使ってバイナリデータをメモリに読み込み、Foreign.Storable.peekで
IntやDoubleとして読み出す。
Why People Aren't Using Haskell
http://www.jelovic.com/articles/why_people_arent_using_haskell.htm 初代スレの932が5年前にリンクした上記ページは
Haskell普及のためにHaskellコミュニティがすべき事を提案しています。
1.十分なライブラリを含んだ標準版Haskellディストリを作る
2.研究者サークルから踏み出して熟練プログラマに対して宣伝を行う
3.DDJのような刊行物に記事を書く
4.Haskellで書かれた現実世界向けプログラムを発表する
2冊の入門本が出版されてblogで話題になったおかげで知名度は上がったと思います。
ライブラリの整備が進めば言語ユーザが増えていく事はGaucheが証明しました。
ユーザに言語学習を促すキラーソフトが言語をメジャーにする事はRoRが証明しました。
Haskellも役立つコードを増やせばさらに世間に普及するはずだと信じています。
マルチバイト文字の出入力がまともにならん限り英語圏以外での流行など夢のまた夢。
勝手にしてくれ。 Lispの時も、当初は数学的な計算モデル=ラムダ計算 を コンピュータ上で実行するという奇妙なプロジェクトだったが、 実用性を云々して勝手な拡張を始めた段階で「手続き型言語」に堕ち、 そして最後には、特殊な実行メカニズムと市場の狭さが災いとなって 多数派CPU上で実行性能の出ない1マイナー言語となった。 もしHaskellの設計意図を解せぬ人が寄って集ってHaskellをダメにしたら、 その時はまた新しい研究成果を取り入れて、新しい純関数型言語の標準を決めればいい。 だがそんな愚かな事を繰り返す人間はごく一握りしか居ないだろう。 (SymbolicsやLMIでバブル体験した人を除いて) Lisp, Scheme以降の関数型言語で、実用性を云々するならOcamlでも使っておけばいい。 あれなら10年以上前からゲームもWebブラウザも作っているし、普及度も高い。(Linux配布を通じて)
68 :
デフォルトの名無しさん :2007/04/01(日) 14:24:29
職業プログラマを自称するLisp厨、Prolog厨には イタイのが多いな。
実験的言語、研究用言語に実用性を云々する厨房が寄って来ると 研究用テストベッドの機能が低下して、新しい物を生み出せなくなる。
研究目的と実用目的の両方に対応することは本当に出来ないの? それができないなら早いとこforkしてほしいな。
つ Ocaml
Haskellでさえ使っていてストレスを感じるので Ocamlなんて話にならない。
pupupu :p えぇーっと。 そのストレスは「非実用性」に起因するんじゃなかったの?
>>72 OCamlの方が君には楽だと思うよ
Cで慣れてる子はHaskellの方が異質に感じるはず。
75 :
デフォルトの名無しさん :2007/04/01(日) 15:47:38
つまり、関数型言語ってのは、 実用に耐えない、穀潰し研究者達の内輪向け妄想オナニー理論ということ。
あのさ議論中すまないけど、
>>75 は ↑の方で誰かが警告書いてくれた「精神性疾患」の人なんだ。
相手にせずスルーしとくのが、マナーだよ。
親切な回答にいちいち逆切れしてスレを汚し出すようじゃ 誰にも相手にされないよな。
79 :
デフォルトの名無しさん :2007/04/01(日) 16:01:30
>>77 ズバリ言われちゃったからって、ひどい逃げ口上だな。
実用性を求めたらダメになるって事は、ポテンシャル的に実用に耐えないって事だ。
実用に供され得ない物の研究は、工学においてはオナニーと呼ばれても仕方ないし、
幾ばくかでも国費を使っているなら、それは穀潰し行為という事だ。
バカばっかだよな
困った人が来ちゃったねw
83 :
82 :2007/04/01(日) 16:06:02
ここで暴れてる人は、
>>51 に書かれてる人って事で
スルー推奨
この前 On Lisp の訳本が出版されたけど Haskell にもそう言う本が欲しいね 今のところ入門書が2冊出ているだけだしこのまましぼんでいっちゃうのは惜しい 昨今の高級スクリプトブームで Lisp や関数型言語が注目されはじめているけど 一過性のlブームで終わりそうでやだなぁ
> 一過性のlブームで終わりそうでやだなぁ それは無いって。 毎年毎年、教育や研究で使う学生さんが量産されてるから。
Haskellniおいて一過性のブームというなら、すでに終わってるんじゃないか? あんまりブログでも書かれなくなったし
俺自身もごく初期に夏季集中講義かなんかでこの系統の言語を学んだし。
88 :
デフォルトの名無しさん :2007/04/01(日) 16:15:11
>>84 おいおい、Lispみたいな下等言語と一緒にするなよ
shopingサイト作った程度のドカタがグル扱いされるような言語と、
ちゃんとした世界中の研究者が利用する研究素材は違って当然。
研究素材なんだから、ドカタに普及する意味自体がない。
数学基礎論とか地味ぃ〜な感じの分野のセンセが 学生さんに自分の分野に目を向けさせて、 引っ張り込むためのツールとしては機能してた気がする。 教育研究用ツールってのは、それでえぇんでない?
92 :
72 :2007/04/01(日) 16:24:53
>>73 俺がストレスに感じることを「非実用性」と定義するなら、
Haskellは俺の知る中で最も実用的な言語だな。
>>74 お前の推測はどうでもいい。
そもそも俺個人の好みが問題なんじゃない。
「実用性を求めるならOcamlを使え」という議論が乱暴だと言っている。
なんという非現実的な言葉遊びスレ
RSS取得程度のプログラム作成に1ヶ月掛かる糞言語なんだろ? Perlならものの数分だよ。2ちゃんねるやmixiを支えてる実用言語だけのことはある。
95 :
デフォルトの名無しさん :2007/04/01(日) 16:33:18
>>92 あんたみたいな厨が、言語の価値を殺す。 Lispの轍を踏ませたいの?
“On Lisp”はLispのボトムアップによるスケーラビリティについて書いているけど、 Haskellにもそういった哲学ってあるの?
404 Not Found
新しい言語はちょっとかじってみたりするんだけど 大抵ライブラリが整備されていなくてあまり使わないんだよな。 .NET Frameworkがそれを解決してくれるかと思うんだけど なかなか流行って行かないみたいだし。 というわけで結局無難な選択になってしまう。
>>67 実用性を気にして勝手な拡張をしからLispが廃れたというのは違うと思います。
今Lisp上で研究を進めたいなら、不可欠でない複雑さを切り捨てた
Schemeをテストヘッドにすれば良いはずです。
関数型言語研究の進展に伴いLispが研究の出発点としてふさわしくなくなったから
そこまでの研究成果を取り入れたHaskellが作られたと理解しています。
Haskellが実用言語になろうとなるまいと、その後の新しい研究成果を取り入れて
さらに新しい純関数型言語の標準を決める事はいずれまた必要になると考えます。
実用化に興味がない人がいてもいいとは思いますが、
良い言語であれば実用化を目指す人が現われるのもまた当然の事です。
研究成果が世間に広まるを嫌がるのでは一体何のための研究なのでしょうか。
>>100 >>67 =
>>95 なのではないでしょうか。
それなら具体的な事はすでに書かれています。
>>103 キミが実用Haskellを開発すればいい。
評価は世間が決めてくれる。と思うよ。
ただ既存のコミュニティは研究コミュニティだから、
迷惑はかけないで欲しい。約束だよ。
MITのLispコミュニティ空中分解の原因は AIブームによる研究者の起業と引き抜き。例えばSymbolicsとLMI。 かつての自由なコミュニティの崩壊を目の当たりにしたRMSが、 奮起してGNU宣言をして、その精神が今のオープンソースの 一つの源流となった。 ってそんなラヴ&ピース&ヒッピーな世界とは違うか。関数型言語コミュwは いずれにせよ、いつの時代にも 虎の威を借りるネズミって居るもんだな。 こんな所でブツクサ言わずに自分でやればいい事なのにw
実用性ってなに?
> 研究成果が世間に広まるを嫌がるのでは一体何のための研究なのでしょうか。 それはないな。
109 :
デフォルトの名無しさん :2007/04/01(日) 19:19:40
そもそも実用性が低いから研究になるんだろ? コボルの研究とか大学でするか?
つまり、関数型言語ってのは、 実用に耐えない、穀潰し研究者達の内輪向け妄想オナニー理論ということ。
話が逆だな。詐欺師お得意の詭弁って奴か。
Haskellが理解できなくて逆恨みして荒らしてるのですね?
>>109 話が逆だな。詐欺師お得意の詭弁って奴か。
とりあえず、Haskellのような関数型言語でプログラミングするメリットを教えてください 今までよりプログラマは幸せになれるの? 幸せになれないのに研究なんかしないよね。
逆ってどういう事?どこか詭弁
言語やOSの研究でプログラマが幸せになると思ってんのか? 労働法の研究の方がはるかに幸せになるな
お前ら学問・理系のどっか逝っとけ
特定分野のプログラマが幸せになるのでもいいよ。 とにかく、誰かのためにならない研究なんて誰も注目するわけがない。 でも、注目している人がいるということは何か良いことがあるからでしょ? それは一体何?
>>117 ↑の方の警告メッセージで指摘されてる人が一人で暴れてるだけだから、スルーしとけ。
なんかジエンがほとんどっぽいなw
>>85 いや、そういうのは判るんだけど最近の注目度はちょっと異常だなと思って
高級スクリプトって書いたけど Pugs の影響も結構大きそうだね
ん?実用的な事例あるじゃないw
>>86 そうだねぇ、一気に引いた感じがする
今後本が出版するかも怪しいなぁ
Lisp ブームの方は結構長く続きそうだけど
前の話に戻るけど日本語文字列の扱いとか固まらないと国内じゃあまり弄る人いないかも
20年前と比べてプログラマは幸せになってるか? 答えは否だ。 単金はやすくなり、納期は短くなった。使ってる言語やツールが進歩したにもかかわらずだ。
実用性が上がると困るって、何がどう困るんでしょうか。
プログラミングが簡単になる→プログラミングは誰でもできる仕事だと世間が考える→使い捨てOK でも実際は質が悪いプログラムが量産されているだけにすぎない
結果的に実用性が無くなるってのはあるだろうけどワザと実用性をさげる意味はないだろうなぁ まぁオナニーでもなんでもいいじゃないか 好きという理由で使う言語ってのもあって良いと思うよ それに関数型の考え方ってのは他の言語でも役に立つしねぇ
>>103 > テストヘッド
とりあえず、おまぃは英語ができない事はよく判った。
難しくて勉強が進みません。 私は才能が無いので死ぬべきです。 もう生きているべきではありません。 私はクズです私は存在する意味がありません。 私は世界の敵です。私は無意味です。 私の存在は世界の害悪です。 私は全ての存在の敵です。
オレと同じでキミも暇だなw
長々やってるこの流れも、大堀淳教授の講演スライドにある 一般ユーザ 「噂に違わぬtoy言語だ!」 研究者「関数型言語の美しさをわかってないやつだ!」 という2行にまとめることができる。
これ単なる厨房の荒しを装ってるんだけど、 実際は44歳の人が荒してる、って事だよね? なんで研究用言語の存在を(ry
やねうらおって猿山のボスでしょう よいしょしてくれる人がたくさんいてよかったね!
はいはいつれたつれた。
やねうらお? ヤツは何かやってるの?
ヒント:関係ない話題はOpenGLスレでどうぞ
そして誰もいなくなった
136 :
デフォルトの名無しさん :2007/04/01(日) 22:06:11
Haskellが研究用言語ってどういう意味? 関数型言語の研究成果が「盛り込まれてる」ってのは聞くけど、 それはHaskellが研究用と言うことを意味しない。 大体、研究ならモデルや理論構築で済む話であって、 わざわざ言語仕様どころか実装まで作るって、実用以外になんの目的があるのよ。 今までにない新規のモデルなり理論があって実装も作ってみよう、程度なら分かるけど、 公式使用は10年も前だし、繰り返されるGHCのバージョンアップは、 既存にない新理論や新モデルの実装としてなされているわけ? 新しいバージョンは、そんなに新研究といえるような新トピックに溢れてるの? 第一、研究用なら、ライブラリなんてこんなに要らないじゃん。なんでこんだけ付いてくるの? もしかして、研究用って言ってる人の「研究」って、学部の演習のこと?そういうのは教育用って言うんじゃないの?
頭悪
うきよばなれしたすれだなあ しがつばかってばかなことをいっぱいいうひなんだったっけ
なあきょうだい、このおさんはいったいぜんたい なんで けんきゅうようげんご というものを めのかたきに してるんだぜ?
世の中にはね、一流の人間ばかり居る訳じゃないんだよ。 2流の学生に、既存のカビの生えた理論を実装させてそれを「研究」と称するのはのは常套手段。 3流の学生になると、マイナー言語で何かプログラムを書く事まで「研究」になる。 研究用言語ってちゃんとそう言う需要があるんだよ。
ガイ・スティールもLispの実装に対する論文を書いてるんですが? 彼も2流なんですか?
なんというゆとりの文系的思考w
>>143 GLSはSchemeチップもやってた。
きっと半導体工場で作業服着る底辺工員に違いないw
効率のよい実装も十分研究対象になると思うがね。 そこまでいうんなら、 その一流の論文とやらを教えてくれんかね。
あほだなぁ。Lispは実用言語だろうが。実用なら実装は重要だ。 実用にならない物の実装方法なんて、それ自体何の意味もない。
Lispの何処が実用言語なんだよ。 そんなことより、早く論文だせよ。
>>149 うわ、頭悪そう(笑)
そんなに論文が好きなら、Haskellでのまともな研究論文を自分が晒せば?
Haskellを研究用言語とか言っちゃうのって、研究室入り立ての学部生か、Fランの院生だろ。
まさか、Lispまで研究用言語とか言うつもり?うはw
Google知識Lisperの連続登場に爆笑
ところで、論文はまだか。 それともコミュニケーションに飢えた基地外か
Google厨 vs Google厨
既視感のある発言の連発に爆笑
っつか他人のセリフ、パクリまくりの
自作自演しまくりじゃんこの厨房
やっぱ
>>51 未満だな
やっぱ、おまえ、上にあったスレの
>>1 だろ。成長しねぇなw
(キチ外)パワーは衰えてるけどww
>>152 見たけど、
昔からのアイデアをHaskellに移植してみました系の論文ばっかに見えるんだけど、
どれがまともな研究なの?
それHaskellの実用性を逆に証明してないか? quantum programming language QML [AG04, AG05], developed in Haskell って書いてあるぞ
どんなに大層な事をいっても相手をキチガイといったり罵倒したりしてればまともな話にならないと思うよ 相手の徹底的に打ち負かしてすっとしたいのは判るけど自分にとって何のプラスにもならないし
>>157 それは何かのギャグかい?
それはHaskellを実用してる例なんだが。
やっぱ、
>>150 の洞察は正解のようだなw
>>159 具体的にどの論文だ?
名前くらいかけよ。
なんて説得して聞くたまじゃないかw まともな人はもう放置だろうしオレも引いた方がいいかな 休みはほんとうに困るねw
166 :
デフォルトの名無しさん :2007/04/02(月) 00:05:56
本日のまとめ 変な人が、Haskellは研究用言語だ、実用厨は邪魔とのたまう ↓ 煽られて探して来たのは、Haskellを実用にしている内容の英語論文 ↓ 結論:Haskellは研究用言語ではない。そんなこと言う奴は、やはり馬鹿。実用OK。
↑ 【注意!】)汚れが手に付かないよう、注意して捨てて下さい。 - - - - - - - - - - き り と り せ ん - - - - - - - - - -
キミたちなかなか充実した休日を過ごしたなw
April foolは終わった さあ今年度も頑張ろう
でも、量子コンピュータ用関数型言語って面白い研究だよね。 categorical semanticsっていうのは圏論的意味論って事なのかな?
四月馬鹿はもう終わりだよ。
さぁ散った散った
>>173 お前はさっさと壷に糞を詰める作業に戻れ
ヒント: あなたの発言対象は発散しています。 アドバイス:あなたはとても疲労しています。 今晩は暖かい風呂に入り、ゆったりとした気分で睡眠をとってはいかがでしょう?
情報板へカエレ
一般向けの入門書が出版される研究用言語ってなんだよw
釣り師のおかげでスレが大繁盛です^−^
幼稚
183 :
55 :2007/04/02(月) 12:48:42
とりあえずできてるところまで晒してみる。('A`)
runXを1回済むようにできないか考えてるところ。
(実行にはHTTP, HXT, hslogger, FilePath, MissingHあたりが必要。)
import Data.List (sortBy)
import System.Locale (defaultTimeLocale)
import System.Time (CalendarTime)
import System.Time.ParseDate (parseCalendarTime)
import Text.XML.HXT.Arrow
data RssItem = RssItem { title :: String,
link :: String,
description :: String,
pubDate :: CalendarTime }
deriving (Show)
instance Eq RssItem where
a == b = (pubDate a) == (pubDate b)
instance Ord RssItem where
compare a b = compare (pubDate a) (pubDate b)
main :: IO ()
main = getRssItems "
http://www.microsoft.com/japan/msdn/rss.xml "
>>=
writeHtml "result.html" . take 10 . sortBy (\a b -> compare b a)
184 :
55 :2007/04/02(月) 12:49:51
getRssItems :: String -> IO [RssItem] getRssItems url = runX $ readDocument [(a_validate, v_0)] url >>> getXPathTrees "/rss/channel/item" >>> ( getElemText "title" &&& getElemText "link" &&& getElemText "description" &&& getElemText "pubDate" ) >>^ \(t, (l, (d, p))) -> RssItem t l d (parseDate p) where getElemText n = getChildren >>> isElem >>> hasName n >>> getChildren >>> isText >>> getText parseDate :: String -> CalendarTime parseDate = maybe dummyTime id . parseCalendarTime defaultTimeLocale "%a, %d %b %Y %H:%M:%S %Z" dummyTime :: CalendarTime dummyTime = let Just d = parseCalendarTime defaultTimeLocale "%Y/%m/%d" "1900/01/01" in d writeHtml :: FilePath -> [RssItem] -> IO () writeHtml path items = do runX $ makeHtml items >>> writeDocument [(a_output_html, v_1), (a_output_encoding, utf8)] path return ()
185 :
55 :2007/04/02(月) 12:50:36
makeHtml :: (ArrowXml a) => [RssItem] -> a n XmlTree makeHtml items = root [] [ selem "html" [selem "body" $ arr (map makeLink) items] ] makeLink :: (ArrowXml a) => RssItem -> a n XmlTree makeLink item = selem "div" [ mkelem "a" [sattr "href" (link item), sattr "target" "_blank"] [txt (title item)] ] 以上、連投スマソ。
print文デバッグの人か
いやむしろ、昨晩このスレで思わず、 精神性疾患患者の蔑称を叫んでしまった 自己愛性人格障害の方でしょう。
189 :
55 :2007/04/02(月) 13:52:13
>>188 スルーしておいた方がよさそうだな
またスレが荒れたらかなわない
>>189 なんで別々にするのが嫌なのか分からんが、HXTのドキュメントを見た感じでは
listA :: (ArrowList a) => a b c -> a b [c]
を使えばよさそう。
でさーHaskellのライブラリが完備されて プログラマが学習コスト0で習得できたとしたら みんなこぞってHaskellを使い始めちゃうわけ? それくらいの実力はあると?
一昨日晩は、いきなり無関係な第三者を中傷しだすし 昨日は、NGワード連発するし、いったいこの人なんなんだ?
196 :
55 :2007/04/02(月) 15:07:37
>>191 うは、ありがと。
もう少し探ってみる。('A`)
判りやすいね
198 :
55 :2007/04/02(月) 17:53:37
>>191 listAとarrLの組み合わせで、Arrow内でのsort, takeが無事できますた。多謝。('A`)
( ^ิ౪^ิ)━☞
200 :
46 :2007/04/02(月) 22:04:08
C並とはいかなくとも、Java程度の性能(実行時間とメモリ使用量)の実行コード が生成されるようになったら、みんな飛びつくと思う。
すでに実現済みだけど?
文体一緒やで
>>183 instance Eq RssItemの実装がちょっとまずいんじゃない?
日時さえ一致すれば違うサイトの情報も全部同じ扱いになっちゃうよ。
206 :
55 :2007/04/03(火) 10:29:34
>>204 並べ替えのことばかり考えてて、すっかり本来の用途を忘れてた。
linkで比較に変更します。
>>205 本格的すぎ・・・。('A`)
とりあえず解読に挑戦してみます。
お二方、レスサンクス。
207 :
55 :2007/04/03(火) 10:32:16
> linkで比較 linkとpubDateの方がいいか・・・。
代数的データ型で、クラスインスタンスをメンバ(?)にするにはどうすればいいんですか?
非標準だけど、存在型を使って、 data F = forall a. (Show a) => F a みたいにする。
存在型を使うという手もあるけれど、標準に準拠する書き方では、 data (Show a) => F a = F a みたいに型パラメータとして渡す。 この場合、 F Int と F Char は違う型になってしまうとかいうことがあり、 混同させたいときには問題だが(なので非標準な forall が導入されたのだが)、 たいていは問題ない。はず。 もちろん、宣言の方で data F a = F a のように書いておき、 F を使う関数の方で a に対するコンテキストを与える という手もある。
212 :
デフォルトの名無しさん :2007/04/07(土) 12:59:59
>>210-211 ありがとうございます。
>>211 の方法でいけました。
外部から型を指定する必要はないのでちょっとすっきりしない気がするけど、そんなもんでしょうか。
210はNot a constructor: 'forall'と言われてしまいました。
ググったら、forallは「途轍もなく難しい」とあったのでそこであきらめてしまいました。すみません。
213 :
デフォルトの名無しさん :2007/04/07(土) 18:00:15
すいません。emacsのhaskell-modeでプログラムしているんですが、 インデントの方法に関して質問があります。 例えば、次の様なソースがあった時、 import System import System.IO main = do putStrLn $ "Woud you like some coffee?(y/n)." hFlush stdout c <- getChar if c == 'y' then putStrLn "Yes,please." else putStrLn "No,thank you." thenやelseの前でTabキーを押すと、if式と同じインデントになってしまうのですが、 それだとコンパイルエラーになってしまいます。なので、今はスペースでインデントを 付けています。Tabキーで正しくインデントさせる方法がありますでしょうか?
tabおかわり
>212 そんなもんです。 forall 使うなら、 -fglasgow-exts つきでコンパイルしないとだめ(Hugsなら-98だっけ) >213 明示的に {} を使うという方法はあるにはあるが。 do { putStrLn $ "Woud you like some coffee?(y/n)." ; hFlush stdout ; c <- getChar ; if c == 'y' then putStrLn "Yes,please." else putStrLn "No,thank you." } のようにすると綺麗にインデントできる。 まぁ私は手で空白を入れたり一行にしちゃったりする方が多いけれど。
>>215 レスありがとうございます。
{}を使う方法か、手動でインデントをあわせる方法の2通りという事ですね。
他の方はどうやってインデントさせているのか疑問に思っていたのですが、
その疑問が解消されました。
>>214 は違うのか?
いや、俺はemacs使ってないからよくわからんが。
>ひろたかは何のためにPythonを使おうと思ったの? あん? 金儲けのためよ。 俺様がPyhonの本を書けば、Py厨が喜んで買うかなと思ったんだ。 が、市場調査の結果、お前らは金持ってなさそうだと判明したんで 撤退しというわけ。 世の中、ゼニだ。金持ちを相手にしないとな。 今度は関数型言語で名前を売ろうかななんて思るよ。 お舞には、無理だろうが
本なんて儲からへんよ やめとき
本で宣伝してコンサルで儲けるつうのが定番ですな。
PythonよりHaskellの本が売れるなんて思っている時点で市場調査をやりなおした方がいいぞ。
皆様お勉強中の所を、お騒がせしまして
誠に申し訳ございません、
>>220-221 の母でございます。
今夜、私がちょっと目を話した隙に、頭の弱い子が
この掲示板に何か書き込んでしまったようです。
取り急ぎ薬を飲ませて眠らせましたので、
もう悪戯をする事はないかと存じます。
本当にご迷惑をお掛けして申し訳ありませんでした。
孫がお騒がせしまして申し訳ございません、
>>223 の祖母でございます。
この朝、私共がちょっと目を話した隙に、
また頭の弱い子が この掲示板に何か書き込んでいたようです。
さきほど拘束衣を付けて施設に送り出しましたので
もう悪戯をする事はないかと存じます。
本当にたびたびご迷惑をお掛けして申し訳ありませんですた。
長いのか短いのか比較対象がないから何ともいえない。 ブレインファックの他の言語での実装も持ってきて。
朝から構ってちゃんか 暇人だな似非コンサル人種は
Haskellってサーバ書ける?シンプルなCGIは書けるだろうけど、 イベント発生時のサーバ側からのプッシュとか、 リクエスト同士でのデータのオンメモリでのやりとりとか。
HaXmlがHuttonMeijerWallaceってパーサコンビネータを使ってるみたいなんだけど、 これって、Persecに比べて何がよいの?なんか随分古そうだけど。
あの、本家のサイトにつながらないんですけど、皆さんつながってますか?
つながらない。
236 :
233 :2007/04/20(金) 22:46:40
余裕でスルーかよw
何か書いてほしいならお題くらい出せよ。 おもしろそうなら食いつく奴も居るんじゃね?
238 :
233 :2007/04/20(金) 23:17:16
普通にコピペできるけど?
下のソースをコンパイルするとエラーがでてコンパイルできません。 どうすればいいですか? --ソース import Network main :: IO () main = do sendTo "127.0.0.1" (PortNumber 9999) "test" --エラーメッセージ test.o:fake:(.text+0x7e): undefined reference to `networkzm2zi0_NetworkziSocket_zdf9_closure' test.o:fake:(.text+0x1a6): undefined reference to `networkzm2zi0_Network_sendTo_closure' test.o:fake:(.data+0x20): undefined reference to `networkzm2zi0_Network_PortNumber_static_info' test.o:fake:(.rodata+0x0): undefined reference to `networkzm2zi0_NetworkziSocket_zdf9_closure' test.o:fake:(.rodata+0x20): undefined reference to `networkzm2zi0_Network_sendTo_closure' collect2: ld returned 1 exit status GHC 6.6 Windows XP SP2
-package network
そりゃソースはコピペできるけど直接コピーできねーじゃん さっさと作れよハゲ
245 :
241 :2007/04/21(土) 18:33:23
>>242 ,244
コンパイルできました。
ありがとうございます。
それにしても、Haskellの世界は狭すぎるから、質問内容によっては素性がバレバレだな・・
ガクガクガク、、、ブルブルブル。。。w でも、 一度も公の場所に出てなくて 質問している人もいっぱいいるでしょ。
ということにしたいのですね
>>248 void はこのスレ的には いてはならない存在。
ヘ_ヘ ____________________________
ミ ・ ・ ミ
[email protected] ( ° )〜 改名しました
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
他のバカの名前挙げても おまぃのダメさ加減は誤魔化しようがない。
252 :
デフォルトの名無しさん :2007/04/24(火) 11:53:08
Parsecなのですがパース失敗時のメッセージ (line 1, column 1): のcolumn が常に1になってしまいます。 例えば以下のような感じです。 *Parser> runParser (reserved "test") 0 "" "testss" Left (line 1, column 1): unexpected "s" expecting end of "test" 考えられる原因ってなんでしょうか? WinXP、GHC6.6です。
reserved を使っているから。 その場合、識別子レベルでパースしているような感じになる。「test」という 予約語と「testss」というトークンを比較して違う、というエラーなので column が 1 になるようにわざわざしている。 (string "test") にしてみたら変わるでしょ。
>>253 おっしゃるとおり変りました。
回答ありがとうございました。
*Parser> runParser (do {reserved "test"; (string "test")}) 0 "" "test te11"
Left (line 1, column 6):
unexpected "1"
expecting "test"
255 :
252 :2007/04/24(火) 18:30:13
というか *Parser> runParser (string "test") 0 "" "te11" Left (line 1, column 1): unexpected "1" expecting "test" stringでも先頭でしたね…
Haskellってどういう処理につえーの? どういうアプリケーションに向いてんの?
HaskellはHaskellコンパイラを書くのに最適
ただし国際化対応は諦めろ
259 :
デフォルトの名無しさん :2007/04/27(金) 08:02:47
GHC 6.6.1 あげ
まだLinux版だけか・・・
>>258 よくしらんのだが国際化対策を
しないっていう理由があるの?
Windows環境って何でShift-JISなんだろ。 なんかむかついてきたぞー
UNICODEで統一すりゃいいだろ
Unicode と言っても符号化方式が色々あってだな。
UNICODE と言ってるから UCS-4 なんじゃないの
UCS-4 は Unicode じゃなくて ISO/IEC 16646 でだな。
UTF-8でもBOMありとなしがあったり、なんか統一感ないよねー
268 :
デフォルトの名無しさん :2007/04/27(金) 20:58:02
MS様に従っておけば間違いない。
早くMS潰れねーかな、かな
16646 じゃなくて 10646 だよ。typo った。
タイポ タイポ ティンポー!!
UTF-8はBOMなしが標準じゃなかったっけ。
つーかエンディアン非依存なのがUTF-8の長所の一つじゃないのか
274 :
デフォルトの名無しさん :2007/04/28(土) 01:39:55
>>273 UTF-8の場合、BOMはBOMとしてではなくUTF-8であることを示す為に利用される。
275 :
デフォルトの名無しさん :2007/04/30(月) 15:06:46
メインのサイト死んでるじゃん
復活してる
Haskell死んでるじゃん
> main :: IO () ∩___∩ /゙ミヽ、,,___,,/゙ヽ | 丿 ヽ i ノ `ヽ' / ○ ○ | / `(○) (○)´i、 | U ( _●_) ミ 彡,U ミ(__,▼_)彡ミ 彡、 |∪| ,,/ ,へ、, |∪| /゙ / ヽ ヽノ ヾ_,,..,,,,_ / ' ヽノ `/´ ヽ | ヽ ./ ,' 3 `ヽーっ / | │ ヾ ヾl ⊃ ⌒_つ ソ │ │ \,,__`'ー-⊃⊂'''''"__,,,ノ | > arashi = "先生 Haskell が生きてるの" > main = putStr "はいはいわろすわろす" 〃∩ ∧_∧ ⊂⌒( ・ω・) はいはいわろすわろす `ヽ_っ⌒/⌒c ⌒ ⌒
Haskellのサイトってなんでこんなにすぐ落ちるんだ?
∋oノノハヽ 川o・∀・) o <終了後、スタッフ一同で美味しく頂きました ( づ_,..................,____ _,,...!-‐'''" ̄  ̄~`''ー-.、_ ,,r‐'" ,r-ー、..,,,,r''""゙`ヽr-、,、_ ~`ー、 ,r''" r'~゙ヾ'" " ヽ,_ ゙ヽ, ,r" ,r"~ `'ヽ,、_ ゙:、 ,i" r'" ゙''j ゙:, ,! ,i'" _,,,,,,,,_ _,,,.___,., __,、, "ヽ, l, | ,r'.;:'"~:::"::::::::::::::~`''''ー―::::'''''"::::::::::::::::~~::::::::゙''"`ー:'''':、 | i, ,r'::r:::::ヾ;::::::::::ヾ;;;;;ソ::、::ソ:::::(;;;;シ:::ヾ::::::,r':,r、:::::::::::::::::::::::::::゙i ,! ゙i !;:::::ヽ'''::::::::::::::::::::::::::::::::::::::シ:ヾシ:::::::::::::::〉::::::::'''''シ:::::::::::::::::ノ ,:' ゙i、 ゙i、:::::::::〈:::::::::ヾ:::::::::::::::::::::::`ー''"::::::::::::::::::::::::::::::::::::::::::::,r" ,r' ゙ヽ、゙ヾ::::::::::::::::::::::::::::::::::::::::::::::ーミ;;;:::::::::::::::::::::::::::::::::::,,r'" ,r' ゙ヽ、~゙ヾ;:::::::::::::::::::::く:::::::::::::::::::::::::::::::::::::::::::::::,,,r''",,r''" `ー-ニ_ー--、::::::::::::::::::::::::::::::::::::_,,,,,,r‐'二.:r''" ~゙`''''ー---゙二二二~--―''''" ハスケル・ブルックス・カリー [1900-1982]
仮想化とは対象物を不完全ながらもその性質や姿を模倣し現出させることだ。 対して抽象化は、対象物のある特徴的な側面を抽出し概念化することだ。 仮想化で抽象化の技術が使われることはあるだろうが、その逆は考え難い。 コンピュータを使い、扇風機やコタツを抽象化することはできても、仮想化する ことはできないのだ。少なくとも今の技術では無理だ。コンピュータがその姿形 を変えることはできないのだから。コンピュータが仮想化できるものは、コンピュー タそのものが直接扱うものだけだ。例えば、仮想メモリ、仮想ネットワーク、仮想 マシン、仮想キーボードといったものだ。 抽象化した結果表現されるものは、設計者が想定した概念やイメージだ。しかし、 実在するものそのものではなく、人が考えたものであるために、このイメージは 非常に脆く、不安定だ。外部からの影響をもろに受け、形を変え易い。個々人が 持つイメージの些細な相違から認識のずれが生じ易い。扇風機の使い方は人に よって異なることはないが、人がイメージしたものは、その生成から、破棄に至る まで、非常に不安定な状態になり易い。それを防ぐには、イメージそのものをなる べく強固なものにし、インターフェースに一貫性と整合性をもたせ、外因による影響 を受けに難くく、壊れ難くするための技術を見につけ、理解を深めておくしかない。
チャーシュー麺食ってきた
麺食らった.。
>>282 は確かに冗長な文章だが、
「長すぎて読む気しない」と書き込んでその反映を確認する時間より
>>282 を読む時間のほうが長いとか、
この程度のもの読むのに「労力」の存在を意識してしまうとか、そういう低学歴のたぐいは問題外。
>>287 は
ここが2chだという自覚のない基地害
>>288 唐突に関係ない概念を持ちだして逃げてはいけません :-)
ということにしたいのですね?
ヘ_ヘ ____________________________
ミ ・ ・ ミ
[email protected] ( ° )〜
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
マトリックスの中にあるコタツは仮想コタツなんじゃね?
行列の中にコタツ?
すいません。 自分の$HOME以下にライブラリをインストールした際に、 そのパスをghcに見つけてもらうにはどうしたら良いでしょうか
>>295 ghc-pkg -list
して、インストールしたはずのライブラリがのってる?
298 :
デフォルトの名無しさん :2007/05/07(月) 00:07:16
モナドってどの位使うもの? IOは別としても、Maybeやリストを単体じゃなくてdoや>>=でバリバリ繋いだり、 あるいは合成モナド作ったりとかって実際のプログラムでどの位やるもの?
コードは残ってないから見せられないけど、 HTML テンプレートを XHTML で 書いて、置換用のデータを Map でもたせ、 Reader で処理するというプログ ラムを書いたことがあるよ。 そのとき、一部のデータは IO で読まないといけなくなり(実行したときの 日付とかそういうやつな)、けっきょく ReaderT IO になった。 あと IO 処理で繰り返しっぽくなりそうなのを ListT にしたりすることはある。
301 :
デフォルトの名無しさん :2007/05/07(月) 01:33:16
どうもです。自分は理解だけであっぷあっぷの状態なので、 これを実践での広い応用範囲が想像できないけど、 使い慣れたら、バリバリ使って格段に楽になって保守性もぐんと上がるもんでしょうかね。 お勉強レベルのサンプルだと、結局3行のコードが2行になる、とかそんな程度だけど。
>>298 ちょっと気になったので適当なコードで"do"をgrepしてみた。結果。
IO: 58
StateT Cont: 38
Maybe: 20
Parsec.GenParser: 19
Either: 17
IO以外も結構使ってる。
1〜100までを出力するにはどうすりゃいいのよ
mapM_ print [1..100]
print 1 print 2 print 3 ... print 100
newtype P r a = P ((a -> r) -> a) unP :: P r a -> (a -> r) -> a unP (P x) = x instance Monad (P r) where return x = P $ const x P f >>= g = P $ \k -> unP (g (f (\v -> k $ unP (g v) k))) k こんなモナドを見つけたんですが、既に名前が付いていたりしますか? ReaderとContを合わせたようなやつです。
>>308 具体例は何?何を抽象化してモナドにしたの?
モナドが見つかったとしてもそれを適用してかつ使えるものじゃないと。
>>309 モナド自体が珍しい訳じゃないのか。
>何を抽象化してモナドにしたの?
自然言語の、「普通のもの」とか「平均的なもの」という表現をHaskellでも使えないかな、と思った。
「普通のものを食べていれば大丈夫」という表現で、「普通のもの」の意味を決めるには
「食べる」という継続が必要、とか。
>具体例は何?
あまり役に立つものは作れそうにないけど、
withpc :: ((a -> r) -> P r a) -> P r a
withpc f = P $ \k -> unP (f k) k
runP :: P r r -> r
runP (P f) = f id
maxone, minone :: (Ord r) => [a] -> P r a
maxone es = withpc $ \f -> return $ maximumBy (\x y -> compare (f x) (f y)) es
minone es = withpc $ \f -> return $ maximumBy (\x y -> compare (f y) (f x)) es
test :: Int
test = runP $ do
x <- maxone [1, 7, 9] -- 最終結果をなるべく大きくするように選ぶ
y <- minone [2, 4, 9] -- こちらは小さくするように選ぶ
return $ x^y `mod` 23
-- ふつうの継続モナドと違って、偽物の継続を渡すこともできる。
fork :: (a -> P r b) -> (a -> P r b) -> P r a -> P r b
fork real fake (P f) = P $ \k -> unP (real $ f (\v -> k $ unP (fake v) k)) k
Enumのinstanceになる型を宣言する方法を教えていただけますでしょうか 範囲がIntに収まる場合はわかるのですが、それより大きい範囲を使いたい 場合はどのようにすればよいでしょう。 class Enum a where toEnum :: Int -> a となっていてIntに収まらないといけないのかとも思ったのですが、 instance Enum Integer とあって、下のsuccも動くのでできるのかもと。 Prelude> succ 1000000000000000::Integer 1000000000000001 とんでもなくアホな事を聞いてたらすいませんです。
>>311 Haskellレポートの6.3.4によると、fromEnumやtoEnumは変換できない場合には
実行時エラーを発生させて良いらしい。
その場合、succ,predなどについてデフォルトメソッドを使うわけにいかないから、
全て自分で定義を与えるしかない。
素早いご回答ありがとうございます。 > 全て自分で定義を与えるしかない。 なるほど、こういう方法があるのですね。 挑戦してみます。
>>310 考えてみる。いつになるかわからないけど。
>モナド自体が珍しい訳じゃないのか。
わからない。でも実際使えるモナドなら確実に珍しいはず。
それとMonadだけじゃなくてFunctorも定義しておかないとモナドにならない。
「使える」は「実用的」の意。
>それとMonadだけじゃなくてFunctorも定義しておかないとモナドにならない。 Monadを定義すればFunctorは決まりませんか。 fmap = liftM = (\f x -> x >>= return . f)
次期Haskell(1.6?)って、いまメーリングリストでどんなやり取りしてんの? 日本語でおせーて
Haskellバブルは完全にはじけてしまったな
本だけじゃ結局モナドがよー分からんかった。
>>319 普通のデータ型あんだろ?
data A = B Int | C String
みたいな。
データ型を用意して、return とか (>>=) とか (>>) とかの関数を用意すれば立派なモナドだよ。
321 :
デフォルトの名無しさん :2007/05/17(木) 01:05:07
質問 Javaってプリミティブ型(char, int)とオブジェクト型(String)があるけど、 HaskellのCharやIntは、全部Object型みたいなもんなの? もしそうなら、Javaに比べて必然的にメモリ使用量は多くなる?
CharやIntはそう。前スレでは[Char]は一文字あたり20Byte使う、という話が出てた。
>>321 Haskellにもプリミティブデータ型が存在します。
Char や Int などはプリミティブです。
String は Char のリストとして表現されますので、メモリ使用量は多くなります。
すべての場合において Java より Haskell の方がメモリ使用量が多いかどうかはしりません。
>>321 CharやIntは、ユーザが同等の型を自分で定義することが非現実的、という点でプリミティブだけど、
他のあらゆるデータ型と対等に扱える(多相関数に渡せ、多相データ型に保持できる)ことと、
基本的に参照(ポインタ)を介して操作される、という点では明らかにオブジェクトに近い。
例えば、データ構造中にIntを一個保持するには、普通、ポインタ一個分と整数一個分の
領域が必要になる。
GHCでは、「真の」プリミティブ型としてInt#やChar#などが使える。(非ボックス化型、unboxed typeという)
これはJavaのプリミティブ型に相当するもので、多相関数に渡せない。これを使って、例えばIntは
data Int = I# Int#
と定義されている。(I#は単なるデータ構築子の名前)
data Hoge = Hoge { one::Int two::Int } で必ずoneの方が小さい値になるようにしたい時とか data Hoge = Hoge Int でIntの値をある範囲におさめたい時とかどのようにすれば良いでしょうか。 宣言のしかたや、コンストラクタでなんとかできるものですか? 後者については最初はBoundedでなんとかできるかと思ったのですが 勘違いをしていたみたいですし。
type Hoge' = { h in Hoge | (one h) < (two h)}
ありがとうございます。
せっかく教えていただいたのに本当に申し訳ないのですが、
書き込んでいただいてから今まで調べてみたのですが
わかりませんでした。
data Hoge = Hoge { one :: Int, two :: Int } deriving Show
type Hoge' = { h in Hoge | (one h) < (two h) }
で以下のように怒られるとです。
(6行目はtypeの行)
> 6:13: parse error on input `{'
検索した中では下のような書き方が近いのかなとは思うんですが、
この書き方自体がわたしには...
http://ftp.osuosl.org/pub/nslu2/sources/hugs98-Nov2003.tar.gz > type Stack' a = [a] in
> emptyStack' :: Stack' a,
> push' :: a -> Stack' a -> Stack' a,
> pop' :: Stack' a -> Stack' a,
> topOf' :: Stack' a -> a,
> isEmpty' :: Stack' a -> Bool
ヒントか記載いただいた記法に関して説明されているところ
など教えていただいてもいいですか?
>>326 直接の言語サポートがないので、そういうときは抽象データ型を使うのが普通。
不変条件を侵さないように注意深く操作を定義して、
モジュールからはそれらの操作だけをエクスポートし、データ構築子は隠しておく。
ユーザは公開された操作だけを使うから、不変条件は自動的に守られる。
>>327 それはどういう方言?実装ある?
>>316 亀レスすまそ。
>Monadを定義すればFunctorは決まりませんか。
>fmap = liftM = (\f x -> x >>= return . f)
それは確かにそうなるのだけどそれは
自然変換が「自然」になっているからそうできるだけで
(注:あんまよくわかっていない)
わざわざそれで定義するのは変な気がする。
--けれどももしかしたらFunctorクラスで作られているのは普通の函手で
--fmap = (\f x -> x >>= return . f)
--これは自己函手と見るべきなのかも知れないとか思ったり。
でもそれよりもなによりも、モナドつくる手順が逆なんだよ。 普通モナドを作るならまず函手と自然変換を考えなきゃ。 たぶんモナド作るなら(注:完全な私見) 自然変換(なんかやりたい操作)が思いつく | なにを函手とすればいいのか思いつく。 | モナドにはならないけどとりあえず元々やりたかった操作が 実現できる。 | モナドになるように元々の考えを洗練。 | モナドになる or モナドにならない という風になるんじゃないかと思いながら考えている。(全然知らんが) 多分、モナドになることを最初の目的として作っても トリビアルな物しかできないんじゃないかなやっぱし。 最初からモナドを意識しなくても考えを突き詰めに突き詰めて 洗練に洗練を加えた構造が見出せれば勝手にモナドになっていると思うし。
たとえばIOモナドだと、その各ステップは何に対応してるの?
初心者向けの勉強会ないかお?
ここの人たちはhaskellで何を作ってるんだろう
ドモホルンリンクル
337 :
デフォルトの名無しさん :2007/05/21(月) 22:48:28
ここしかHaskellの質問できそうなとこないから質問だけど wxHaskellを解説してるサイトで、 >普通に圧縮したら6MB弱にしかならなかったのでこりゃ駄目だと >思ったら余分なデータの削除なるオプションで500KB弱になった。 って記述があったんだけどなんてコマンドなの? 調べたらstripってのがあるらしいんだけど使えないしGHCのマニュアルにも載ってないし
>>337 winならcygwin入れれば使えるよ
happyの生成codeをghcでコンパイルすると、気が狂う程遅い。 メモリも2G近く消費するし。 O0でも遅い。 O-1とかないのだろうか。
きっと最適化オプションを付けてコンパイルしたコンパイラを使えばいいんだよ。
Haskell使える、と言えるというか実際使えるには、どの辺まで理解すればいい? ふつうのHaskell読んだけど、どうもこれだけじゃ全然不足みたいで、 ファンクタだのArrowだのモナドの合成だの、どこまであるのか、やればいいのか見えない。 とりあえずココまで、みたいなのってある?
>>333 未だに自然変換が理解できていないせいかなんともわからん。
「自然」ってどういうことなんだろう?
>>341 自分の作りたい物が作れるまで。
作りたい物のない「勉強のための勉強」は苦痛でしかないから止めとけ。
>>342 実際「役に立つ概念」ってのはそう多くなくて,自然に定義する限り
まともな概念はだいたいモナドになってくれるはず.
(ならないものはだいたい使い物にならない概念だと思う)
332 の流れに沿って IO の文字表示の部分を解釈すると:
1. まず「画面に何か表示する計算」を定義したいと思いつく.
2. 画面の状態を表す型を W で表すことにすると,函手は
T X = (X, W),T f = (f, id) とするとよさそうな気がする.
3. 画面に何か表示する関数 f : X -> T X があったとき,
その持ち上げ f*: T X -> T X は
f* (x,u) = (y, w)
where (y,v) = f x, w = (u と v を合成した状態)
が自然な気がする.
4. 型 X の T X への読み替え j : X -> T X は
j x = (x, w) where w = (何も表示されていない状態)
が自然な気がする.
5. 上で定義した三つ組み (T, j, *) はモナドになっている.
>>345 さすがです・・・。というかどこまでわかっているんですか・・・。
とりあえず保存しました。
いつか自然に理解できるようになりたいです。
にしても
> が自然な気がする.
表現から類推するだけですけど
本当に自然に自然かどうかわかるようになるんですね・・・。
やっぱり「自然」はかなり強力な概念なのか。
# はじめに訂正:345 の 3 は f: X -> T X でなくて f: X -> T Y.
>>346 345での「自然」は、厳密な意味の自然変換というよりは
直感に整合する,というくらいの意味で使ってる.
(ただし,それは普通は自然変換になるんだけど)
実のところ,結構適当な関数を選んでも自然変換になっていて,
たとえば 4 の読み替えのところを次のようにしてやる:
j : X -> T X を j(x) = (x, "Hello"と表示)
これでも j は自然変換になる.逆にどんなのが自然変換に
ならないかというと,読み替えが X に依存するとき,たとえば
i : X -> T X を j(x) = (x, "これの型は X"と表示)
とすると自然変換にはなっていない.まあ一般の
「画面情報付きにする」関数が,型によって違う挙動をするのは
不自然(つけてるのが単なる画面情報じゃないはず)だよね.
>>343 そうか。
標準ライブラリの範囲か。それはよさそう。
>>344 でも、せっかくの道具を知らずにゴリゴリはイヤだよ。
続き.実はいま定義した i ってのは「画面に何か表示する」 というよりも「型情報を表示する」ような操作と考えるのが自然. これは i に対して定義すべき函手が T ではなかったことを意味している. そこで新しい函手 U を型について次のように定める. U X = (X, Xの型情報を表示している画面状態) このとき関数 f: X -> Y に対する作用 U f : U X -> U Y は次が妥当: (U f)(x, "これの型はX") = (f(x), "これの型はY") さらに,X から型情報付き Y への関数 f : X -> U Y があったとき これの持ち上げ f*: U X -> U Y ってのは f*(x, "これの型はX") = (y, "これの型はY") が意味的に普通.このとき (U, i, *) はまたモナドになっている. #というわけで,そんなに自然変換にこだわらなくても適当に #それっぽく定義をしておけば,勝手にモナドになってくれてるもんです.
そうはいうがな、大佐。 そもそも"それっぽく定義"とやらができるようになるまで かなりの訓練が必要かと思われるのですが。
いえいえ、少佐。 それ以前に私にはあなた方の使用している文字列が 日本語と認識できないのです。
>>347 ,349
>345での「自然」は、厳密な意味の自然変換というよりは
>直感に整合する,というくらいの意味で使ってる.
>(ただし,それは普通は自然変換になるんだけど)
それはなんかわかります。っていうかいままで言ってきた
それっぽいことはほぼそれを仮定しています。
それゆえに自然は理解したいんです。
>#というわけで,そんなに自然変換にこだわらなくても適当に
>#それっぽく定義をしておけば,勝手にモナドになってくれてるもんです.
というわけでこれも同意です。でも、当分自然変換にはこだわると思います。
IOモナド・・・なんだか自分にとってそのうち黒歴史に
なっていく予感がしますがやっぱり面白そうですね。
#ちなみに函手 T だとまずいから函手 U に変更って部分がわからないです。
#必要性はなんとなくわかりますが函手を変更しても、うまく整合して
#モナドになってくれるというところが見当もつきません。orz
>>350 >そもそも"それっぽく定義"とやらができるようになるまで
>かなりの訓練が必要かと思われるのですが。
確かに。うーん。でもとある方向性をもちながらHaskellやっていれば
なんとなく"それっぽく定義"がなんとなくわかるようになるような気もする。
というかHaskell作った人たちはそうなるように作っているような気がする。
銭やったモナドった。
,.イ´| ̄`ヽr<´ ̄  ̄`ヾ´ ̄ `ヽx''´ ̄「`丶、 / _|ノ ├〈,.-― ;. _ ,ゞ--'、:\___lヽ ,':∨::\ /´ ̄  ̄`ヽ ヽ/´ `ヽ、-.、 \::::::::::', |、_;/ / /´ ,. 、 、 \. \ \―| ’、 / / ,. / / ,ハ ',. ヽヽヽヽ \ヾ/ \_/:/:/:./ , / .,' / // | l | , l: | ', ',. ! l :',!| |/:/::/:/:/:! l | { /|:! l l } !ノ|::,!l | :| |::|:::::::|ノ |:/l/:/:::,|::|:{イ⌒lヾゝ ノノイ⌒lヽ|:::!::}:;!::l::::::/ |::/|/l::/l';:{ヾlー''! lー''!/リノノ/::/:l::/ || |:/リ、|::l;ゞ ̄´´ ,. ` ̄" ハ:lリノノノ' リ |' __,⊥!、 " " r===、 " " /ノノ || '/´\:: : \ ヽーノ /`ーァ-、 ヾ、 _ / li : . ',.`ヽ、 _ ,.イ´ /.ノ::l| ヽ \____ . /'/ |l ヽ `Y´ / './ . :l| |、 / / \l |l, \\_!_/ ‐ ´ 、!| | |\ ̄ | /; ´ ` ‐ , ヽヾ ! \| | / ヽ::/ `ヽ | | ,' ` ', ! 他のスレに貼り付けると . | |::: ヾ ヾ .:| .| おっぱいがポロリする | '、:::.:.. . ― . .:.:::,' ! 不思議なギガバイ子コピペ。 ',. \_:::.: : :_二二二:_: : : : .:.:.:.:::/ ,' ':、 ト、 ̄ ´.:.:.::::::::::.:.:.:.` ―┬ '′ / \ |l ヽ l| / . `/,' ヽ \ ',/ ∧ヽ \ \:.:.:.. ∧
プロジェクト・モナドゥ
モナドう無用!
PowerShellのことだな?
こんな関数定義をみたんだけど、 swap ~(x,y) = (y,x) この~って何?
ぐぐれ
>>358 遅延パターンと言って、引数を評価せずに即座に照合が成功し、
導入された変数(その例ではxやy)の値が必要になって初めて評価が起こるようなパターン。例えば、
swap' (x, y) = (y, x)
と定義すると、
case swap' undefined of (_, _) -> 4
はundefinedだけど、
case swap undefined of (_, _) -> 4
は4になる。
>>359 それは無茶だw
どうせだからすべてにチルダつけとけば?
364 :
デフォルトの名無しさん :2007/05/26(土) 13:07:22
>>363 ヤツはそんなとこで記事書くようになったのか?
出世したもんだ。
>>363 未だにshelarcyの読み方が分からないっす
366 :
デフォルトの名無しさん :2007/05/29(火) 23:11:21
>>365 読みを探そうと思ってヤツのホムペ行ったら・・・なんだよこれw
367 :
デフォルトの名無しさん :2007/05/30(水) 21:40:17
Haskellには再代入がないっつーけど、 いまだに理解できないオレ、へたれ♂ Javaでいうと常にfinalってことか? ある関数に引数を渡すと、必ず同じ値が返ってくるとか言うけど、 引数に3を与えても、5を与えても同じ値が返ってくるのか? 我ながら根本的に理解してないようなんだが、 だれか助けて。 ちなみに「ふつける」は半分以上読みました
ふつける半分以上読んでその理解力ならたぶん無理だろう
369 :
デフォルトの名無しさん :2007/05/30(水) 21:48:01
haskellは自動で並列化してくれますか?
>>367 >ある関数に引数を渡すと、必ず同じ値が返ってくるとか言うけど、
>引数に3を与えても、5を与えても同じ値が返ってくるのか?
違う。ただし、「同じ」引数を渡せば、必ず同じ値が返ってくる。
>>369 仕様では決まってないから処理系依存だと思う。
ただ、現在出回ってる処理系はどれも自動並列化はしないと思う。
>>367 代入っつーかバインド
数字に記号あてはめてんの
>>367 俺はお前に教えられるほど超人的な指導力は持ち合わせていない
373 :
デフォルトの名無しさん :2007/05/30(水) 23:54:26
>>367 >Haskellには再代入がないっつーけど、いまだに理解できないオレ、へたれ♂
>Javaでいうと常にfinalってことか?
わかってんじゃんw
> ある関数に引数を渡すと、必ず同じ値が返ってくるとか言うけど、
「ある関数に『同じ』引数を渡すと…」に決まってるだろw
それに対して、
class A{ int a; int inc(){return a++;}} の inc()
は毎回違う。
変数が全てfinalだと、
class A{final int a; int inc(){return a++;}}
となるが、これはコンパイルエラー。だから
class A{final int a; int inc(final int 前の結果){return 前の結果+1;}}
とするしかない。これがHaskellの流儀。
それだけのこと。
Arrowってどの位使うもの?っていうか、何が嬉しいの? っていうか、Arrow以前にポイントフリースタイルって何が嬉しいの? Arrowも単にスタイルだけの問題?
>>374 > ポイントフリースタイルって何が嬉しいの?
変数書かなくていいからきれいすっきり。ただそれだけ。
関数型言語ってGoFのデザインパターンをつかえんの? ぜんぜん無理?
わかんないよ父ちゃん! フィールドと再代入がないのに、 どうやってプログラミングすればいいんだよ class MyInt { private int[ ] i; public void increase(int value) { i += 1; } public decrease(int value) { i -= 1; } }
父ちゃんも昔「gotoが無いのにどうやってループを書いたらいいんだ!」って言ったもんだ。
>>378 だから、呼ぶ側で値を持ってて、引数で渡せよ。
そうすれば非finalなフィールドはいらんだろ。
つか、いろいろソース読んでソース書いてれば慣れる。
382 :
デフォルトの名無しさん :2007/06/01(金) 04:45:20
System.getArgsってコマンドライン引数から「文字列」を受け取るんだよね? 下のように2つの数値を受け取るように書くにはどう定義すりゃいいの main 5 10
>>382 受け取るのは「文字列のリスト」だから心配ない。
いつだって383のことが心配だよ
うあ、心配された。 例として、ふたつの引数の和を表示するなら、 main = do [a, b] <- getArgs print $ read a + read b という感じで。
386 :
デフォルトの名無しさん :2007/06/01(金) 22:29:05
にゃるほど よくわかったお ところで、こんなコンパイルエラーでたんだけど、どういう意味? myIf.hs:4:16: parse error on input `=' 特にダブルクォートとシングルクォーテーションの意味が知りたいのです
「myIf.hsの4行目、16文字目に = が来るなんて予想外だお」
388 :
デフォルトの名無しさん :2007/06/02(土) 02:09:03
fix f = let x = f x in x これってどういうこと? x = f x って。 fがたとえば id ならまだいいけど、(+ 1)だったら? っていうか言語的に、letの機能ってどうなってんの?
せめてletについてくらいはマニュアルくらい読んだら?
>>388 やってみればわかるけど fix (+1) はループして値が定まらない。
>>388 fix (\l -> 1:l)
とやると、[1, 1, 1, ...という無限リストができる。
fix (\l -> 1:1:(zipWith (+) l (tail l)))
とやると……。
>>388 Haskellには遅延評価があるので、関数以外のものも再帰的に定義できる。
ones = 1 : ones
とすれば、onesは1が無限に続くリスト。
x = (1, fst x)
とすれば、xは(1, 1)。もちろん再帰的定義は常に有効な訳ではなく、
x = x
などと定義すればxを評価した瞬間に無限ループに陥るし、
x = x + 1
でも同様。
letに特有のことは何もない。モジュールのトップレベルでも同じ。
ところでみんなHaskellで,どんなプログラム書いてるの? 仕事で使っている人とかいる?
ありがとう。
つまり、
fix f = let x = f x in x
は、
fix f = f $ f $ f $ f $ f $ f $ f $ ....(略。無限に続く)
のこと。
fix f の値を得ようとすると無限ループ。
ただし、
残りの部分の評価が遅延されることによって、
fix f の値の一部だけは取り出せる(リストの前の方とか)。
fが(+1)とかだと部分も糞もないから即無限ループ。
って事でおk?
>>388 で、「idなら」って書いたけど、idでも無限ループだよね?
このスレのレベルが急速に低下してるな……
>>395 おk。
idでも無限ループ。
>一部だけは取り出せる
完全に取り出せることもある。fが(const 4)のときとか。
>>396 レベルが低下しているというかそもそも高くなっていない。
本質的に何も言っていないも同然じゃないか?
(とは言いすぎか。少なくとも一般的に使えそうにないとは感じる。)
そりゃ評価もされんわ。
400ならコピペの主は休みの日にgoogleでデパート屋上を拡大してる姿をライブカメラに流す人。
401ならコピペの主は一生現実世界でも誰にも相手されないかわいそうな人。
402なら俺がコピペ主 part 1の頃はレベル高かったと思う。
さえずらずただ黙って出せっ.....! 適切なレベルのネタをっ・・・・・・!
>>404 すまん
Lisp系のスレにコピペしたの俺
>>405 俺はMLスレ。
ていうか、なんか他のスレにもコピペがしてあるんだけど。
他にもコピペしてる奴がいるのか。
>>396 で、スレのレベルが一気に最底辺に堕ちたな。
レベルが低いと嘆きつつ、こんな最底辺のネタになるとレスが増える不思議。
>>407 みえみえの煽りをマジに受け取るなよ
厨房じゃあるまいし
みんなHaskellで何つくってんの? PerlならCGIとか仕事の補助ツールとか用途があるので まだいじる動機が見つかるんだけど、Haskellはなんか 目的が定まんないんだよね。 これまでやってきた言語とちがうっぽいので、興味はある からここ覗いたり解説サイトとか流し読みしてるんだけど、 あと一歩、手をつけるきっかけが無いんだわ。
仕事の補助ツールを書いてみれば良いんじゃないか?
>>410 今まで別の言語でやってた部分をリプレースするからには、
Haskell使うとよりハッピーになれるかが決め手だろうな。
C/C++:処理速度重視、アセンブラとのインターフェースが楽。
Perl:標準入出力で事足りる場合はこっち。
Java:特定の環境ではこれしか案件がない。
Haskell:……何に使える? 何が得意?
正規表現だとめんどくさそうなのを Parsecでパーサー書いて処理したりとか。
XMLをいじったり、ちょっとした言語処理系を組んだり。 俺は趣味プログラマで、シェルスクリプトとHaskell以外はあまり書かないから、 大して参考にはならんかも。
haskellの普及にあたって最大のネックはghcのコンパイルの遅さ。 ghcはMLで書き直した方がいいんじゃないか。
つ-O0
>>411 haskellは習得に時間が掛かりすぎる。
遅延評価で最適なコードを書くには頭使いすぎる。
418 :
410 :2007/06/04(月) 00:39:50
手を付けるきっかけがないって言ってるから、そんなネタでやってみたらって提案しただけだが。 日本語周りぐだぐだだし、他の言語のリプレースになるなんて思ってないよ。
あらゆるライブラリというライブラリの作りがへなちょこ。 何なんだこの言語の開発者どもは。 誰も彼もやる気が感じられねーぜ。
>>417 頭使わないで書いていいのが遅延評価のいいところじゃないのか?
>>395 の fix ってYコンビネータ?
fix f = let x = f x in x
と、
fix f = f $ fix f
ってどう違う?
>>421 >
>>395 の fix ってYコンビネータ?
Yコンビネータと同じ関数。再帰を使って定義しておいてコンビネータと呼んで良いのかは知らない。
>どう違う?
結果は同じ。素朴な実装だと、前者ではfixの呼び出し一回につきfは
一回しか呼ばれないのに対し、後者では何回でも呼ばれ得る。例えば、
let xs = fix (1:) in xs !! (xs !! n)
は、前者ではO(1)、後者ではO(n)の空間を使うはず。
423 :
デフォルトの名無しさん :2007/06/04(月) 04:39:46
コンパイルが終わりません^^; main = print $ bad (Very bad) data Silly = Very (Silly -> Int) bad :: Silly -> Int bad (Very f) = f (Very f)
>>420 遅延評価を最大限に生かすには手続き型よりも頭使うよ
>>424 遅延評価を最大限に生かす、ってどんなの?
428 :
デフォルトの名無しさん :2007/06/04(月) 22:13:59
429 :
デフォルトの名無しさん :2007/06/07(木) 01:01:46
なんかHaskellって、Perlっぽいよね。 節操がないって言うか、ポリシーがないって言うか。
Haskellは純粋な関数型言語をつらぬいてるっていうだけでも 結構ポリシーがあるほうだと思う。 節操がないという言葉に一番当てはまるのはDあたりだと思う
Dは節操がないというよりならず者なだけだと思う。
むしろHaskellは制限が多すぎる。
型推論を見て、全てが動的型だとでも思ったのかな
DよりもNemerleの方が節操がないよ
C/C++で実装されているperl6は近年最強のベイパーウェアと化していたが、 Haskellで実装されたperl6は既に動いている。 よってHaskell>>>超えられない壁>>>C/C++
>>433 は馬鹿か?TMTOWTDIの事に決まってるだろ。
Perlはこれ自体がポリシーな訳だが。
でもHaskellがそうかと言われたら物凄く違和感があるのだが
文体からしてそんな感じがするね いきなり馬鹿呼ばわりする人は大抵自分が…
いきなり自演呼ばわりする人は大抵... 何でもないレスが自演に見えるのは妄想性の病気だと思うんだ。
いきなり人を馬鹿呼ばわりしたのは当の
>>433 な訳だが。
それはともかく、Haskellでの正当な流儀ってどうなってんだ?
みんな(.)で繋ぐのか?でもそれだけではプログラムが書けない。
doで書くのか?でもモナドだけで書くのか?てか、ほとんど手続き型じゃん。
パターンマッチで書くのか?じゃあADTってなんだ?
誰かが論文書いた?また仕様追加するの?じゃあ今までの書き方は何だったの?
それはともかく、Javaでの正当な流儀ってどうなってんだ? みんな(.)で繋ぐのか?でもそれだけではプログラムが書けない。 forで書くのか?でもwhileだけで書くのか?てか、ほとんど関数型じゃん。 定数で書くのか?じゃあenumってなんだ? 誰かが論文書いた?また仕様追加するの?じゃあ今までの書き方は何だったの?
>>444 ネタにマジレスすると、
>>442 はスタイルの話をしているわけだが、
>>444 は些末な文法要素の話でしかない。
7以降、スタイルへの影響も出てくるだろうけど、
Haskellでのスタイルの不定さにはまだまだ及ばない。
確かに Haskell のソースって do で手続き的に書いているのがほとんどだなぁ 結局実行順も状態も必要って事なんだろうな
スタイルが不定だと何かまずいの?
forで書くかwhileで書くかはスタイルの話だろ てかdoで書く場合とそうでない場合って結構明確に分かれてないか?
____ ┌──────────┐ //´ __,,>、 | ::::::::::| /::/ / ̄:::::::::::::::\ └┬────────┬┘ /::::l/::::::::::::::::::::::::::::::::l. | -‐-レノ ノ_ ::::| l:::::::::::/l/lノノ/_イ:::::l | イ゚テ .ピト` ::| l:::::::::/ rtテ、 .ィtq l::::::| | '" .,j '" ::| |::lヘ!j ´ ,j !;:::/ | r‐-, ::::| レリー 、 ,...., lノ/ |  ̄ :::::| `ヽ、lヽ 、  ̄ / ┤ ::::::├ヽ , -‐-、_r┴─'ー‐チト この人 土管です /| ::::::| ´`ヽ / ヽ ̄`ー-‐'´`''''⌒ヽ / | ::::::| \ _r‐、-、-、r, 、 ', | ::::::| ,. -‐ゝ/// 〉 〉 〉 〉 〉 ! ', | ::::::| / 人〈〈〈〈 ' ' ' /っ l l | ::::::|/ / ```´-ァ‐'''" / l \_| ::::::├ヘ l // / _ ィノ ┤ ::::::| `ーヽ、_ノ´l、______/lニ二」 _/| ::::::| |_ ( ( ) )_〕| l
女25歳。結婚して主婦やってる。 こっちは大学中に無難そうな野球男みつけて、彼氏が入団直後に結婚OKして卒業後ほどなく主婦。 ほとんど金なんか稼いだことないけどw。 毎日午前中は友達と電話したりフジの番組ずっと6時から10時ぐらいまで見て 旦那は気の毒ねーみたいな話してる。男らしさによればこんな腐った私らみたいなんでも 何不自由なく生活できることが男にとっての甲斐性・男冥利らしいから ほんと助かるわ。マゾかと思ってしまう・・・みたいな話。 午後は基本的にいいとも→ごきげんよう→ザワイド(3時まで)ははずせないかな〜。 そこから買い物でかけたりオバサン同士で話したりして、5時前に帰ってきて7時までスーパーニュースかなあ。 30分くらいで適当に晩飯作って自動で洗ってくれる風呂のボタン押して8時から11時ぐらいまではまたテレビw 同じ25歳でも、片やこっちは専業主婦と言う立派な職業で 職歴として堂々と語れて、しかも「女性として社会に活躍するのをあきらめて 旦那さんを一生支える決意したなんてすばらしい女性なんだ」と言われるw。 いや、単に楽だし安心だからなんだけどw。支えるなんてことほとんどしてないよw。 片や男の子は毎日父親から母親から「スネかじってる」だの「男のくせに」だの言われて 就職活動しないと人間否定されて、勇気出して遠出して受けに行ったのに結果出さなかったら 過程の努力は無視されてまた「男だろいつまでもウジウジしてんな」とか言われて。10個も20個も履歴書書くのなんて面倒で考えられないしw 決して養ってもらうと言う立場には一生なれなくて果てはホームレスか飢え死に、欝・凍死・自殺。
>>440 ちゃんとした書き方してるんだって言う満足感がないだろ
RubyならちゃんとRuby的に書くのが1人前のRubyユーザ。
言語はRubyでもJava的に書いてたらそれはRuby初心者。
いってみれば、Haskellはいつまで経っても我流の半人前。
不可解な話だな。
Haskellってカタカナ読みでなんて読めばいい?
>>452 君の言う「Ruby的」とやらだって一通りじゃないだろ
dank○gaiのHaskell話ってなんか どっかで聞いた話がいっぱい入ってね?
>>455 ハスケル。アクセントはハのところで、あらいぐまのラスカルと似たイントネーション。
口頭で言うとよくPascalと間違えられる。
>>459 突然 Haskell がラブリーに見えてきた俺ガイル。
Hidy Hidy Little Haskell ...
465 :
デフォルトの名無しさん :2007/06/11(月) 18:16:55
メジャーかマイナーかなんて、営業の差でしかない 大人の事情ってやつ
>>466 誰が営業してるんだ
誰がこれで金儲けてんだ
>>465 あとコンパイル時間も比べてほしいな
GHCぼろ負けするだろうからさ
Cleanは金儲けてるだろw
金儲けてないHaskellに営業で負けてる訳か。 cleanの営業はいてもいなくてもいっしょだな
>>468 Cleanも日本語の解説書が出れば一気に人気が出るよ。
>>471 フリーソフトが金取ってるソフトにユーザー数で勝つのは
割りと一般的だと思うけど。
まあ同じソフトなら無料の方が良いに決まってるしな
>>472 解説書は出るのを待つんじゃなくて書くもんだよ。
Haskell の検索結果 約 13,600,000 件中 1 - 50 件目 (0.09 秒) "Concurrent Clean" の検索結果 約 80,200 件中 1 - 50 件目 (0.31 秒)
そりゃ開発環境が無料じゃないなんて負けるに決まってる罠 C#みたいにMSとかってんなら話は別だが
LGPL版も用意されてるけど公式サイトからダウンロードするのにいちいちユーザー登録しなきゃいけないのが嫌。 なので、ダウンロードすらしていない。
企業がやってるということは、いつライセンス変更されて有料になるか解らないので不安
・言語の正式名称は「clean」であって「concurrent clean」じゃない ・開発環境は無料 ・登録しろって言ってくるけど、しなくてもダウンロードできる ・開発も公開も、企業じゃなくて大学がやっている おまえらもうちょっと調べてから投稿しろよ。
485 :
デフォルトの名無しさん :2007/06/13(水) 02:42:46
コンビネータで数の計算をやろうとして、以下のような関数を用意した。
ネタ元は
http://users.bigpond.net.au/d.keenan/Lambda/index.htm k x y = x
i x = x
t x y = y x
v x y z = z x y
inc = v (k i)
dec = t (k i)
isZero = t k
zero = i
one = inc zero
two = inc one
で、検算用に10進数に変換する関数numを作ろうとした。
しかし、型推論が邪魔して(?)以下の関数が定義できない。
num n = isZero n 0 (num (dec n) + 1)
こういうときってどうやって対処すればいいの?
>>485 それって型なしλ計算でしょ?
haskellは型があるもん
>>485 その数の定義で行くと、
たとえば、threeは
ペアを作る関数
pair m n = (\x -> x m n)
として、これをpair m n を (m, n) と書くとして、
(false, (false, (false, I)))
ってなっちゃうじゃん?
2番目の要素がペアなのかIなのか決まらないじゃん。
あ、false = k i ね。
関数に「状態をもたない」といったときの「状態」ってどういう意味でしょうか。
>>485 schemeでやってみるか、データ型駆使するか?
>>489 複数回の関数呼び出しにまたがって保持されるデータ
>>489 ヒルベルト空間論というか量子力学で言うところの|ψ>じゃない?
つまり安直に状態とは可分なヒルベルト空間の元である〜。
でファンクタFを作用させるのはF|ψ>みたいに考えるといいのか。
(F 'join' F)|ψ> -> F|ψ>
てか?
exp(F) = 1 + 1/2! * F + 1/3! * F + 1/4! * F + ...
とかも考えたら面白そう。
昔の自分を見ているようで微笑ましいな
なにがまずいん?
どのようにまずいん?
何か痛い流れになってるw
>>492 何故“状態”の線形性を仮定してるの?
何故全ての関手が線形で、しかもドメインとコドメインが等しいことを仮定しているの?
何故各“状態”について内積が定義できることを仮定してるの?
joinのくだりは意味不明だからコメントを避けるが、
exp Fみたいな関数はhaskellではbotだし。
名前が似てるだけのものを混同してる。
ネタぐらい華麗にスルーしろよ。
誰だって、概念をもてあそんだ恥ずかしい過去を持っているはず。 厳しい追求は可哀想。
502 :
デフォルトの名無しさん :2007/06/15(金) 03:19:56
>>490 データ型を駆使するやりかたをおぼえたいっす。
data X a = T (X a -> a)
fixpoint g = (\x -> g (x (T x))) (\(T x) -> g (x (T x)))
こういうのを見るんだけど、どこをxにしてどこを(T x)にするかとかの考え方がわからないんだよね。
>>487 そうか!
vはペアを作る関数として使ってたんだ。
isZeroでkを与えてcar部のfalseを取り出して非ゼロと判定してたのか。
503 :
デフォルトの名無しさん :2007/06/16(土) 22:35:35
(iterate (* 2) 1) !! 1500 を評価すると452桁の多倍長整数がきちんと表示されるのに、 (map log10 (iterate (* 2) 1)) !! 1500 where log10 x = log x / log 10 あるいは、 log10 ((iterate (* 2) 1)) !! 1500) where log10 x = log x / log 10 を評価するとInfinityになってしまいます。(オーバーフローではなくて) なぜでしょうか? ちなみに (map log10 (iterate (*2) 1) も値が308を越えるところから途中でInfinityになっています。
logの引数がDoubleに変換されるからだと思う。 Prelude> 2^1023 :: Double 8.98846567431158e307 Prelude> 2^1024 :: Double Infinity Prelude> log(2^1023)/log 10 307.95368556425274 Prelude> log(2^1024)/log 10 Infinity
>>503 型推論を終えた時点で数値の型が曖昧なときは、デフォルト化によって解決される。
どういう風にデフォルト化するかはdefault宣言で決めるんだが、宣言がないときは、
・できればInteger
・それがダメならDouble
・それがダメならエラー
という風になっている。最初の式の型は(Num a) => aだから、Integerが優先される。
log10の絡んだ式の型は(Floating a) => aで、Integerは適合しないから、第二候補のDouble
が使われる。Doubleには表現できる数に上限があるので、Infinityにもなる。
506 :
デフォルトの名無しさん :2007/06/17(日) 00:02:25
>>504 >>505 ありがとうございます。駄目な理由は理解しました。
でも解決策がすぐに分からないような初心者なのでもう一回調べてみます。
どうもでした!
507 :
506 :2007/06/17(日) 00:18:48
インチキだけど floorLog10 :: Integer->Int floorLog10 x = length (show x) でうまくいきました。 floorLog10 ((iterate (*2) 1) !! 100000) => 30103
>>502 の解説希望。
data X a = T (X a -> a)
のようにx = x -> x という型を作れれば,不動点が作れるというのは何となく分かるんだけど
例えば右辺がどうしてX a -> aでa -> X a や X a -> X aではないのかとか ???
それ、GHC6.6だと固まるんだけど、なぜだろ $ cat test.hs data X a = T (X a -> a) fixpoint g = (\x -> g (x (T x))) (\(T x) -> g (x (T x))) main :: IO () main = print $ fixpoint (\f -> \x -> if x==0 then 1 else x*f(x-1)) 5 $ hugs test.hs (ロゴ一部省略) || || Version: September 2006 _________________________________________ Haskell 98 mode: Restart with command line option -98 to enable extensions Type :? for help Main> main 120 Main> [Leaving Hugs] $ ghc --version The Glorious Glasgow Haskell Compilation System, version 6.6 $ ghc --make test.hs [1 of 1] Compiling Main ( test.hs, test.o ) (固まる)
などるほ! 回避策ってないんですかね。-O0でもダメだし
512 :
デフォルトの名無しさん :2007/06/22(金) 17:09:56
513 :
デフォルトの名無しさん :2007/06/24(日) 03:20:40
このスレレベル高いでしょ!!
無限リストの有用性がよくわからん 無限に続くとはいえ結局使うのは有限個の要素なんだし、それなら最初から有限リストとしてしまえばいいのでは? もしそうならCとかの遅延評価がない言語でも十分実装できるようになる 誰か無限リストでないと困るような例を教えてくれ
無限リストは、値を次々生成していく処理を リストの形で扱えるようにしたもの、じゃないの?
何処まで必要か分からん場合じゃない? 例えば素因数分解のための素数リストとか。
>>514 それでないと実現できないってのじゃなくて、
そういう形に抽象化して考えるってのに意義があるんだよ。
足し算があれば掛け算は無くても良いけど、あった方が良いよね みたいな?
>>514 最初から有限個の要素にするってことは、「どこで打ち切るか」の判断を
リスト生成関数に埋め込むことになるが、無限リストを使えばこれが分離出来る。
例えば、「素数を小さい方から千個求める」という操作と「千以下の素数を全て求める」という
操作をループで書いた場合、この二つの操作の共通部分を括り出すのが難しい。
一方、素数を小さい方から並べた無限リストprimesを使えば、この二つは
take 1000 primesとtakeWhile (<=1000) primesになって、素数生成の
部分は容易に共用出来たことになる。
>>517 だから、そういう形に抽象化したら何が楽になるんだ?
引き算があれば割り算は要らないけど、あった方が良いよね みたいな
人間様が、いちいちどれくらいの長さが必要かなんて指示するなんてあほらしい。 無限のリストをやるから、処理の方で必要な分だけ使え、ってほうが楽。
でも、遅延評価が働かない場合は無限リストをすべて書き出してから処理をすることになって、オーバフローになってしまうけど、 遅延評価が働くかどうかっていうのをいつも意識の隅においてプログラミングしなきゃいけないなんて、 めんどくないか?
遅延評価でない言語で、無限ループしないよう考えながら書くのと同じことですが
どっちが難しいかってことだよ。 普通の人は遅延評価の方が難しいだろう。
普通の人ってなんだよ。 そりゃ遅延評価に慣れない人には遅延評価の方が難しいだろう。
それが慣れの問題じゃないんだな。
Haskellは一般人向きじゃないってことだけははっきり言える。 そして、Haskellはもっと直観的な記法に取って代わられると予言してやろう。
>>527 なぜそう思う?
というか何か主張するときは根拠も述べてくれ。
いいんだよ。学問用の言語なんだからほっとけ。
Haskellではちょっと込み入ったことしようとすると英語の論文読まなくちゃいけなくなるからいけない。
>>533 んなことはない。込み入った機能をわざわざ使うにはそうだが、
ロジック自体はHaskell98の範囲で事足りる。
低レベル系のことを言ってるのなら、それは言語の問題ではなくライブラリの問題。
むしろ、高レベルのことなんだが。
アローとか日本語で解説してる記事があるなら紹介してほしい
本が2冊出てるし
それにしてもHaskellの啓蒙書はなぜこんなに少ないのかな。 Prolog50冊、Haskell2冊。一部言及された書物の数でも似た ようなものだ。 出版物の意味が変わってしまった、というだろうか。
540 :
538 :2007/06/25(月) 05:52:27
あれ、「こと」がおちてる
Haskellやれば金になるとはほとんど誰も思っていないから
コンピュータサイエンスの海外版権を買いまくって、 という時代ではないんだね。
アローの記事がないのなら、関数とモナドで書けばいいじゃない
>>544 そうなんですが。
1980-90年代にPrologが担おうとした役割を今人はHaskellに
求めているという事情がある。Prologの書籍の過半がAIに
言及し、そのコードの基礎を示していることなどを考えると
やはり、現在の日本のHaskell出版物の状況は寒い。
>>545 >1980-90年代にPrologが担おうとした役割
って何?
Haskell って事は AI に特化した事じゃないんだよね?
知識処理プログラミングのアセンブラということでしょ。
Prologというか知識処理は社会へインパクトをもたらす技術目標があったけど、 Haskellというか関数型言語は蛸壺内の内輪ネタに終始しているな。
549 :
デフォルトの名無しさん :2007/06/27(水) 21:12:44
Haskellのおかげで関数型言語に興味をもったエセプログラマーの数は計りしれねーぞ 俺もそのひとりだ
これでプログラマではなくなり、計算機科学者になりました。
数学者の前では卑屈になるが、理論に疎い一般プログラマは徹底的に見下す。 それが計算機科学者。
これで計算機科学者でなくなり、数学者になりました。
数学者は物理学者に負けるよ
物理学者が数学者にぺこぺこするんです。 あたりまえでしょ? 数学者はn次元の公式を渡して、物理学者は3次元の公式をほしがるんだ。
物理学者が憧れるのが詩人
計算幾何学者の漏れが颯爽と登場
557 :
デフォルトの名無しさん :2007/06/28(木) 06:24:34
LISPやPrologは言語の大雑把な目的を人工知能とかで認知させる事に成功したが、 Haskellじゃ何がメリットなのかも理解されず世間へのハッタリもかませない。 金儲けには全く向いてないな。 学者のみなさん、 Haskellだとどんな所がおいしいとか、俺に説明してみてください。
理系全般だか情報システム帰れよ糞ども
結局は遅延評価だけでしょ。<Haskell
型安全性による品質の圧倒的な向上。 →ある種のバグはこれで撲滅できる。メンテナンス性もまずまず。 多相性による再利用性の向上。型推論による簡潔な記述。純粋関数的なreasoningの容易さ。 →より短期間でプログラムを開発できる。 工学的に申し分ない言語じゃないか。 Prologなど比較にならんわ。 あ、lazinessはうんこ。
うんこは言い過ぎだろ… 遅延評価をやめるなら最低限遅延リストの代替が欲しい。
遅延するようにもしないようにもできればいいだけじゃん。
そいう言語あるだろ。
副作用も欲しいところだ
普通の言語にある副作用(IOモナド相当のみ)はあまり欲しくないけど、reflect/reifyくらいあってもよさそう。 main = print $ reflect( @[1, 2] + @[3, 4] ) で[4, 5, 5, 6]が表示されるとか、 main = reflect( @(writeFile (@getHomeDirectory ++ "/test.txt") @getContents) ) とか。
遅延評価がやりたいから、Haskell(やClean)は純粋関数的なのであって… それを捨てたら意味ない気がする。 まあ確かにreasoningがしやすいという側面もあるんだろうけれど、 遅延評価を捨てた時点で、unsafeIOを使いまくるやつ続出な希ガス
>>568 その構文は何?読めん。
reifyならtemplate haskellにあるけど
>>569 Haskellは筋が通ってるから大衆人気はなくとも、この方面からは権威ある言語として認められている。
>>571 reflectじゃなくてreifyだった。ごめん。
main = print $ reify( @[1, 2] + @[3, 4] )
reifyは予約語で、reify(<式>)でひとつの構文。これ自体はreturnみたいなもの。
@はreflectのつもりで、reifyの中でのみ使える。直感的にはモナドを「外す」関数m a -> a。
これで副作用っぽい書き方ができるけど、実際には全体でひとつの構文で、
reify( @[1, 2] + @[3, 4] )
は
[1,2] >>= \x -> [3, 4] >>= \y -> return (x + y)
の構文糖、みたいな意図。
Template Haskellのreifyはたぶん直接は関係ない。
なるほど、そういう構文糖はあってもいいかもしれないね。liftMの逆というか。unlift? do構文よりもさらに直観的かもしんない。 構文糖として実装する場合、liftMやらliftMnやらを色々と埋め込む実装になるんだろか。 reify( @[1, 2] + @[3, 4] ) は、 let x +? y =liftM2 (+) x y in [1,2] +? [3,4] みたいな感じで。 liftMの埋め込みが決定可能かどうかは知らない。
>>570 歴史的にはそうなんだろうが、今となっては遅延評価が足を引っ張ってるような。
でもHaskellが遅延評価を捨てることはないだろうから別言語ってことになるんだろうな。
unsafe IOは使いたい奴には使わせとけば良いんじゃないかと。
なんだかhaskellのコードは俺言語オナニーの一種に思えてしかたがない とても見やすいとは思えないな
>>577 お前がHaskellに慣れてないだけ。こんなもん大学学部生でもすぐに読めるようになる。
表面的な構文なんぞに拘る人は一生JavaかPerlでも使っててください。
>>577 別に見にくいとは思わない。
ただ、個人的には読みやすさよりも書きやすさがHaskellの魅力だと思う。
>>578 表面的な構文は重要だろ…
中括弧とセミコロンが必須だったらここまで好きにはならなかった。
>>580 俺はレイアウト構文をやめてほしいがな。
区切り方に一貫性がない。 たとえば、do{・・・;・・・;}は許されるのに、case ・・・ of {・・・;・・・;}は許されない。
中括弧だとかセミコロンの有無なんぞを議論するなんて、まるでC使いとPascal使いじゃないか。 あまりにも無益。 どちらかといえばDRY原則とかに拘るほうがまだ有益。 確かにfunction f x = などと定義するのはキモイような気もするが、それも慣れだ。 たとえば(functionよりはちと短いが)ML系ではいちいち関数の前にlet とかrecとかvalだとかを付けるわけだが、それに文句を言う奴など居ない。
>>583 通ったけど。
Prelude> case 4 of {0 -> 2; 4 -> 4;}
4
>>584 >>578 が重要でないと言ったからそれに反論しただけ。
別に構文の詳細について議論する気はない。
主観的には間違いなく重要な点なのでこれもどうしようもない。
>>583 許されますが
ghci> case 1 of{0->0;1->1;x->x;}
1
プログラムは目的が達成できる事と、実行スピードが出せてこそだと思うんだが、 haskellだと、どこチューニングすれば速くなるとかがよくわからん 「慣れてない」の一言で済ませるのは簡単でいいやね・・・
いや、実行スピードをチューニングするのは慣れたHaskellプログラマでも難しいんでない? だからプロファイラとかがあるわけで。 オーダーを改善することくらいなら何も考えずできるだろうけど。 つか、上の人は「読みやすさ云々は慣れの問題」と言っただけじゃねーの
ケコーンしまくりうざい
591 :
589 :2007/06/28(木) 20:21:08
プロファイリングを使うことは前提のつもりで言った。
つーか構文の歴史でいえばHaskell/Clean(Miranda系)もML系も結構古いんでは 20年くらい? Cほどじゃないが、それなりに支持された書き方ではあるはず
hugsでも通るね。 Hugs> case 1 of {1->1;x->x;} 1 つかHaskellの言語仕様でそ。コンパイラがどうのよりも
>594-595 それなんてインタプリタ?
GHCiは対話的バイトコードコンパイラです!
揚げ足取りに興味はない。
いや、ghc-6.4.2で普通に通るし。 それくらい試せよ。
レイアウト反対 レイアウト反対 こんなパイソンみたいな書き方キモすぎる。 どっちかに統一せえや。
ぜんぶセミコロン使っちまえばいい
全部セミコロンで書くと、haskell-modeでエラーが出ることがある。
んなあほな欠陥は直してしまえばよろしい
レイアウトええやん わかりやすいし無駄がない 人間はアホだから、機械と違ってインデントしねーとコード嫁ねーし、 理にかなってるわ
さて流れに逆らって低レベルな質問 (1)コマンドライン引数を2つ以上取得したいときはどうすんの? getArgsではできないの? (2)main = do cs <- getContents Moge cs Moge :: Int -> String -- 以下略 こんなふーなプログラム書いてみたら、「csはStringじゃなきゃダメよ」って感じで 怒られたんだけど、StringをIntに変換する単純な関数ないの?
俺も良いと思うよ。
>>606 (1) getArgsでは引数の配列が得られる。
-- 引数を表示するプログラム
import System
main = getArgs >>= mapM_ putStrLn
(2) String -> Int ができる関数としては read がある。
例えば
hoge :: Int
hoge = read "1234"
とすればhogeは1234。
出力の型に変換できないような入力文字列だった場合はエラーが起きる。
609 :
606 :2007/06/29(金) 01:34:21
なるほろろ どーりで、「toInt」とか「int」でホグってもでてこないわけだ 型を見ると、 Prelude. read :: Read a => String -> a これはintじゃなくてもできるの? read "True" read 'c' ってやってみると、「no parse」ってエラーになった
>>609 hoogleで「String -> 」とかでふぐれ。
>>609 Intじゃなくてもできる。例えば、
if read "True" then 1 else 0
なら、文脈からBoolが要求されているので、Boolとして読む。
要求する型を明示するには、
read "True" :: Bool
みたいに書く。
いつも思うんだが、getContentsみたいな遅延IOってハックだよな。 main = do s <- getContents putStr $ map fst $ filter (uncurry (/=)) $ zip s (tail s) と同じ感覚で main = do input <- newStream stdin outputTo stdout $ smap fst $ sfilter (uncurry (/=)) $ szip input (stail input) みたいに使えるnewStream, outputTo, smap, sfilter, szip, stailを副作用なしで書く方法ある?
よくわからんけど、newStreamとoutputToとやらは、hGetContentsとhPutStrの事か? せめてSystem.IOモジュールの一覧くらい眺めてみたらどうだ
型によって処理を分岐させたいんだがうまくいかん。 import Data.HashTable import Data.Typeable hoge a = if typeOf a == typeOf "A" then do hash <- new (==) hashString hoge2 hash a else do hash <- new (==) hashInt hoge2 hash a hoge2 hash' b = update hash' b "HOGE" これだと、次のようなエラーが出る。 test.hs:8:28: Couldn't match expected type `Int' against inferred type `String' Expected type: Int Inferred type: String In the second argument of `hoge2', namely `a' In the expression: hoge2 hash a 関数の中では、型変数の型は一つしかとれないということなのかな・・・? こういう場合はどうしたらいいんだろう。
>>613 わかってないなら、無理に返事しなくてもいいよ
>>613 hGetContentsは副作用に頼って遅延IOを実現している訳だが、
リストの代わりに専用のデータ構造を使えば、似たようなスタイルを副作用なしで
実現できないだろうか、という話。
>617 hGetContents が遅延 IO を実現しているのは、副作用うんぬんとは関係がな い。というか、遅延しない IO にも副作用が必要なわけで、その書き方だと 「副作用に頼らずに IO を実現したい」と言っているように見える。 どうも unsafeInterleaveIO を探しているという話に思えるんだけど、どうですか。 もしくは Streams か SSC を見てみてもいいかも。 Streams にそういう操作が定義されていたかどうかは覚えていないが。
>>614 型による分岐にはData.Typeable.castを使う。
ただ、動的に分岐するより、
>>615 の言う通り型クラスで静的に型を決める方が普通。
>>618 俺が副作用と言ったのはまさにunsafeInterleaveIOのこと。
「副作用に頼らずに」のところは「unsafeInterleaveIOに頼らずに」と読み替えてくれ。
>遅延しない IO にも副作用が必要なわけで
ふつうの(遅延しない)IOモナド上の操作は参照透過で副作用はない、という立場で書いた。
>
>>613 >わかってないなら、無理に返事しなくてもいいよ
少なくともここまでで意図が誰にも伝わってないと思うのだがどーよ。
へたれ仮想コードで解れという方が無理な話。
で、フタを開けてみれば…
>>620 みたいな馬鹿が出てきたのか。
ごめん、今まとめてるからちょっと待ってくれ。
>620 ああそういうことか。 出来るか出来ないかでいえば大して難しくないだろう。でも標準にはないね。 いまちょっと Streams を見てみたが Streams にもそういう仕組みはないようだ。
\ │ /
r;;;;;ノヾ / ̄ ̄ ̄ ̄ ̄
─ ヒ‐=r=;'< ひざまずけ!
'ヽ二/ \______
/ │ \
r;;;;;ノヾ
r;;;;;ノヾ ∩ ヒ‐=r=;'∩ / ̄ ̄ ̄ ̄ ̄ ̄
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄\ ∩ヒ‐=r=;'∩\'ヽ二/< 命乞いをしろ!
>>621 から石を取り戻せ! > 'ヽ二/ / | / \________
__________/ | 〈 | |
/ /\_」 / /\」
 ̄ / /
 ̄
625 :
612 :2007/06/30(土) 22:30:38
ふと思っただけなので外しているかもしれないが、 Arrow を使えば綺麗に書けるんじゃないかなぁ。
アロー使い方わかんね。 易しく解説してください。
628 :
621 :2007/07/01(日) 01:04:44
馬鹿とか書いて悪かったよ。しかし… newtype Stream a = Stream (IO (Maybe (a, Stream a))) これって意味あるんか? IOを別の型として再定義しただけでしょ?駆動するのに専用の関数が必要ならあんまり意味が無い希ガス せめてmonadにしてみるとか。あ,そしたら単にIO monadの(ほぼ)再定義になるだけか。
>>628 型の再帰が必要なのでその定義は必須。
後で抽象データ型として扱うために名前を付けておくという意味もある。
>>630 GJ!
Arrowは少しは知ってたけど、おかげでArrowApplyとMonadの関係が分かった。
632 :
614 :2007/07/01(日) 11:24:15
>>615 >>619 アリガトン。
型クラスを勉強し直して作り直してみた。
-fglasgow-extsをつけると動く。
import Data.HashTable
import Data.Int
instance Hoge Int where
getHashFunc = hashInt
instance Hoge String where
getHashFunc = hashString
class Hoge a where
getHashFunc :: (a -> Int32)
getHashFunc = ¥x -> 0
hoge :: (Eq a, Hoge a) => a -> IO Bool
hoge a = do hash <- new (==) getHashFunc
hoge2 hash a
hoge2 hash' b = update hash' b "HOGE"
つづく
633 :
614 :2007/07/01(日) 11:25:15
つづき。 String(または[Char])をHogeのインスタンスにするとき、-fglasgow-extsをつけないと次のエラーが出る。 test.hs:10:0: Illegal instance declaration for `Hoge String' (The instance type must be of form (T a b c) where T is not a synonym, and a,b,c are distinct type variables) In the instance declaration for `Hoge String' もっと標準的なやり方があるのかな?
>>633 それはどうしようもない。一応、例えば
instance Hoge Char
instance (Hoge a) => Hoge [a]
の二つを用意できれば、Haskell98の範囲で書けたことになるけど。
635 :
614 :2007/07/01(日) 16:55:46
>>633 なるほろ。ありがとう。
haskellって使いにくいなぁ、って思うことがよくあるんだけど、今回の件のように、俺がまだ使いこなせてないだけなんだろうなぁ。
もっと精進せねば。
636 :
614 :2007/07/01(日) 16:56:34
間違えた。 635は633へのレスじゃなくて634ね。
>>635 いや、実際にHaskellは使いにくいと思う。
2年ぐらいHaskellを使っているが、いまだにHaskellがJavaとかcamlとかより使いやすいと感じたことはない。
このスレにくると一発で頭痛くなる
Monadもかなり悩むのにArrowとか言ってるやつとかいるし、おまいらなにげにすごいな
arrowって圏論の射のことだろ?
641 :
低級プログラマー(Java) :2007/07/03(火) 00:23:50
import Char import System main = do cs <- getArgs putStrLn $ map toUpper cs __ , -------- 、__ , - ':::::::::::::::::::::::::::::::::::::::::\ / ;;;;;;;::::::::::::::::::::::::::::::::;;;;;;;;;;;;;;\ /,,;,,,,, ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ,,,,,,,;:::丶 / :::::::::;;,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,;:::::::::::::::ヽ i゙:::;:::::||::::::ii:::::::::::||::::::::::::::::::;:::::::::::::::::::::::::::゙i i゙::::|;;;;| |;;;;| |::::::::::| |:::::::::::::::::||:::::::::::::::::::::::::::::| . i゙::::::i ''''''''''' '───' |;;;;;;;;;;::::::::::::::::::::| .|:::::::|,-====-´ ゙ヽ,,,,,,,,,,,,、 |:::::::::::::::::::| |;::::::::|,-----、 ~ニニ,,_` |:::::::::::::::::::| `ヽ、i (、i´ノ ´い,, ノ ' |;;;::::::::::::::/ なんで、エラーすぐ出るん? . i ^~~~ー==-- ー'-+、 / ゙-、;;;;/ { ヽゝ '-'~ノ λ ''゙゙゙'''-''---、 /-'^ ヽ, ^~^ ( / `丶 、 , - /^l | /( ノ `''''''´~ __, - ' ゙i、 { / /| ̄ ̄ ̄ ̄ _,- '¨ } {/ / ゙ー────'~ \| / ヽ \
それと、 print $ Char.ord '1' ってやると49が帰ってくるんですが、どういう仕様ですか先生。
オヌヌメwwwwwwwwwwww
646 :
デフォルトの名無しさん :2007/07/03(火) 20:54:52
やっぱLISPのが楽しい^^
LISPwwwwwwwwwwwww
648 :
デフォルトの名無しさん :2007/07/03(火) 21:19:14
ハスケルはLISPから生まれたんだよ
問題発言wwwwwwwwwwwwwwwwwwwwww
>>644 |・ω・`)つ『ふつうのHaskellプログラミング』
何回やってもできないYO! --- import System main = do args <- getArgs quad_from (10, 20 ,30, 40) $ read (head args) :: Int quad_from (a1, a2, a3, a4) n = case n of 1 -> a1 2 -> a2 3 -> a3 4 -> a4 _ -> "Nothing" ----Error内容---- caseoftest.hs:4:10: Couldn't match expected type `Int' against inferred type `[Char]' In the expression: (quad_from (10, 20, 30, 40)) $ (read (head args)) In the expression: (quad_from (10, 20, 30, 40)) $ (read (head args)) :: Int In the expression: do args <- getArgs (quad_from (10, 20, 30, 40)) $ (read (head args)) :: Int
>>651 そら "Nothing" は Int じゃないやろ。
>>651 コンパイラの中の人は、多分こんな判断をしてる。
quad_fromの型を推論。Stringである"Nothing"が戻るルートがあるから、quad_fromの戻り値はString。
a1〜a4が戻り値になるルートがあるから、a1〜a4はString。
nは1と比較されているからNumのどれか。Intが優先。
よってquad_fromの型は Num a => (String,String,String,String)->a->String 。
quad_from (10, 20 ,30, 40) $ read (head args) :: Int の全体としての型を推論。
手がかりは
・IOモナドの中なので IO aの形。
・quad_fromが最も外側だから。String
・ユーザーはIntだと注釈を付けている。
さて、これを満たすような型は…
と探して見つからなかったからコンパイルエラーになってる。
解説ありがとうございます。 もうこんなふうにしてみました。全然ダメw import System main = do args <- getArgs print $ quad_from (10, 20 ,30, 40) $ read (head args) :: Int quad_from :: (Int, Int, Int, Int) -> Int -> Int quad_from (a1, a2, a3, a4) n = case n of 1 -> a1 2 -> a2 3 -> a3 4 -> a4 _ -> 100 ----Error内容---- caseoftest.hs:4:10: Couldn't match expected type `Int' against inferred type `IO ()' In the expression: print $ ((quad_from (10, 20, 30, 40)) $ (read (head args))) In the expression: print $ ((quad_from (10, 20, 30, 40)) $ (read (head args))) :: Int In the expression: do args <- getArgs print $ ((quad_from (10, 20, 30, 40)) $ (read (head args))) :: Int
print $ quad_from (10, 20 ,30, 40) $ (read (head args) :: Int) にすればOK(最後の括弧)。
おおぅ できた :: Int ってのがあれだと範囲ひろすぎちゃったのね サンクス
657 :
デフォルトの名無しさん :2007/07/04(水) 02:00:20
Lispは手続き型を許さないプライドが高い本当の無能が使う言語 C/C++系は遅延評価が無いことによる再帰記述への躊躇さを言い訳にした本当の低脳が使う言語
自分の処理系持てるという意味ではlispは最高だょ haskellの処理系作ってる人あまりいないっしょ
>>656 その例では「:: Int」の部分は要らない。
(quad_fromの第二引数になっている時点でIntだと分かるので)
念のため。
>>630 こいつはいい。GJ
ところで、ArrowLoopについても解説願えないかな…?
あれ全然わかんない。
>>630 ArrowApplyの図ってこんな感じで良いんじゃないかと思う。
内側にarrowが入るスロットがあって、第二引数はそのスロットの入力に繋がってる。
┌───┐
f─┼─┐ │
│ ↓ │
│┏━┓│
b─┼┨ ┠┼→
│┗━┛│
└───┘
>>662 それだとappの中にarrowが静的にあるような感じになってしまっていまいち。
中のarrowを点線にするといいかもしれません。
でもやっぱり現時点ですと─|と→|はどちらもarrowに入力する、という意味なので統一できなそうです。
eclipseが重すぎてよく落ちる@256MB winXP
死ねよ貧乏人
外人 『Japanese! Japanese!』 俺 『うっせえよ毛唐、英語が世界の共通語とかナチュラルに思ってんじゃねえよ』 外人 『hmm…』 俺 『Fack you』 外人 『oh』 外人 『miss spell』 外人 『Fuck you』 俺 『Fuck you』 外人 『good!』 その後、一緒に冒険に出かけ、友人になった
668 :
630 :2007/07/04(水) 19:15:00
ArrowApply ≒ Monadって書いたけど、本当はArrowApply = Monadらしい。 つまり、KlisliArrow (ArrowMonad a) は a と等価であるらしい。 細かい証明は載ってないのでArrow則から証明しようと思ったら途中で力尽きた。 圏論に関する知識があるともっと簡単に証明できるんだろうか。 とりあえず後で修正しときます。
>>668 訂正するならついでに MonadLoop も MonadFix に……
>>630 フォント何つかってんの?
MacでHaskellしてんの?
>>670 takuoはVista使い。PDFもAdobe製品で吐いてる。
673 :
低級プログラマ(Java) :2007/07/06(金) 02:36:54
import Char main = do cs <- getContents putStrLn $ unlines $ map toUpper cs ToUpper.hs:4:31: Couldn't match expected type `String' against inferred type `Char' Expected type: [String] Inferred type: [Char] In the second argument of `($)', namely `map toUpper cs' In the second argument of `($)', namely `unlines $ (map toUpper cs)' ./ ;ヽ l _,,,,,,,,_,;;;;i <おいおい ベイべー! l l''|~___;;、_y__ lミ;l たったの三行でもコンパイルエラーだ!! ゙l;| | `'",;_,i`'"|;i | どう足掻いたってコンパイルが通らねぇ!! ,r''i ヽ, '~rーj`c=/ ,/ ヽ ヽ`ー"/:: `ヽ / ゙ヽ  ̄、::::: ゙l, ホント 高卒にHaskellは地獄だぜ! フゥハハハーハァー |;/"⌒ヽ, \ ヽ: _l_ ri ri l l ヽr‐─ヽ_|_⊂////;`ゞ--―─-r| | / | ゙l゙l, l,|`゙゙゙''―ll___l,,l,|,iノ二二二二│`""""""""""""|二;;二二;;二二二i≡二三三l | ヽ ヽ _|_ _ "l ̄ ̄ ̄ ̄ ̄ ̄ |二;;二二;;二=''''''''''' ̄ノ /"ヽ 'j_/ヽヽ, ̄ ,,,/"''''''''''''⊃r‐l'二二二T ̄ ̄ ̄ [i゙''''''''''''''''"゙゙゙ ̄`" / ヽ ー──''''''""(;;) `゙,j" | | |
Couldn't match expected type `String' against inferred type `Char' ところで、この文章しょっちゅう見かけるんだけど、うまく翻訳できません。 「Char型が推論されたが不可で、String型が期待されたが、マッチできなかった。」 "美しい"日本語を見せてくれませんか。
unlines :: [String] -> String map :: (a -> b) -> [a] -> [b] な、なぜだ・・・ map 使うとリストが返ってくるから、 unlines しなきゃいけないんじゃないのか・・・ OTL
toUpperの型をよぅく見るべし
Haskell あんまよー知らんけど、 toUpper が Char -> Char で String が [Char] なんじゃないの?
期待される型 String が推論された型 Char とマッチさせられませんでした?
toUpper :: Char -> Char ■GHCiでいま実行してみた Prelude> Char.toUpper "abc" "ABC" えーと、そうか・・・ map :: (a -> b) -> [a] -> [b] これを見て、この場合は安易にStringのリストが帰ってくると思い込んでたのか・・・ Charのリスト(=String)が返ってくるのかこの野郎ぅ
ぼくは、きょうは、とりあえずGHCiでかくにんしてみる ということを、おぼえました おやすみ
良いことを学んだね。おやすみ。
>>674 型Stringが期待されているが、推論されたのは型Charで、マッチできなかった。
型推論を実装するための考え方を詳しく知りたいのですが、 日本語のお勧めの本てあるでしょうか? >コンピュータサイエンス入門 アルゴリズムとプログラミング言語 (大堀 淳 他) とりあえずこの本は持ってるんですが、 後半が難しいんで、長い間放置してました。 最近また気になりだして、下の本でλについて勉強やり直そうと思います。 >計算論 計算可能性とラムダ計算 (高橋 正子) 他に手に入る良い本があったら教えてください。 数式沢山出てくるとかより、実装寄りの本がありがたいです。
高卒の方にこそHaskellを使ってほしい。
ああ、やっぱHaskellってダメだ。
質問 googleのツールのところにyoutubeが新しく入ってるんだけど、youtubeってgoogleのサービスだったの?
ちょwww
スルーしとけ
>>681 mapが抜けてまつよ。
Prelude> map Char.toUpper "abc"
"ABC"
googleがかなり前に買収しただろうが
module Main where strToInteger = (read :: String -> Integer) main :: IO() main = do putStr "x = " x <- getLine putStr "y = " y <- getLine putStr ("x + y = " ++ show ( strToInteger x + strToInteger y ) ) あの・・・ x = とか y = とかが表示されない、 というか正確には getLine の前に確実に表示されるように するにはどうすればいいでしょうか?
module Main where import System.IO (stdout, hFlush) strToInteger = (read :: String -> Integer) main :: IO() main = do putStr "x = " hFlush stdout x <- getLine putStr "y = " hFlush stdout y <- getLine putStr ("x + y = " ++ show ( strToInteger x + strToInteger y ) )
藻前ら詳しいんだから、haskellの解説本書いてクレヨン
Haskellの長所については十分知ってるし、もう聞き飽きたので、 Haskellの弱点を取り上げた解説本が欲しいな。 「Haskellでうまくいかない1000の理由」とか。
むしろ少なすぎるだろう。
Haskell.NET はどこ?
702 :
デフォルトの名無しさん :2007/07/07(土) 06:57:13
はじめてのH
頭文字省略はHSP.NETと区別つかんから やめてほしい
HSP.NETて・・
お嬢さん、ワシといっしょにH(askell)せんか?
いいわよおじさん、でもアタシ、ドS(tatic)よ?
性的なのか
誰か俺にM(onado)を教えてください……orz
愛は SKK
Haskellの弱点か… ・根本的に実行効率が良くないのは弱点だろう。 ・あとはかなり言われているけど、モジュールシステムが貧弱。 ・型クラスとモナド、高階な型が合わさって複雑になりがちで初学者には敷居が高い。 (複雑になっても型付きのおかげでバグが混入することは少ないのだけど。) ・多バイト文字の扱いが非常に貧弱。 ・純粋関数的でグローバル変数や状態が書きづらいのでモジュール性だとかメンテナンス性が低くなりがち。 リファクタリングツールが充実すればある程度はなんとかなるのだけれど。 ・データや「もの」を中心にしたプログラミング(オブジェクト指向のような)ではなく 処理を中心にしたプログラミングなため、従来のプログラマの直観に合わない。 ・Javaや、Rubyのような軽量言語と違い現実のプログラミングにすぐ適用できるフレームワークやライブラリがない。 あっても型による技巧に走りがちで習得に時間がかかったりする。 ・能力がそこそこなプログラマを多数雇うような開発形態には圧倒的に不向き。 (モダンな関数型言語はすべからくそうなるだろうが)
型クラスって、OCamlのようなモジュールシステムと違って使いどころが複雑になりがちという気がする。 モジュールシステムはトップダウンだが、型クラスは必要に応じて使うために必然的にボトムアップになり、大まかなコードの把握には向かないというか。
・レコードが扱いにくい。フィールドラベルの名前空間がモジュール単位だったり。 ・型レベルの計算が書きにくい。 ・GHCの出力がLGPLのlibgmpに依存している。
・純粋関数なのでprintfデバッグができない。
>>714 Debug.Trace使え。
もしくはunsafePerformIO
Haskellに向いてるアプリケーションって例えばどんなのよ 遅延評価が役にたつような
動的計画法を考えたまま使えるというのが利点か? それでもHaskell自体に慣れる必要があるが
このスレを見ている人はこんなスレも見ています。(ver 0.20) SADでも必死に会社に行っている人 [メンタルヘルス] 圏論 / カテゴリー論 / Category Theory 3 [数学] お前らも大変だな
オタクきも
まあそう言うなって
>>713 >・型レベルの計算が書きにくい。
そんなのが書き易い言語ってこの世に存在するのか?CoqとかAgdaとか?
> ・純粋関数的でグローバル変数や状態が書きづらいのでモジュール性だとかメンテナンス性が低くなりがち。 素人なりにHaskellでいくつかプログラムを書いてみて これはかなり不便に感じた。 あとになって参照したい設定項目が増えたときなんか Haskellじゃなかったら修正楽だろうなって思うこと多々。
研究者って、なんでHaskell支持してんだろ モジュール性だとかメンテナンス性の向上を研究してるはずなのに これ↓じゃ意味無いじゃん > ・純粋関数的でグローバル変数や状態が書きづらいのでモジュール性だとかメンテナンス性が低くなりがち。
それにとってかわるやり方があるんじゃねーの?
implicit parameterでは解決になってない? 型を書くのが面倒になるから俺は使ってないけど。
>>711 っす。
>・純粋関数的でグローバル変数や状態が書きづらいのでモジュール性だとかメンテナンス性が低くなりがち。
は、
>731とか、あとは適切な抽象データ型で隠蔽する(=他のプログラミング言語と同じで)、ってのが正解だと思って書きました。
たとえばある関数で別の場所にある変数が必要になった場合、implicit parameterで渡すってのはかなりやりやすいと思います。
もしくは、適切に定義した抽象データ型を使いまわしているならば、そのコンストラクタにフィールドを一つ追加すればOKになるはず。
純粋関数的な枠組みはメリットも多いのではないかな、…たとえばリファクタリングがゴリゴリできるとか(HaReとか
733 :
続き :2007/07/09(月) 09:04:41
Haskellでは、アドホックなグローバル変数の追加ができないという制限のために、むしろ Haskellプログラマは抽象データ型を使ってモジュール性を高く設計するようになるんじゃないかなーと思ってます。 『モジュラープログラミング養成ギプス』という感じで。 純粋関数的な枠組みに制限されているためにバグが減るのと似たような感じ。 もちろん、アドホックにグローバルな状態を追加できる他言語で開発したほうが、短期的には使い易くなると思うけれど。
734 :
続き :2007/07/09(月) 09:15:32
あ、これだと「状態が書きづらい」は解決になってないかも。 たとえば純粋関数fに状態を入れる場合は、 純粋関数 (f :: ... -> X) の型を (f :: ... -> IO X) とか (f :: ... -> State s X) に修正する必要がある。
一方ロシアはMLを使った。
MoscowMLのことかー!
一方そのころ中国では
計算尺を使った人力アナログコンピュータが大流行
人海戦術による超並列コンピューティング
一斉ジャンプによる巨大地震兵器を開発
そして地球は蹴の冬 or 蹴の夏へ
Pointlessワロタ
>>743 俺は Another junior Haskell programmer か・・
haskellの無限リストはPythonのジェネレータなんかにとって 変わられるのでは。無限リストはメモリ馬鹿食いするからやってられない。 def fib(): a = b = 1 while True: yield a a,b = b, a+b for n in fib(): print n # フィボナッチ数列 遅いし ライブラリ少ないし 英語必須だし デバッグしづらいし デバッグしづらいし まあ、haskell学習中の八つ当たりの書き込みですけど。
無限リストのどこがメモリバカ食いすると? それに速さを追求しながらPythonを使うというのもおかしな話。
750 :
デフォルトの名無しさん :2007/07/10(火) 22:02:24
python は恐らくghciより遅いぞ。 試してないけど。
そうかもしれないですね。学習続けます。 ところで『ふつうのHaskellプログラミング』と『入門Haskell』 を読み終えたので次の学習対象を探していたところ、 『An Introduction to Functional Programming Systems Using Haskell』 を図書館で見つけたのですが、誰か読んだ経験のある人、 今の段階の学習レベルとしてこの本は適切だと思われますか?
>>752 入門Haskell、ふつうのHaskell読んだならAn Intro...は内容が重複しているから読まなくてもよさそうな気がする。
それよりもライブラリの方をよく勉強した方がいい。
というのは、Haskellのライブラリの場合はCのライブラリとかと違って使いやすさとかそういうのよりも、
数理理論面の方が強いから、実装のしかたとかが独特で勉強になると思うよ。
あとは、論文になっちゃうかな。 Scrap your boilerplateなどの論文も読んでみるといい。 Allows関連も勉強してみるといい。
ありがとうございます。探してみます
>754 Allows Allows Allows Allows
Arrows
なんでこんなにArrowが盛り上がってるの?いや、
>>756-757 の話じゃなくて。
なんかあるの?
Haskell'でMonad廃止してArrowにする事になったとか?
Haskellっていまだに10年前の仕様なんだろ? いい加減時期バージョンの情報とかないのか
もう寝るから翻訳よろしく
Arrowって、Monad経験がほとんど無い初級者でも使って嬉しい? ふつける読んでGHCちょっといじって見た程度なんだけど。 難しいモナドは使ったことないし、liftも使ったことないし、合成なんて何それ状態。
Haskell使ってる奴って何なの? 今時OCamlだろwウケるw
一時の気の迷いでHaskellに手を出したら抜けられなくなりました。
とりあえず遅延評価マスターになるまでは辞めるつもりないなー あと2〜3年かかりそうだが
遅延評価なんて、必要になったら勉強すれば良いじゃない
俺みたいな趣味グラマには必要な時は来ないんだよ 自分の中でなんかスッキリした気持ちになった時が快感なんだ
>>767 >766は遅延評価の勉強を遅延評価しろって言いたかっただけだと思われ
>>767 は、遅延評価にしたら永遠に評価されないよって事でしょ。
ボケにマジで返したらダメでしょ
シュールな
772 :
デフォルトの名無しさん :2007/07/14(土) 08:29:50
俺早漏だから、 Haskell がうらやましい。
haskellを習って使ってから仕事でjavaに戻った。苦しいよ。後ろ手で縛られているみたい。mapとタプルはどこ?
774 :
デフォルトの名無しさん :2007/07/14(土) 08:59:25
C++ 使う。 boost 使う。
775 :
デフォルトの名無しさん :2007/07/14(土) 13:52:14
昔は、GHCに-jで、Java吐けたんでしょ? 今は動きないの?
処理系の価値は「昔どうだったか」できまるもんじゃねぇ 「今現在どういうやつか」できまるもんよ
777 :
デフォルトの名無しさん :2007/07/16(月) 03:07:09
犯罪者にとっては、haarp使ってスマトラ沖地震などを起こして 10〜20万人を殺すことも基本だからな。
先生、なんでCやJavaにはタプルがないとですか?
779 :
デフォルトの名無しさん :2007/07/18(水) 01:32:31
一昨日には沢山の地震が起きましたね。 サイバネティクスに詳しい人なら知っていますが、 犯罪者にとっては、マイクロチップをインプラントして マインド・コントロールするのも常識ですね。 そんな、他の計算時間を奪ったり、 他の計算プログラムを破壊したり、 共有データを捏造したりする、 ヒューリスティクス計算法をユダヤソルバと言います。 二番煎じは中華ソルバですが。
780 :
デフォルトの名無しさん :2007/07/21(土) 11:15:17
ハスケルっていう言葉の響きが好きだ
781 :
デフォルトの名無しさん :2007/07/21(土) 12:33:43
ずっとハクセルだとおもってた
純粋関数型言語セクロス
誰かGHCのマニュアルを日本語に翻訳してくれ〜
786 :
783 :2007/07/28(土) 17:03:47
今主にCかpythonを使ってるんですが関数型言語もやりたくなってきあsみた
禿げるよ?
もう毛根はかなりキているのでむしろ潔く禿げてしまいたいです。 こんな私ですがよろしくお願いします。
マジメな話さ 彼女(彼氏)いないプログラマって、白髪めちゃめちゃ多くないか? セックスって健康面でとても大事な行為なんだな
SchemeとかHaskellに慣れるとCの関数ポインタの型の柔軟性の 無さにイライラするようになる。 Pythonで高階関数を頻繁に使うようになる。
それがよいことかどうか
Scheme や C は同一リスト中に様々な型のデータを混在させる事が 出来るけど Haskell は出来ないよね。
>>793 混在させるだけならいくらでも。
import Data.Dynamic
list = [toDyn 4, toDyn "foo", toDyn sqrt]
やりたいことによってはもっと良い方法があるかも。
796 :
デフォルトの名無しさん :2007/07/30(月) 06:36:22
関数プログラミングってのは、C++とemacs Lispのプログラマには無縁? Lispユーザといっても簡単なマクロみたいな使い方だからなぁ
「関数的なプログラミング」なら言語はあまり問わない場合もある。 純粋かどうかを気にする人には邪道だろうけど。
elispはlispの中でもまた特殊なやつだし。
C++ハゲとHasKellハゲはどちらがハゲなのか
800 :
デフォルトの名無しさん :2007/08/01(水) 01:49:14
>SADでも必死に会社に行っている人 悪意のある低知能はこんなスレを関連させるな。
329 :名無しさん@八周年:2007/08/01(水) 21:28:10 ID:ZHT1JrWe0
>>308 haskellがすでに大流行してる。本屋でもHaskell本だらけだし、
Javaから呼び出してJVM上で動かせるし。最近ではプログラム
始めたばかりの初心者でも普通にモナドを使いこなしてる。
Javaから呼び出して?VM上で?できたっけ???
まさかjhaskellってオチじゃなかろうな・・・ でもそれだとjavaから呼び出すことにはならないし・・・ なんなんだろう?
804 :
デフォルトの名無しさん :2007/08/08(水) 12:59:03
Haskel.NET だぜ。
しかしIOモナドってひどいネーミングだな。 モナドであることはIOの性質の一つに過ぎないのに。 実際、IOを扱うためにはまずモナドを理解しなきゃならんと 勘違いしてる入門者は多いんじゃないだろうか。
806 :
デフォルトの名無しさん :2007/08/08(水) 14:10:12
>>805 それ、俺。
C/C++/Java しか使ったことがないので
面白そうだなと思って入門的なウェブページ
眺めてみたけど、「モナド」とかわけわかめな用語が出てきて挫折。
「俺は、俺は、Hello World とかしたい程度なのに」と絶叫、死亡。
代数学で出てきたような気もするが、全然意味が違う気もする。
というより、なんかゴルゴ13に狙撃されそうな名前だしさ。
>>805 モナドの定義より先にHaskellでのモナドの実装をみる方がHaskellでモナドプログラミングするためには良いと思う。
What is monad? That is what when you lose one gonad.
Fランク大の落ちこぼれが 東大学部生の教養プログラミングに 物申す展開か
やべーな、arrow流行らせちまった・・・2chでもblogでも日本で最初にarrowのこと書いたの俺だ・・・
自慢かよ
俺の真理: 英語が苦手なやつほどながったらしい関数名をつける
じゃあ俺の真理: 真理とかもう逝っちゃってる奴らだな
俺の真理のことを悪く言うな!!
でも、Haskell'には、Arrowは入らないらしいが。-<の事だと思うけど。
すいません。教えてください。 今、haskellで囲碁のプログラムを組んでいるのですが、 石の塊(連という)の座標の集合を求める関数を書こうとして躓いてしまいました。 C++で書くと以下のようになります。 void getRen(const IgoBoard &board,Point point,Stone stone ,set<Point> & ren) { if(stone == board.getStone(point) && ! ren.include(point)) { ren.insert(point); getRen( board , Point(point.x+1,point.y ) , stone , ren ); getRen( board , Point(point.x-1,point.y ) , stone , ren ); getRen( board , Point(point.x ,point.y+1) , stone , ren ); getRen( board , Point(point.x ,point.y-1) , stone , ren ); } } 問題 ren の部分をどう書くかです。 haskellはポインタや参照が無いし、一度代入した値を変更することもできないらしいので 探索の先々で同じrenを使う方法がわから無いのです。 haskellではどう書いたらよいですか。
>>819 T型の値を変更する関数を書く代わりに、T型の値を受け取ってT型の値を返す関数を書くのが定石。
俺ならこんな感じで書く。
getRen :: IgoBoard -> Point -> Stone -> Set Point
getRen board point stone = augmentRen point empty
where
augmentRen :: Point -> Set Point -> Set Point
augmentRen (Point x y) ren
| stone == boardGetStone board && not (member point ren)
= augmentRen (Point x (y-1)) $
augmentRen (Point x (y+1)) $
augmentRen (Point (x-1) y) $
augmentRen (Point (x+1) y) $
insert point ren
| otherwise = ren
821 :
820 :2007/08/18(土) 00:28:29
ひどいバグを仕込んでた。 (Point x y)のところはpoint@(Point x y)で。
822 :
819 :2007/08/18(土) 11:03:32
>>820 ありがとうございます。
augmentRenを直列に並べるのは思いつかなかったです。
なぜか並列に並べなければいけないという思い込みがありました。
823 :
819 :2007/08/24(金) 23:54:16
824 :
デフォルトの名無しさん :2007/08/26(日) 03:13:50
ドキュメントを眺めていて、instance Monad ((->) r) というのを見つけました。 「rから何かへの関数」がモナドになっているみたい。実装は Control.Monad.Instances 内。 モナドだというからにはdoで連ねることができるんだろうけど、どういう挙動になるんだろう。
>>824 Hugsのファイルを見てみたら
instance Monad ((->) r) where
return = const
f >>= k = \ r -> k (f r) r
ってなってたので、いくつか試してみた。
f = succ >>= (*)
f 5
=> (\ r -> (*) (succ r) r) 5
=> (succ 5) * 5
=> 30
p = id >>= (,)
p 5
=> (5,5)
>>824 Readerモナドと同じ。関数をReaderにラップする手間が省けるだけ。
>>826 Control.Monad.Readerに instance MonadReader r ((->) r) ってのがあるね。
828 :
819 :2007/08/26(日) 15:34:26
すいません。また教えてください。 haskellは演算子を定義できるそうですが、Pointに+を定義しようとしたらコンパイルエラーになりました。 どうも、数値の+とかぶっているから駄目ぽいのですが回避する方法はあるでしょうか。 なお演算子を+++にしたら動きましたが、見た目がダサいので何とか+を使いたいです。 ============ソース=========== data Point = Point_new { x :: Int , y :: Int } deriving ( Show ) (+) :: Point -> Point -> Point a + b = Point_new ((x a)+(x b)) ((y a)+(y b)) main = putStrLn $ show $ ((Point_new 3 4 ) + (Point_new 5 7)) =============コンパイルエラー================== test.hs:5:24: Ambiguous occurrence `+' It could refer to either `+', defined at test.hs:5:2 or `+', imported from Prelude test.hs:5:38: Ambiguous occurrence `+' It could refer to either `+', defined at test.hs:5:2 or `+', imported from Prelude test.hs:7:43: Ambiguous occurrence `+' It could refer to either `+', defined at test.hs:5:2 or `+', imported from Prelude
(+) :: Num a => a -> a -> a だからPointでも(+)を使いたいならPointをNumクラスのインスタンスにしないとダメ。 まずNumクラスのインスタンスであるためにはEq, Showクラスのインスタンスである必要があるから data Point = Point_new { x :: Int , y :: Int } deriving ( Eq, Show ) Numクラスのインスタンスにするためには(+),(*),abs,signum,fromIntegerを定義しないとダメ。 ただ今回の場合(+)さえ使えればいいってことだろうから、(+)以外はダミー定義にしてしまう。 instance Num Point where Point_new x1 y1 + Point_new x2 y2 = Point_new (x1+x2) (y1+y2) (*) = undefined abs = undefined signum = undefined fromInteger = undefined これでPoint_new 1 2 + Point_new 2 3が出来るようになる。
>>828 そのソースなら、+の代わりにMain.+やPrelude.+と書いて
曖昧性を除けば良い。面倒だけど。
自分で+を定義せずにPrelude.+を拡張するなら
>>829 の通りだけど、
乗算が定義されていない型をNumのインスタンスと宣言しないといけない。
Haskellの弱点の一つだな。
831 :
819 :2007/08/26(日) 19:58:45
>>829 >> 830
どちらの方法でもいけることを確認しました。
829の方法を採用させていただきたいと思います。
クラスについても勉強したいと思います。
ありがとうございました。
832 :
デフォルトの名無しさん :2007/09/03(月) 14:55:42
それ単に Scheme を解釈出来るプログラムが作成出来るだけで、 マルチコアでスケールする Scheme とか、リアルタイム性能を持った Scheme とか、大量のメモリを効率良く使える Scheme が書ける訳じゃ ないんだよね。ただ、世間に出回っている Scheme 処理系を 1 つ 増やしたいだけなのであれば C で充分。
チュートリアルなんだから書くことに意義があるんだろ。 それにCで十分てのも意味不明。CでできるからってCを使う理由にはならないだろ。
Haskell が産声をあげた頃、r4rs の表示的意味論を Haskell でコーディングしてみたことがあった call/cc とかもちゃんと動いてちょっと感動した記憶がある プログラム意味論の面白さを始めて実感した瞬間だったな
Lisp で Prolog 書いたり、Haskell で Perl 6 書いたり、SML で ECMAScript 書いたりするのは 楽しいんだろうけど、動いたらおしまいなんだよね? 常用出来る様な処理系を書こうとしたら C や C++ で書き直す事になるでしょ。何かむなしいのう…
>>838 Prologくらいの変り種になると,それを何かの言語で実装したものは(toy実装であっても)
例えば「ユニフィケーションライブラリ」とでも呼ぶべき存在になるので
けっこう実用性があると思うけど.
On LispというLispの本ではデータベースのインタフェイス(普通ならSQLが来る位置?)
としてPrologを実装してた.
>楽しいんだろうけど それが大事なんじゃないの?
>>838 HaskellでPerl6、SMLでECMAScriptってのは
そもそもその時点で動作する処理系自体が存在しなかったから
実用性よりもまずきちんと動くことが重要。
Pugs知らないんだけど、Parrot経由でも実用にならないの?
ParrotでなかなかPerl6が作れないうちに、HaskellでPerl6(仮)が書けちゃったってのがPugs。 実用云々を言う以前に、Perl6の仕様は固まりきっていないんだけどね。
>>844 >>843 が『Parrot 経由』と言ってるのは、Pugs に Parrot 用のアセンブラを吐かせて
Parrot VM で実行するという事じゃないかな。Parrot が実用になった暁には、そういう
アプローチはありだと思う。ただし、Parrot が実用になるのは…
>>832 のチュートリアルを一通り読んだら、自分でインタープリタを改造して JavaVM /
MS CLR / Mono VM / Parrot VM / LLVM 用のコンパイラを作れば良いんだよね。
と、
>>832 の中身を読まずにカキコ。
SML の ECMAScript の実装も Tamarin 向けのコンパイラだったら良かったなあ。
848 :
デフォルトの名無しさん :2007/09/07(金) 18:58:30
Tamarinが悪いのっ!
すみません、関数型初心者なんですけど、勉強するならHaskellがいいんでしょうか。 Ocamlとかありますが、こちらは関数型としてはルーズな仕様と聞きました。 関数型の特徴を一通り体験できる、典型的な言語って何でしょうか。
Haskell
>>850 関数型の重要な特徴はどっちにもあるから好きに選べば良い。
むしろ、HaskellとOcamlの両方にあるのでなければ「典型的な」特徴と言いにくい気がする。
片方を知ればもう片方を学ぶのも比較的簡単なので、気に入らなければやり直せば良いし。
853 :
850 :2007/09/08(土) 19:55:57
HaskellとOcamlとの違いは、厳格かルーズか、でしょうか?Ocamlはちょっと調べて みたんですけど、とっつきやすい感じがしました。 あと、ドキュメント、ライブラリが充実しているのはどちらなんでしょうか。
25歳。 去年まで金無し君だったけど、Haskellで 二年で350万貯めた。一度やってみなよ。 初回のみだけど、参照透明性を捨てれば副作用(4000円くらい)が貰える。 もらうだけもらってプレイせずに換金することもできるし、遅延評価を 思い切って止めてしまえば50パーセントで二倍速になる。 金なきゃMLスレで布教活動すればいいだけ。暇つぶしになる。 \とか$とか色々あるのでマジでお勧め。
>>854 にさりげなく吹いてしまったんだが、
このコピペの元ネタを教えてはもらえまいか?
857 :
855 :2007/09/11(火) 03:09:22
OCamlのほうが厳格(strict) だろ。
>>858 【審議拒否】
∧,,∧ ∧,,∧
∧∧ (・` ) ( ´・) ∧∧
(ω・` ) U ) ( Uノ( ´・ω)
| U u-u u-u (U ノ
u-u ∧,,∧ ∧,,∧ u-u
(・ω・`) (´・ω・)
(l U) (U ノ
`u-u'. `u-u'
haskellでターン制ストラテジーゲームとか作れますか?
作れる。 ただし、ライブラリが腐ってたときに、自分で回避策を書いたり パッチを送ったりする気になる程度にHaskellを愛していないと、 やってられなくなるかも。
C++以上の茨の道になりそうですね… 入門書のサンプル弄ったり、C用のアルゴリズム辞典のアルゴリズムを移植して満足しているレベルの俺には ほぼ絶望的ってことはわかりました
GHCでコンパイルすると起動したときDOS窓が出るけど、出さないようにするオプションは無いの?
>>863 -optl-mwindowsをつけてコンパイル
haskellを勉強したいんですけど、入力補完してくれるツールってありますか?
emacs
emacsかぁ。自分は慣れてないからなぁ。 とりあえず、eclipseのプラグインとか、Visual Haskelとか入れてみたんですけど 入力支援とかうまくできないみたい。 emacsですか、そうですか。
868 :
デフォルトの名無しさん :2007/09/16(日) 19:09:01
Haskellって(ADTはあるにはあるけど)、 リストとかalistとかのデータ構造を直接操作するのが多くて、 そのせいでスケーラブルじゃないプログラムが量産されてる気がする
気がするといえば、Haskellで書いたコードはモジュール性はかなり高くなるけど 再利用性が低い気がする
もうHaskellもうんこでいいよ…
あとうんこじゃない言語を知ってる人は俺に教えてくれ。
>>869 俺はむしろ逆の印象を受ける。
再利用に強いが変更に弱い。
>>868 Lispを筆頭に関数系は大抵そうじゃないかと思ったが、
それ以前に、スケールするかどうかは、テータ構造を直接触ってるかどうかと関係ないのではないか。
ここで言ってるスケールってどういう事? 問題の規模に応じたスケール?
Dってまだ生きてたの?
>>874 Dはないw
コンパイラもライブラリもボロボロ
あれで何か作るって無謀すぎる
まだ形になってるC#の方がまし
>>875 D自体は相変わらず突っ走ってるよ。
バグ取りもそこそこに、言語機能をどんどん追加していってる。
実装予定してる機能も多数ある。
それに対して、取り巻きの方は死んでる。
どのプロジェクトも、ライブラリを最新版のコンパイラで動かすのをあきらめてる状態。
もうみんなやる気ないみたい。
Dはちょっとやろうかなという気にさせる魅力はあるが、 付き合いたくはないね。
>>879 そんな構文はない。
data ABC = A | B | C
とか
data Blood = A | B | O | AB
となら書けるけど。
この場合、AとかABとかは文字でも文字列でもない新しい値。
http://web.yl.is.s.u-tokyo.ac.jp/~ganat/memo/aboutHaskell.html にある
qsort [] = []
qsort (x:xs) = qsort elts_lt_x ++ [x] ++ qsort elts_greq_x
where
elts_lt_x = [y | y <- xs, y < x]
elts_greq_x = [y | y <- xs, y >= x]
というクイックソートですが、これのメモリ消費量は、リストの長さをnとしたとき、O(n^2)になるような気がするのですが、どうでしょうか。
またCやJavaで配列を使うと、配列そのものを書き換えることで、メモリ消費量は増えませんが、Haskellでも同じようなことができますか。
>>879 ありがとうございます。
いわゆる列挙型を定義しようとしていたのですが、列挙型の値に文字、文字列、数値は指定できないということでしょうか。
あと、
data Rank = A | B | C
data Blood = A | B | O | AB
としたいのですが
Multiple declarations for data constructor "A"
といわれます。列挙型の値の名前空間というかスコープは、グローバルということでしょうか。
>>883 O(n)にはならないように思うのですが。
整列が完了したら、参照されなくなったリストはGCされますが、整列中の間は参照されているわけですからGCされませんよね?
再帰呼び出しごとに新しいリストが作られ、それらは呼び出しから戻らないとGCされませんが、呼び出しから戻る前に別の再帰呼び出しが発生するわけだから、やはりメモリ消費量はO(n)ではないと思います。
また再帰呼び出しの深さは最大n-1になるので、やはりO(n^2)ではないでしょうか。実際には、呼び出しの深さは平均でlog(n)でしょうから、 O(n*log(n))が正解かもしれませんが。
詳しい人、お願いします。
>>884 確かにそうだ。最悪O(n^2)になるな。
でも、中間リストを作ることが直接の原因ではない。
実際、正確評価ならelts_lt_xとelts_greq_xを作り終えた時点で引数のxsはGCできる。
遅延評価だとこれが上手くいかなくて、逆順にソートされたリストが渡される最悪のケースでO(n^2)になる。
時間的には同じ最悪のケースでも、入力が正順にソートされていた場合はO(n)なんだが。
汚い方法だけど、seqを使って評価順を入れ替えることでO(n)になる。
qsort [] = []
qsort (x:xs) = length elts_lt_x `seq` length elts_greq_x `seq`
qsort elts_lt_x ++ [x] ++ qsort elts_greq_x
where
elts_lt_x = [y | y <- xs, y < x]
elts_greq_x = [y | y <- xs, y >= x]
プロファイル取って調べてみた。数字はtotal allocにqsortの%allocをかけたもの。左の数字は要素数。
>>881 とランダム要素のリスト
800 : 380003.544
1600: 873076.32
2400: 1296538.048
3200: 1816425.728
4000: 2399276.16
>>885 とランダム要素のリスト
800 : 400965.324
1600: 1040519.448
2400: 1389810.24
3200: 1846377.12
4000: 2776879.088
>>881 と整列リスト([1..n])
800 : 8985561.144
1600: 35887143.13
2400: 80695069.14
3200: 143405095.9
4000: 224106868.3
>>885 と整列リスト([1..n])
800 : 8995036.344
1600: 35906208.73
2400: 80723725.14
3200: 143443342.3
4000: 224154724.3
最悪ケースだとO(n^2)になるっぽい
887 :
886 :2007/09/21(金) 13:00:44
ちなみにコードはこんな感じ import System.Random main = print . qsort =<< lst 800 lst n = fmap (take n . randomRs (1, 1000000)) newStdGen lst2 n = return [1 .. n] qsort [] = [] qsort (x:xs) = qsort elts_lt_x ++ [x] ++ qsort elts_greq_x where elts_lt_x = [y | y <- xs, y < x] elts_greq_x = [y | y <- xs, y >= x] qsort2 [] = [] qsort2 (x:xs) = length elts_lt_x `seq` length elts_greq_x `seq` qsort2 elts_lt_x ++ [x] ++ qsort2 elts_greq_x where elts_lt_x = [y | y <- xs, y < x] elts_greq_x = [y | y <- xs, y >= x] main関数のqsortとlstと800の部分を変化させながら計測していった。
>>886 total allocは確保したメモリの総量だから、空間効率を計るのには使えない。
+RTS -sstderrをつけてmaximum residencyを見ればO(n)になってるのが分かると思う。
>>888 >total allocは確保したメモリの総量だから
補足。確保->回収->確保で多重に計上されるってことね。
maximum residencyは瞬間的な使用中のデータ量の最大値(を実測で近似したもの)。
891 :
886 :2007/09/21(金) 14:04:46
>>888 >>890 なるほど。
HaskellのGCって、いらなくなった瞬間に動くものだったんだな。
もっとメモリが足りなくなってから動くものだと思ってた。
(そういう扱いをする部分(世代?)もあると思うけど)
というかそれ以前に、885で
>逆順にソートされたリストが渡される最悪のケースでO(n^2)になる。
って書いてあるのになにも分かってなかった。
あと885は
qsort [] = []
qsort (x:xs) =
let !elts_lt_x = [y | y <- xs, y < x] in
let !elts_greq_x = [y | y <- xs, y >= x] in
qsort elts_lt_x ++ [x] ++ qsort elts_greq_x
と書くといいかなと思ったり。
>>891 >HaskellのGCって、いらなくなった瞬間に動くものだったんだな。
デフォルトだと確保エリアの大きさは256kらしいから、第0世代のGCは頻繁に起こるんだろう。
>と書くといいかなと思ったり。
それだとリストの先頭しかeagerに評価されないから、
[99, 100, 97, 98, 95, 96, ..., 4, 1]
みたいなリストが入力だとO(n^2)になる。
リストを最後まで評価させるために
>>885 ではlengthを使ってる。
先生! はすける君がごみ拾いばかりして、ちっとも仕事してません! 実行時間の3割がGCとか、普通ですよね
ちょっとしたループを書くにもconsを大量に使い捨てるスタイルが一般的だからな。 まあ、メモリ確保は馬鹿みたいに速いんだから許してやろうぜ。
>>885 このコードが理解できない初心者のために、教えてください。
seqは遅延評価をしないための関数のようですが、lengthは何のためにあるのでしょうか。
あとseqは2項演算子として使うのが普通なのですか。
qsort [] = []
qsort (x:xs) = seq (length elts_lt_x) (seq (length elts_greq_x) (qsort elts_lt_x ++ [x] ++ qsort elts_greq_x))
where
elts_lt_x = [y | y <- xs, y < x]
elts_greq_x = [y | y <- xs, y >= x]
と買いても間違いではない?
>>886 >数字はtotal allocにqsortの%allocをかけたもの
total alloc と %alloc が何か分からないので、それらをかけて何が求まるのか分かりません。
total alloc は全体のメモリ消費量で単位はバイトでしょうか。
>>889 見てみました。わざわざありがとう。
で、この絵では再帰呼び出しのときには古いリストがGCされているようだけど、これはHaskellの言語仕様として決まってるんでしょうか。
つまり、
(a)引数で渡されたリスト
(b)etls_lt_x と elts_greq_x
(c)qsort elts_lt_x ++ [x] ++ qsort elts_greq_x でできるリスト
があって、他の言語だとリストへの参照がある限りGC対象とはならないので、(a)より(b)のほうが先に(または同時に)GC対象となります。そのため、
>>884 で書いたようにO(n^2) になります。
しかし
>>889 の説明では、(b)より(a)のほうが先にGCされています。
これだと確かにO(n)になりますが、このように動作するためには、再帰呼び出しをするまえに(a)がGC対象とならないといけないわけですが、本当にこのように動作するのでしょうか。
またそれは言語仕様で保証されているのでしょうか。
Haskellをよくわかってないので勘違いしてるかもしれませんが、お願いします。
>>895 それで合ってる。seqを中置で使うのは良く見かける気がする。
seqを使っているのは再帰に入る前にelts_lt_xとelts_greq_xを完全に評価するため。
未評価のelts_greq_xのサンクはxsを参照しているけど、
完全に評価してしまえばただのリストなので、xsへの参照がなくなって、
GCがxsを回収できるようになる。
seq A Bの値はBと同じだけど、この式を評価する時はまずAを評価して、
その結果を捨て、改めてBを評価する。
length elts_lt_x `seq` 本体
を評価するときは、まずelts_lt_xの長さを求めることになるが、
リストの長さを求めるにはリスト全体を評価する必要がある。
結局、本体が評価される前にelts_lt_xが完全に評価される。
lengthが必要な理由には、seqの仕様が関わってくる。
seq A Bが評価されるとき、Aは弱冠頭正規形(weak head normal form, WHNF)まで簡約される。
WHNFというのは、最も外側のデータ構築子が確定した形。
例えば1+2や[1,2]++[3,4]はWHNFじゃないけど、3や1:([2]++[3,4])はWHNF。
だから、lengthを使わずに
elts_lt_x `seq` 本体
のように定義すると、例えば
elts_lt_x = [y | y <- [1, 2, 3, 4], y < 5]
のとき、これを
elts_lt_x = 1 : [y | y <- [2, 3, 4], y < 5]
と簡約したら、この段階でWHNFに達したことになり、評価が終わってしまう。
これだと、xs(ここでは[2, 3, 4])への参照が残っていて、GCがxsを回収できない。
ところで、空間計算量を議論する時に、GCを考慮するのは普通なん?
>>898 GCがある環境なら考慮していいと思う。じゃないと、机上の空論となるから。
GCがなければO(n^2)になるのが、逐次GCがかかることでO(n)になるなら、そっちを議論しないとあんまり意味なくね?
もちろん前提条件として明示する必要はあるよ?
>>897 力作ありがとうございます。
seqは完全に遅延評価を回避できるわけではないんですね。なんというか、オブジェクト指向言語でよく出てくるshallow copyとdeep copyの違いみたいな感じでしょうか(つまりseqはshallow copyに似ている)。
しかし完全に評価するためにlengthを使うのって、bad know howですよね。
このためにlengthを使うのは、lengthの本来の用途ではないのだから、完全に評価するための専用の関数が標準で用意されるべきたと思いました。たとえその実体がlengthであったとしても。
Control.Parallel.Strategies.force :: (NFData a) => a -> a を使うのかな。 これはこれで目的外使用な気もするが。
>>899 処理系がタコなせいで遅いのなら、そっちを直すべきじゃね?
904 :
886 :2007/09/21(金) 23:41:03
>>895 -prof付きでコンパイルしてから+RTS -p付きで実行するとプロファイルがとれて、
Fri Sep 21 23:19 2007 Time and Allocation Profiling Report (Final)
main.exe +RTS -p -RTS
total time = 0.05 secs (1 ticks @ 50 ms)
total alloc = 9,079,028 bytes (excludes profiling overheads)
COST CENTRE MODULE %time %alloc
main Main 100.0 0.3
qsort Main 0.0 99.1
というようなログが出力される。
total allocとか%allocはこれのこと。
total allocはアロケートされたメモリの累計で、%allocは各関数ごとの割合。
とまあそういうことなんだけど、ここでの議論は、GCでメモリが再利用されて
O(n)になるという話なので、無意味と言うか、的外れと言うか、
>>886-887 は無かったことにしてください。
メモリ使用量を正しく知る方法は
>>888 。
> qsort Main 0.0 99.1 消費時間0%…遅延評価のマジックですなあ
906 :
デフォルトの名無しさん :2007/09/24(月) 11:13:33
>>905 いや、プロファイラの精度の問題だろw
>total time = 0.05 secs (1 ticks @ 50 ms)
一個しか標本を取ってないんだから、片方が100%になるのは必然。
907 :
デフォルトの名無しさん :2007/10/01(月) 22:33:18
concatの反対で "AAA BBB CCC" を ["AAA", "BBB", "CCC"] にするにはどうしたらいいの? parsecというものをimportしてParserを作らないといけないのでしょうか?
wordsのことかな。
909 :
907 :2007/10/02(火) 16:59:39
ありがとう。それだ。 ふつうのHaskellプログラミングに乗ってないんだ
それらしい所を漁るといろいろ出てくるね ghc/libraries/base/Data/ByteString/Char8
>>909 Hoogleで欲しい関数の型を検索してみると割とヒットするよ。
今回はString->[String]。
>>913 こんなマニアックなものがあるのか・・・
eclipseで書いてるんだけどもHaskellパースペクティブが使いにくくてしょうがないYO モジュール名を’M’から始めないとinvalid_nameとかいわれるのはなぜなんだぜ?
>>915 Haskellプラグインをどこが作ってるのかは知らないが、
オープンソースなんだろうし、開発を手伝ってきたら?
917 :
907 :2007/10/15(月) 22:15:18
できたー ありがとう
HaskellでRubyやLispのrestパラメータのように 複数の引数をまとめてリストにしたい場合はどうするのでしょうか?
可変個の引数をとる関数は定義できない。 型クラスを使って真似する方法はあるけど。
>>921 > 定義できない
> 方法はある
どっちなんだ
>>922 できない。似たようなことをする方法はある。
やりたいことにもよるんだけど、直接リストにして受け渡すようにすれば良いんじゃない? hoge :: 任意個のa -> b ではなくて hoge :: [a] -> b 引数の型が違う時は data Param = PInt Int | PString String hoge :: [Param] -> b みたいな感じ。
925 :
デフォルトの名無しさん :2007/10/21(日) 22:36:34
今Programming in Haskellを読んでいます。 List comprehensionという語の日本語訳が難しいのですが 普通はどう訳されているのでしょうか?
GHCタッグリーグ戦にあのチームが緊急参戦?
包茎珍宝のリスト
同じプレゼンソフトを使ってるだけじゃないか?
>>922 Text.Printfを見てみるといい。(単に可変個の引数の話だけど)
どこで見れる?
昨日ふつける読み始めた俺に誰か教えてくれ Cと連携したりできんの? CからHaskellの関数呼んだりHaskellからCの関数呼んだり
>>938 どーやって?
CとHaskellって型とかだいぶ違う気がするけどそこらへんどーすんの?
>>940 あまりの優しさにチンコ取れた
ありがとー読んでくる
誰かHaskellの文法一覧みたいな便利なものがあるサイト知らない?
>>944 思慮が足りないな。
仮にもhaskellに興味を持つような人間がそのサイトを知らないわけないだろ。
>>943 が言いたいのはそのサイトが不便だってことなんだろうよ。
>>944 流石にそれは見たことあるわ
>>945 そうそう
もっと適当にまとまってるとこねぇかな
ふつける読み返したり
>>944 見たりするのはめんどくさい…
>>946 言い出しっぺの法則。というわけで、wikiでも建てて作ってくれ。
case x of { "a" -> 1; "b" -> 2} はうまくいくのに str1 = "a" str2 = "b" case x of { str1 -> 1; str2 -> 2} は、str1,str2がwildcardとみなされ、意図通りに動きません。 caseのpatternに変数を使う方法はないでしょうか? ちなみに意図しているのは、以下と等価な動作です。 if x == str1 then 1 else if x == str2 then 2 else error ""
CやJavaのswitch文でcaseに変数使えたっけ?
無理だとと思う、代わりにこんなのは?(あんまりまっとうな回答ではないのでわからなければスルー希望) --source1.hs Module Source1 (str1,str2) where str1 = [| "a" |] str2 = [| "b" |] --source2.hs import Source1 case x of { $(str1) -> 1; $(str2) -> 2}
>>951 [| "a" |]の型はQ ExpであってQ Patじゃない。
そもそもパターンにspliceを書くことはできないはず。
>>949 の意図と違うとは思うけど
table = [(str1,1),(str2,2)]
fromMaybe (errror "") $ lookup x table
関数型初体験してみたが、 ふたつの引数 m n をとって m * (m+1) * .... * (n-1) * n を返す関数を 再帰的定義を用いて書け なんて問題を解くのに30分もかかった… 普段とぜんぜん違う思考法を要求されて面白いねこれ
>>955 Haskellやると頭がよくなった気がする。あくまで気がするだけだけど・・・。
とりあえず、ふつうのHaskellは読んで文法とか何となく理解したのですが、 次のステップってどんなのがいいんでしょうか。 自分はWebアプリを実装してみようとか思ったんですけど、基本部品(Http リクエスト解析とか、DB処理など)使ったものやるよりも、「Write Yourself a Scheme in 48 Hours」みたいなのを勉強する方がよいのかな?と思ってます。 おすすめのHaskell学習資料なんかがあったら教えてください。
>>957 まだHaskellであまりコードを書いてないなら、とにかくたくさん書いて慣れるのが重要だろう。
インタプリタ書くのは良い訓練だけど、やりたいことがあるならそっちをやった方が
モチベーションが上がりやすくて良いと思う。
>>957 散々過去に同じ質問が出ているわけだが。
論文読め。
皆さん、ありがとうございます。 自分の経験から、あまり文法一覧を基本にした学習ではなくて、実際の アプリ実装ベースでの学習をしたいと思ってます。目標はWebアプリの 雛形作ることなんですけど、既存コードの寄せ集めになってしまいそう なので、Haskellのくせというか、定石みたいなの知った上でやりたいなと。 Write Yourself a Scheme in 48 Hoursみたいなのがいいんですけど、 似たようなの他にもあるかなぁと思って質問しました。
haskellはやめておけ。 プログラミング手法が確立されていないから、 研究目的以外でやるなら別の言語を使え。
のぶすんすんすん
のぶすんのおなにーさいと
>>955 お前頭いいな。
(m+1) * .... * (n-1)
俺には、この省略されたところで何があったのか見当もつかん。
m+1<n ってことか?
>>968 俺が察するに、m<nとして m, m+1, m+2, m+3, .. , n-3, n-2, n-1, n の乗積を求めたいんだろう。
>>955 その例は、手続き型でも大差ないだろう。
int f(int m, int n)
{
return m <= n? m * f(m+1,n) : 1;
}
求めるのが「mからnまでの積」ではなく「mからnまでのlist」だと、 CやFortranでは一気に面倒になるね。
非再帰の方が楽だな。 f m n = foldl (*) 1 [m..n]
そのfoldlはhaskellでどう定義するのかね。 ああ、foldlはCで書かれてるなんて言わないでね。
fl :: (a -> b -> a) -> a -> [b] -> a fl _ x [] = x fl fn init (el:la) = fl fn (fn init el) la
foldlはライブラリにあるんだから実装はどうでもいいだろ 手で再帰を書かなくて済むことが重要
foldrをゴリ押ししてみた fr :: (a -> b -> b) -> b -> [a] -> b fr _ x [] = x fr fn init (el:la) = fr fn (fn el init) la
今darcs中 darcs遅せぇ
>>980 それはfoldrじゃなくてfoldl . flipじゃないか
>>979 ところが実装を気にするんだよな〜
なにしろ、再帰かどうかが大問題なんだから。
じゃ自分で作ってみてベンチ両方取ってくらべりゃいいじゃねぇか
985 :
979 :2007/10/29(月) 01:19:29
>>983 大問題って、foldl再帰で実装されているかどうかを初めに問題にしたのは
>>975 だろ?
foldlが再帰的に定義されていたとしても
>>974 のfの定義自体は非再帰的なわけで、
>>974 はそれをもって「非再帰の方が楽」という言い方をしたんだと俺は理解したんだが
すみません、私が間違ってました
いや、俺も間違ってたよ
そろそろじすれのきせつ!
なんで main = do cs <- getContents putStrLn cs はOKなのに main = do cs <- getContents <TAB><TAB>putStrLn cs はダメなの?
>>989 上もダメじゃないか?
csが(0から数えて)10桁目から始まるから、
二行目のputStrLnも10桁目にないといけない
タブ幅は8と決まってるから、タブ二つでインデントするとputStrLnが16桁目から始まることになる
そんなゆーづーがきかないのか…
doの後で必ず改行するようにすれば悩まなくて済むよ
>>989 main = do { cs <- getContents;
<TAB><TAB>putStrLn cs}
にすればいいじゃない
悲しみを { } で包むためさ
>>990 ふつけるにも書いてなかったんだが、それずっと疑問だった。
Haskellってタブはスペース8個に決め打ちしてるのか?
そもそも等幅フォントじゃなかったらどうすんだとか、エディタ
選ぶ言語なの?
>>997 等幅フォントでないと正しく見えない。
pythonのレイアウトも同じ。
>>997 決め打ちしてる。
>そもそも等幅フォントじゃなかったらどうすんだ
例えば
・do、where、let、ofの後に必ず改行を入れる
・タブを使わない
の二点を守ればどんなフォントでも大丈夫。
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。