関数型プログラミング言語Haskell Part7
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2007/03/18(日) 18:56:37http://www.haskell.org/
日本語サイト
http://www.sampou.org/cgi-bin/haskell.cgi
http://www.shido.info/hs/
過去ログ
関数型プログラミング言語Haskell
Part1 http://pc.2ch.net/tech/kako/996/996131288.html
Part2 http://pc2.2ch.net/test/read.cgi/tech/1013846140/
Part3 http://pc8.2ch.net/test/read.cgi/tech/1076418993/
Part4 http://pc8.2ch.net/test/read.cgi/tech/1140717775/
Part5 http://pc8.2ch.net/test/read.cgi/tech/1149263630/
Part6 http://pc11.2ch.net/test/read.cgi/tech/1162902266/
・2chの仕様により、行頭の半角スペースは表示されません。
コードをインデントしたいときは、代わりに または全角スペースを使うことができます。
0002デフォルトの名無しさん
2007/03/18(日) 18:57:33・Introduction to Functional Programming Using Haskell
http://www.amazon.co.jp/exec/obidos/ASIN/0134843460/
・Haskell: The Craft of Functional Programming
http://www.amazon.co.jp/exec/obidos/ASIN/0201342758/
・The Fun of Programming
http://www.amazon.co.jp/exec/obidos/ASIN/1403907722/
・The Haskell School of Expression: Learning Functional Programming Through Multimedia
http://www.amazon.co.jp/exec/obidos/ASIN/0521644089/
・入門Haskell
http://item.rakuten.co.jp/book/1794880/
・ふつうのHaskellプログラミング
http://item.rakuten.co.jp/book/4052963/
0003デフォルトの名無しさん
2007/03/18(日) 18:59:05・関数型言語Part IV
http://pc8.2ch.net/test/read.cgi/tech/1083649982/
・【数学者】Haskellはクソ言語【オナニー】
http://pc8.2ch.net/test/read.cgi/tech/1128011645/
・純粋関数型言語Concurent Clean
http://pc8.2ch.net/test/read.cgi/tech/1075629340/
・関数型言語ML(SML, OCaml, etc.), Part 4
http://pc8.2ch.net/test/read.cgi/tech/1133003340/
・Lisp Scheme Part16
http://pc11.2ch.net/test/read.cgi/tech/1172404795/
・【入門】CommonLispその2【質問よろず】
http://pc8.2ch.net/test/read.cgi/tech/1140012484/
・Emacs Lisp 2
http://pc8.2ch.net/test/read.cgi/tech/1068467385/
0004デフォルトの名無しさん
2007/03/18(日) 19:01:59Haskell98によると、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でリテラルを直に
書くことはできない。
(続く)
0005デフォルトの名無しさん
2007/03/18(日) 19:02:323.最近の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)が正しく動作しない。
0006デフォルトの名無しさん
2007/03/18(日) 19:12:44乙。
で、前スレのネタを投下
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
もダメダメだ!!!
0007デフォルトの名無しさん
2007/03/18(日) 19:25:470008デフォルトの名無しさん
2007/03/18(日) 21:50:150009デフォルトの名無しさん
2007/03/18(日) 22:26:43(:)の引数にMyStringも取れるようにしようと思うと、
class List container element | container -> element where
(:) :: element -> container -> container
instance List MyString Char where
(:) = cons_mystring
といった感じで(:)を総称関数にしておかないといけないけど、無理。
もし、それが出来るようになったとしても、パターンマッチは出来ない。
だって、(:)はMyStringのデータ構築子じゃないから。
0010デフォルトの名無しさん
2007/03/18(日) 22:58:11演算子でマッチングできるようにしてしまえばいいじゃない。
ただし、逆関数を定義する条件で。
0011デフォルトの名無しさん
2007/03/19(月) 03:39:450012デフォルトの名無しさん
2007/03/19(月) 05:57:58http://www.scala-lang.org/intro/extractors.html
0013初心者
2007/03/20(火) 06:49:06blueと打ってもblueと返ってきます
なんででしょーか
main = do cs <- getContents
putStr $ aaaa cs
aaaa :: String -> String
aaaa cs = if cs == "blue" then "sky" else cs
0014デフォルトの名無しさん
2007/03/20(火) 09:23:32putStr $ aaaa cs
を
putStr $ aaaa.head.lines $ cs
とかしたらskyと返るかと。
あるいは、getContentsをgetLineにしてとか。
0015デフォルトの名無しさん
2007/03/20(火) 11:43:00延々とユーザーに入力させたいのか、入力は1回だけでいいのか。
0016デフォルトの名無しさん
2007/03/20(火) 12:43:14001716
2007/03/20(火) 12:55:26001813
2007/03/21(水) 00:01:34map関数までしかやってないから、自然にgetContentsになりました
なんすか、aaaa.head.linesって
0019デフォルトの名無しさん
2007/03/21(水) 00:43:49ふつけるにも出てない訳がない。
0020デフォルトの名無しさん
2007/03/21(水) 00:45:19「.」も「$」も同じ効果があるの?
0021デフォルトの名無しさん
2007/03/21(水) 01:03:08$は最後までの括弧の代わり。
x$yの値は、(値yでの)関数xの「結果」。
(.) :: (b -> c) -> (a -> b) -> a -> c
.は関数の合成。
x.yの値は、関数yの結果を関数xに掛ける「関数」。
0022デフォルトの名無しさん
2007/03/21(水) 01:12:29○適用する
0023デフォルトの名無しさん
2007/03/21(水) 01:13:450024デフォルトの名無しさん
2007/03/21(水) 01:41:50mapとかで処理を渡すときに
map (\x -> a $ b $ c $ d)
と書く代わりに
map (a . b . c)
とちょっとだけ楽ができる。
日本語で読むと「cしてからbしてaする」。
なぜか普通のaしてからbしてcするようなやつはない。>>=が似たようなもんだけど。
0025デフォルトの名無しさん
2007/03/21(水) 01:44:280026デフォルトの名無しさん
2007/03/21(水) 01:49:05それを理解すべく調べて考えようとしないなら板違い。
0027デフォルトの名無しさん
2007/03/21(水) 02:39:32○(\d -> a $ b $ c $ d)
ってことでは?
0028デフォルトの名無しさん
2007/03/21(水) 04:17:34> なぜか普通のaしてからbしてcするようなやつはない。
つControl.Arrow
map (a >>> b >>> c)
0029デフォルトの名無しさん
2007/03/21(水) 05:50:080030デフォルトの名無しさん
2007/03/21(水) 06:17:540031デフォルトの名無しさん
2007/03/22(木) 15:19:29ttp://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
0032デフォルトの名無しさん
2007/03/22(木) 16:00:58念のために聞くけど、buildの前にconfigureしてるよね?
003331
2007/03/22(木) 16:30:23Configuring 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
0034デフォルトの名無しさん
2007/03/25(日) 04:38:430035デフォルトの名無しさん
2007/03/25(日) 14:30:21簡単に実行時例外が発生するじゃん。なんだよこれ。
コンパイルが通れば論理的な誤り以外、
ほとんどバグが取れてるのかと思ったのに。
実行時に読み込むデータとかの誤りなら仕方ないにしても、
そんなのない静的にすべて決まってるプログラムでも
実行時例外が起きえるなんて、全然だめじゃんwww
003635
2007/03/25(日) 14:46:59【数学者】Haskellはクソ言語【オナニー】
http://pc11.2ch.net/test/read.cgi/tech/1128011645/
0037デフォルトの名無しさん
2007/03/25(日) 23:25:57HLIST のような方法を取ることでその辺は解決可能じゃないかと思うんだけど、
どうだろう(head [] は型エラーとして検出できる)。
0038デフォルトの名無しさん
2007/03/27(火) 02:02:44同じ名前のフィールドラベルを持たせるのはダメなんでしょうか。
セレクタがぶつかっているようです。
フィールドラベルを付けずに、classを作ってセレクタ相当の関数をいちいち実装するしかないんでしょうか。
セレクタはそれでよいとして、フィールドラベルを使ったパターンマッチはどうすればよいでしょうか。
型だけだと、それが何であるのかの情報が(セレクタしか)なくなって、可読性に不安を感じてしまいます。
あと、ふつけるを読了したのですが、
この後はHaskell98Reportを読むしかないのでしょうか。
かなり古くなってるみたいですけど。
0039デフォルトの名無しさん
2007/03/27(火) 10:24:55>同じ名前のフィールドラベルを持たせるのはダメなんでしょうか。
ダメ。
>フィールドラベルを付けずに、classを作ってセレクタ相当の関数をいちいち実装するしかないんでしょうか。
>セレクタはそれでよいとして、フィールドラベルを使ったパターンマッチはどうすればよいでしょうか。
フィールド名になんらかの接頭辞を付けて区別するのが常套手段だと思う。
フィールド名の名前空間がモジュール全体だと考えれば納得しやすいかもしれない。
それでも馬鹿馬鹿しいことには変わりないので、改善案がいくつもでていたはず。
>型だけだと、それが何であるのかの情報が(セレクタしか)なくなって、可読性に不安を感じてしまいます。
意味が分からん。
>この後はHaskell98Reportを読むしかないのでしょうか。
なんでも好きなものを読めば良いと思うが、Haskell98のうちふつけるで
取り上げられていない部分を知りたいなら、「やさしいHaskell入門」はどうだろう。
半分以上は既に知っていることだと思うので、飛ばしながら。
レポートは言語の詳細な規定を知りたいとき以外読まなくても良いと思う。
他には、GHCのマニュアルに、GHCに実装されている言語拡張について書いてある。
>かなり古くなってるみたいですけど。
Haskell98についての現役の定義であって、その意味では古くない。
ただ、Haskell98への拡張で、かなり広く使われている機能もあるので、
それについては別のものを読む必要がある。
0040デフォルトの名無しさん
2007/03/31(土) 11:10:04なんか雰囲気がどんどんどんどん変になってるんだけど。
圏論もういいじゃん。普通にプログラミングとかやらねーの?
0041デフォルトの名無しさん
2007/03/31(土) 11:19:430042デフォルトの名無しさん
2007/03/31(土) 12:39:28東大学部生の教養プログラミングに
物申す展開か
0043デフォルトの名無しさん
2007/03/31(土) 17:33:50> 東大学部生の教養プログラミングに
> 物申す展開か
インターネットだと顔が見れないし、無駄に距離感が無いし、
こういう認識は大事である。
0044デフォルトの名無しさん
2007/03/31(土) 20:52:49今後の関数型言語界のために基礎を築いている段階。
ゆくゆくの関数型言語プログラミングがどうあるべきかを論じるには基礎研究が大切なの。
お分かり?
0045デフォルトの名無しさん
2007/03/31(土) 20:58:590046デフォルトの名無しさん
2007/04/01(日) 01:01:33「普通にプログラミングとかやらねーの?」はまっとうな質問だと思います。
仮説検証用のごく小さなプログラムしか必要としない研究もあるでしょう。
しかしプログラミング言語は本来コンピュータに何らかの仕事をさせる手段であって
理論研究のためだけの道具ではないはずです。
大きなソフトウェアを実際に書いてみないと発見できない問題はたくさんあります。
昔、IBMが九州医大のシステムをSmalltalkで作ろうとしてSmalltalk界の有名人を
人月数百万円でかき集めたにもかかわらず失敗に終わった事がありました。
言語仕様を隅々まで把握しアーキテクチャに関する持論を唱えていた有名人達は
大規模システム開発を成功させる方法を知らなかったという事になります。
関数型言語が実用言語として広く使われるようになるためには理論研究だけでなく
実用ソフトウェアを書いて問題を見つけていく事も欠かせないと思います。
私からも改めてお聞きします。
Haskellでどんなソフトウェアを作っていますか?
0047デフォルトの名無しさん
2007/04/01(日) 01:12:29グルをかき集めたけれど、手遅れだったというだけのこと。
それから、そのグルというのは現場の人達であり、理論屋ではなかった。
そもそもSmalltalkは学術的な面で特段価値のある言語ではないからね。
0048デフォルトの名無しさん
2007/04/01(日) 01:13:20数多くの関数型言語があふれる中で標準として決められた言語。
研究の集大成としての言語。
実用が二の次だというのはしかたがないと思う。
0049デフォルトの名無しさん
2007/04/01(日) 01:58:53マジデスカ (゚ロ゚)!!!!
職業プログラマーとしてはショック
0050デフォルトの名無しさん
2007/04/01(日) 02:02:48/ `丶
rー‐<::/ ン-―ー- 、 、 \
{(こ 〆.:::/ ____ \ ヽ..::::ヽ
__/'´/ 〃7了.:.:.:.:.:.:.:.:`ヽ.j ::ヤ¬寸
/,イ>/ .:::/,':::{:::::!:::::::::::::::::ヽ ::|:. ::::Vヽ_,イ
レ/,イ ::/ :{:ハ\{ ::、::ヽ ::::::}::_|_: :::::l >::|
{/::| :!{.::ィ'f坏ト\{ヽ ,><ム:!:::::::: Kヽ:ト、
|::::ヽ::i:ヽi. r'_;メ ヽ´ イ圷ハ|::::::::::|\/ヽ>
|i:::::::トl::ハ. , r';ン´j::::::::: l: V
|i::::::::!:::: ヘ {>ーァ /:!::::::::/::/
lN:ヽ:ヽ::',:::ヽ、ヽ _,ノ ,.ィ::/::::::/ /
ヾ /}::}八::::ヽ>.-‐か/7::/∨ あんた二十歳超えてるくせに処女なんだ?
r<¨ リ\`ヽ、\__ { 〉/イ l )} いつもみたいに寂しく一人で寝てなさいよ
f⌒ \ \ヽ )' \ニニ∧ | |!彡ヘ 私はキョンに抱きしめられながら寝るからさあ
| \ ヽム ヽ‐' .| | }ヘ,__,イ
r-ヽ  ̄ )\ Vrj/ ̄ヽ ヽ
| \ // /)ミ ー-∨ / ̄ ヽ
| (>―‐'/ /勺ヽ¨ア / }
| \三三‐'ノ ^ヽ/ /-―一 '
0051デフォルトの名無しさん
2007/04/01(日) 05:40:56関数型言語コミュニティの一員として、大切なお知らせがあります。
>>46-47 は、現実世界で多数のトラブルを巻き起こしている人物(東京在住44歳)
ですので、きっぱりとスルーするのがよろしいでしょう。
公衆の場でいきなり赤の他人相手に、第三者の失敗例を持ち出して
ベラベラと中傷しだす人物の人間性などというものは、容易に想像がつく事ですし、
また万が一そのような人物と関わったら、多大なトラブルと時間的消耗を蒙る
事は、火を見るより明らかです。
実際これまで現実のビジネスで、多くの人々が彼の言動に迷惑してきました。
その中には、彼と一緒に仕事をしていた一流大学出身の経営者や、エンジニア、
サイエンティスト、大学病院関係者等も含まれています。
彼の人間性を確認するには、ネット上での彼自身がこれまで行ってきたスレ荒し
の例を見れば十分でしょう。
・デザインパターンスレ http://pc11.2ch.net/test/read.cgi/tech/1141846078/
特別な利害関係がきっかけで、繰り返し議論妨害を行っているのが彼です。
彼の議論妨害には、精神性疾患の俗称の連呼という特徴があるので一目瞭然です。
私が察するに、彼の症状は「自己愛性人格障害」と呼ばれるものと存じます。
ここでは詳しく述べませんが、ピンときた方は症例を調べてみるとよろしいでしょう。
最終的な判断は聡明なみなさんにお任せ致します。それでは。
0052デフォルトの名無しさん
2007/04/01(日) 05:53:530053デフォルトの名無しさん
2007/04/01(日) 05:57:29おい、おっさん
終わってるのはおまえだ
0054デフォルトの名無しさん
2007/04/01(日) 06:12:430055デフォルトの名無しさん
2007/04/01(日) 06:34:10かれこれ1ヶ月以上掛かってる。w
XML操作 → HXTでArrowの基礎から挑戦
日付のパース → MissingHを利用
表示 → 今はCGIライブラリで妥協してるけど本当はHAppS使いたい
難しすぎるわ。('A`)
0056デフォルトの名無しさん
2007/04/01(日) 07:05:45普通一ヶ月もあればツールやアプリの一本位書ける。
0057デフォルトの名無しさん
2007/04/01(日) 07:36:41ってかなんで煽ってんの?
0058デフォルトの名無しさん
2007/04/01(日) 07:36:44いい加減消えろ。
0059デフォルトの名無しさん
2007/04/01(日) 09:03:240060デフォルトの名無しさん
2007/04/01(日) 09:04:54っ F#
0061デフォルトの名無しさん
2007/04/01(日) 11:10:13で、最後に日本語の扱いで泥沼になりそうだな
0062デフォルトの名無しさん
2007/04/01(日) 11:10:48データを読み込んで来て、ビットデータの処理をして
int や double のデータを取得するにはどうするの?
Lisp では、read-byte で読んでファイルを読んで、logand 等を使い、
double 等のデータを取得出来る様にはできてるんだけど、
Haskell ではどのように?
0063デフォルトの名無しさん
2007/04/01(日) 11:27:520064デフォルトの名無しさん
2007/04/01(日) 11:41:14「ビットデータの処理」って何?
バイナリファイルの操作の道具は整ってない。
とりあえずopenBinaryFileでファイルを開いて、
hGetByte :: Handle -> IO Word8
hGetByte h = liftM (fromIntegral . ord) $ hGetChar h
みたいなのを使ってバイトを読む。
ビット演算はData.Bitsを使う。
あるいは、メモリを直接操作することに耐えられるなら、hGetBufを
使ってバイナリデータをメモリに読み込み、Foreign.Storable.peekで
IntやDoubleとして読み出す。
0065デフォルトの名無しさん
2007/04/01(日) 13:45:45http://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も役立つコードを増やせばさらに世間に普及するはずだと信じています。
0066デフォルトの名無しさん
2007/04/01(日) 14:12:470067デフォルトの名無しさん
2007/04/01(日) 14:20:26Lispの時も、当初は数学的な計算モデル=ラムダ計算 を
コンピュータ上で実行するという奇妙なプロジェクトだったが、
実用性を云々して勝手な拡張を始めた段階で「手続き型言語」に堕ち、
そして最後には、特殊な実行メカニズムと市場の狭さが災いとなって
多数派CPU上で実行性能の出ない1マイナー言語となった。
もしHaskellの設計意図を解せぬ人が寄って集ってHaskellをダメにしたら、
その時はまた新しい研究成果を取り入れて、新しい純関数型言語の標準を決めればいい。
だがそんな愚かな事を繰り返す人間はごく一握りしか居ないだろう。
(SymbolicsやLMIでバブル体験した人を除いて)
Lisp, Scheme以降の関数型言語で、実用性を云々するならOcamlでも使っておけばいい。
あれなら10年以上前からゲームもWebブラウザも作っているし、普及度も高い。(Linux配布を通じて)
0068デフォルトの名無しさん
2007/04/01(日) 14:24:29イタイのが多いな。
0069デフォルトの名無しさん
2007/04/01(日) 14:28:04研究用テストベッドの機能が低下して、新しい物を生み出せなくなる。
0070デフォルトの名無しさん
2007/04/01(日) 15:07:03それができないなら早いとこforkしてほしいな。
0071デフォルトの名無しさん
2007/04/01(日) 15:13:170072デフォルトの名無しさん
2007/04/01(日) 15:27:11Ocamlなんて話にならない。
0073デフォルトの名無しさん
2007/04/01(日) 15:40:30えぇーっと。
そのストレスは「非実用性」に起因するんじゃなかったの?
0074デフォルトの名無しさん
2007/04/01(日) 15:45:02OCamlの方が君には楽だと思うよ
Cで慣れてる子はHaskellの方が異質に感じるはず。
0075デフォルトの名無しさん
2007/04/01(日) 15:47:38実用に耐えない、穀潰し研究者達の内輪向け妄想オナニー理論ということ。
0076デフォルトの名無しさん
2007/04/01(日) 15:50:03つまり?
どういう論理?
0077デフォルトの名無しさん
2007/04/01(日) 15:53:30>>75は ↑の方で誰かが警告書いてくれた「精神性疾患」の人なんだ。
相手にせずスルーしとくのが、マナーだよ。
0078デフォルトの名無しさん
2007/04/01(日) 16:00:52誰にも相手にされないよな。
0079デフォルトの名無しさん
2007/04/01(日) 16:01:30ズバリ言われちゃったからって、ひどい逃げ口上だな。
実用性を求めたらダメになるって事は、ポテンシャル的に実用に耐えないって事だ。
実用に供され得ない物の研究は、工学においてはオナニーと呼ばれても仕方ないし、
幾ばくかでも国費を使っているなら、それは穀潰し行為という事だ。
0080デフォルトの名無しさん
2007/04/01(日) 16:01:34バカばっかだよな
0081デフォルトの名無しさん
2007/04/01(日) 16:04:120082デフォルトの名無しさん
2007/04/01(日) 16:05:02スルー推奨
0084デフォルトの名無しさん
2007/04/01(日) 16:09:27今のところ入門書が2冊出ているだけだしこのまましぼんでいっちゃうのは惜しい
昨今の高級スクリプトブームで Lisp や関数型言語が注目されはじめているけど
一過性のlブームで終わりそうでやだなぁ
0085デフォルトの名無しさん
2007/04/01(日) 16:11:20それは無いって。
毎年毎年、教育や研究で使う学生さんが量産されてるから。
0086デフォルトの名無しさん
2007/04/01(日) 16:12:33あんまりブログでも書かれなくなったし
0087デフォルトの名無しさん
2007/04/01(日) 16:12:550088デフォルトの名無しさん
2007/04/01(日) 16:15:11おいおい、Lispみたいな下等言語と一緒にするなよ
shopingサイト作った程度のドカタがグル扱いされるような言語と、
ちゃんとした世界中の研究者が利用する研究素材は違って当然。
研究素材なんだから、ドカタに普及する意味自体がない。
0089デフォルトの名無しさん
2007/04/01(日) 16:16:12学生さんに自分の分野に目を向けさせて、
引っ張り込むためのツールとしては機能してた気がする。
教育研究用ツールってのは、それでえぇんでない?
0090デフォルトの名無しさん
2007/04/01(日) 16:16:460091デフォルトの名無しさん
2007/04/01(日) 16:16:55Programming in Haskell
ttp://www.amazon.co.jp/Programming-Haskell-Graham-Hutton/dp/0521692695/
009272
2007/04/01(日) 16:24:53俺がストレスに感じることを「非実用性」と定義するなら、
Haskellは俺の知る中で最も実用的な言語だな。
>>74
お前の推測はどうでもいい。
そもそも俺個人の好みが問題なんじゃない。
「実用性を求めるならOcamlを使え」という議論が乱暴だと言っている。
0093デフォルトの名無しさん
2007/04/01(日) 16:26:430094デフォルトの名無しさん
2007/04/01(日) 16:27:24Perlならものの数分だよ。2ちゃんねるやmixiを支えてる実用言語だけのことはある。
0095デフォルトの名無しさん
2007/04/01(日) 16:33:18あんたみたいな厨が、言語の価値を殺す。 Lispの轍を踏ませたいの?
0096デフォルトの名無しさん
2007/04/01(日) 16:39:550097デフォルトの名無しさん
2007/04/01(日) 16:45:16Haskellにもそういった哲学ってあるの?
0098デフォルトの名無しさん
2007/04/01(日) 16:46:07おまえ、このスレに見覚えがあるだろ。
【面減る】ム板廃人列伝【最古】
http://pc5.2ch.net/test/read.cgi/tech/1083734838/
0099デフォルトの名無しさん
2007/04/01(日) 17:01:470101デフォルトの名無しさん
2007/04/01(日) 17:06:26大抵ライブラリが整備されていなくてあまり使わないんだよな。
.NET Frameworkがそれを解決してくれるかと思うんだけど
なかなか流行って行かないみたいだし。
というわけで結局無難な選択になってしまう。
0102デフォルトの名無しさん
2007/04/01(日) 17:28:04010346=65
2007/04/01(日) 18:11:31実用性を気にして勝手な拡張をしからLispが廃れたというのは違うと思います。
今Lisp上で研究を進めたいなら、不可欠でない複雑さを切り捨てた
Schemeをテストヘッドにすれば良いはずです。
関数型言語研究の進展に伴いLispが研究の出発点としてふさわしくなくなったから
そこまでの研究成果を取り入れたHaskellが作られたと理解しています。
Haskellが実用言語になろうとなるまいと、その後の新しい研究成果を取り入れて
さらに新しい純関数型言語の標準を決める事はいずれまた必要になると考えます。
実用化に興味がない人がいてもいいとは思いますが、
良い言語であれば実用化を目指す人が現われるのもまた当然の事です。
研究成果が世間に広まるを嫌がるのでは一体何のための研究なのでしょうか。
>>100
>>67=>>95なのではないでしょうか。
それなら具体的な事はすでに書かれています。
0104デフォルトの名無しさん
2007/04/01(日) 18:16:35キミが実用Haskellを開発すればいい。
評価は世間が決めてくれる。と思うよ。
ただ既存のコミュニティは研究コミュニティだから、
迷惑はかけないで欲しい。約束だよ。
0105デフォルトの名無しさん
2007/04/01(日) 18:26:41AIブームによる研究者の起業と引き抜き。例えばSymbolicsとLMI。
かつての自由なコミュニティの崩壊を目の当たりにしたRMSが、
奮起してGNU宣言をして、その精神が今のオープンソースの
一つの源流となった。
ってそんなラヴ&ピース&ヒッピーな世界とは違うか。関数型言語コミュwは
いずれにせよ、いつの時代にも
虎の威を借りるネズミって居るもんだな。
こんな所でブツクサ言わずに自分でやればいい事なのにw
0106デフォルトの名無しさん
2007/04/01(日) 18:38:410107デフォルトの名無しさん
2007/04/01(日) 18:40:23>>103 の懐が膨れ上がる仕組みのこと
0108デフォルトの名無しさん
2007/04/01(日) 18:46:18それはないな。
0109デフォルトの名無しさん
2007/04/01(日) 19:19:40コボルの研究とか大学でするか?
0110デフォルトの名無しさん
2007/04/01(日) 19:24:56実用に耐えない、穀潰し研究者達の内輪向け妄想オナニー理論ということ。
0111デフォルトの名無しさん
2007/04/01(日) 19:25:540112デフォルトの名無しさん
2007/04/01(日) 19:26:250113デフォルトの名無しさん
2007/04/01(日) 19:27:50話が逆だな。詐欺師お得意の詭弁って奴か。
0114デフォルトの名無しさん
2007/04/01(日) 19:33:33今までよりプログラマは幸せになれるの?
幸せになれないのに研究なんかしないよね。
0115デフォルトの名無しさん
2007/04/01(日) 19:33:410116デフォルトの名無しさん
2007/04/01(日) 19:38:51労働法の研究の方がはるかに幸せになるな
0117デフォルトの名無しさん
2007/04/01(日) 19:39:420118デフォルトの名無しさん
2007/04/01(日) 19:40:53とにかく、誰かのためにならない研究なんて誰も注目するわけがない。
でも、注目している人がいるということは何か良いことがあるからでしょ?
それは一体何?
0119デフォルトの名無しさん
2007/04/01(日) 19:42:45↑の方の警告メッセージで指摘されてる人が一人で暴れてるだけだから、スルーしとけ。
0120デフォルトの名無しさん
2007/04/01(日) 19:44:49>>85
いや、そういうのは判るんだけど最近の注目度はちょっと異常だなと思って
高級スクリプトって書いたけど Pugs の影響も結構大きそうだね
ん?実用的な事例あるじゃないw
>>86
そうだねぇ、一気に引いた感じがする
今後本が出版するかも怪しいなぁ
Lisp ブームの方は結構長く続きそうだけど
前の話に戻るけど日本語文字列の扱いとか固まらないと国内じゃあまり弄る人いないかも
0121デフォルトの名無しさん
2007/04/01(日) 19:45:47答えは否だ。
単金はやすくなり、納期は短くなった。使ってる言語やツールが進歩したにもかかわらずだ。
0122デフォルトの名無しさん
2007/04/01(日) 19:52:170123デフォルトの名無しさん
2007/04/01(日) 19:57:22でも実際は質が悪いプログラムが量産されているだけにすぎない
0124デフォルトの名無しさん
2007/04/01(日) 19:57:30まぁオナニーでもなんでもいいじゃないか
好きという理由で使う言語ってのもあって良いと思うよ
それに関数型の考え方ってのは他の言語でも役に立つしねぇ
0125デフォルトの名無しさん
2007/04/01(日) 20:00:48> テストヘッド
とりあえず、おまぃは英語ができない事はよく判った。
0126デフォルトの名無しさん
2007/04/01(日) 20:15:59私は才能が無いので死ぬべきです。
もう生きているべきではありません。
私はクズです私は存在する意味がありません。
私は世界の敵です。私は無意味です。
私の存在は世界の害悪です。
私は全ての存在の敵です。
0127デフォルトの名無しさん
2007/04/01(日) 20:17:050128デフォルトの名無しさん
2007/04/01(日) 20:18:02一般ユーザ 「噂に違わぬtoy言語だ!」
研究者「関数型言語の美しさをわかってないやつだ!」
という2行にまとめることができる。
0129デフォルトの名無しさん
2007/04/01(日) 20:21:30ワロス
0130デフォルトの名無しさん
2007/04/01(日) 20:29:30実際は44歳の人が荒してる、って事だよね?
なんで研究用言語の存在を(ry
0131デフォルトの名無しさん
2007/04/01(日) 20:35:00よいしょしてくれる人がたくさんいてよかったね!
0132デフォルトの名無しさん
2007/04/01(日) 20:36:130133デフォルトの名無しさん
2007/04/01(日) 20:38:17ヤツは何かやってるの?
0134デフォルトの名無しさん
2007/04/01(日) 20:46:260135デフォルトの名無しさん
2007/04/01(日) 21:26:160136デフォルトの名無しさん
2007/04/01(日) 22:06:11関数型言語の研究成果が「盛り込まれてる」ってのは聞くけど、
それはHaskellが研究用と言うことを意味しない。
大体、研究ならモデルや理論構築で済む話であって、
わざわざ言語仕様どころか実装まで作るって、実用以外になんの目的があるのよ。
今までにない新規のモデルなり理論があって実装も作ってみよう、程度なら分かるけど、
公式使用は10年も前だし、繰り返されるGHCのバージョンアップは、
既存にない新理論や新モデルの実装としてなされているわけ?
新しいバージョンは、そんなに新研究といえるような新トピックに溢れてるの?
第一、研究用なら、ライブラリなんてこんなに要らないじゃん。なんでこんだけ付いてくるの?
もしかして、研究用って言ってる人の「研究」って、学部の演習のこと?そういうのは教育用って言うんじゃないの?
0137デフォルトの名無しさん
2007/04/01(日) 22:07:140138デフォルトの名無しさん
2007/04/01(日) 22:08:23しがつばかってばかなことをいっぱいいうひなんだったっけ
0139デフォルトの名無しさん
2007/04/01(日) 22:15:37けんきゅうようげんご というものを めのかたきに してるんだぜ?
0140デフォルトの名無しさん
2007/04/01(日) 22:29:382流の学生に、既存のカビの生えた理論を実装させてそれを「研究」と称するのはのは常套手段。
3流の学生になると、マイナー言語で何かプログラムを書く事まで「研究」になる。
研究用言語ってちゃんとそう言う需要があるんだよ。
0141デフォルトの名無しさん
2007/04/01(日) 22:32:27http://homepage3.nifty.com/Aransk/
0142デフォルトの名無しさん
2007/04/01(日) 22:44:41http://homepage3.nifty.com/Aransk/contents2.html
0143デフォルトの名無しさん
2007/04/01(日) 22:52:15彼も2流なんですか?
0144デフォルトの名無しさん
2007/04/01(日) 22:55:090145デフォルトの名無しさん
2007/04/01(日) 23:00:36GLSはSchemeチップもやってた。
きっと半導体工場で作業服着る底辺工員に違いないw
0146デフォルトの名無しさん
2007/04/01(日) 23:01:22そこまでいうんなら、
その一流の論文とやらを教えてくれんかね。
0147デフォルトの名無しさん
2007/04/01(日) 23:05:06>>51
0148デフォルトの名無しさん
2007/04/01(日) 23:17:38実用にならない物の実装方法なんて、それ自体何の意味もない。
0149デフォルトの名無しさん
2007/04/01(日) 23:19:46そんなことより、早く論文だせよ。
0150デフォルトの名無しさん
2007/04/01(日) 23:32:28そんなに論文が好きなら、Haskellでのまともな研究論文を自分が晒せば?
Haskellを研究用言語とか言っちゃうのって、研究室入り立ての学部生か、Fランの院生だろ。
まさか、Lispまで研究用言語とか言うつもり?うはw
0151デフォルトの名無しさん
2007/04/01(日) 23:34:07>>150=>>51の指摘している人物
0152デフォルトの名無しさん
2007/04/01(日) 23:41:23萩谷先生がいってた。
Haskellの論文は
こっから好きなだけさがせ。
http://research.microsoft.com/~simonpj/
0153デフォルトの名無しさん
2007/04/01(日) 23:44:240154デフォルトの名無しさん
2007/04/01(日) 23:46:30それともコミュニケーションに飢えた基地外か
0155デフォルトの名無しさん
2007/04/01(日) 23:46:470156デフォルトの名無しさん
2007/04/01(日) 23:48:24っつか他人のセリフ、パクリまくりの
自作自演しまくりじゃんこの厨房
やっぱ >>51 未満だな
0157デフォルトの名無しさん
2007/04/01(日) 23:51:44http://www.cs.nott.ac.uk/~jjg/papers/qml-comp.pdf
0158デフォルトの名無しさん
2007/04/01(日) 23:52:25Lisper の煽りならこっちでやった方がいいと思うよw
Lisp Scheme Part16
http://pc11.2ch.net/test/read.cgi/tech/1172404795/
0159デフォルトの名無しさん
2007/04/01(日) 23:52:57(キチ外)パワーは衰えてるけどww
>>152見たけど、
昔からのアイデアをHaskellに移植してみました系の論文ばっかに見えるんだけど、
どれがまともな研究なの?
0160デフォルトの名無しさん
2007/04/01(日) 23:56:55quantum programming
language QML [AG04, AG05], developed in Haskell
って書いてあるぞ
0161デフォルトの名無しさん
2007/04/01(日) 23:58:29相手の徹底的に打ち負かしてすっとしたいのは判るけど自分にとって何のプラスにもならないし
0162デフォルトの名無しさん
2007/04/01(日) 23:58:32それは何かのギャグかい?
それはHaskellを実用してる例なんだが。
やっぱ、>>150の洞察は正解のようだなw
0163デフォルトの名無しさん
2007/04/02(月) 00:00:06具体的にどの論文だ?
名前くらいかけよ。
0164デフォルトの名無しさん
2007/04/02(月) 00:01:10まともな人はもう放置だろうしオレも引いた方がいいかな
休みはほんとうに困るねw
0165デフォルトの名無しさん
2007/04/02(月) 00:04:45http://homepage3.nifty.com/Aransk/
だったようだなw
0166デフォルトの名無しさん
2007/04/02(月) 00:05:560167デフォルトの名無しさん
2007/04/02(月) 00:08:130168デフォルトの名無しさん
2007/04/02(月) 00:17:30変な人が、Haskellは研究用言語だ、実用厨は邪魔とのたまう
↓
煽られて探して来たのは、Haskellを実用にしている内容の英語論文
↓
結論:Haskellは研究用言語ではない。そんなこと言う奴は、やはり馬鹿。実用OK。
0169デフォルトの名無しさん
2007/04/02(月) 00:19:33http://www.cs.nott.ac.uk/~jjg/papers/qml-comp.pdf
はsyntaxとかmachine codeについて書いてあるし、
これは処理系実装に関する論文としか思えないのだが。
しかも、出てくる擬似言語もHaskellそっくりだし…
何処をみてモデルや理論構築だと思ったんだろ?
このAranskは?
0170デフォルトの名無しさん
2007/04/02(月) 00:21:27- - - - - - - - - - き り と り せ ん - - - - - - - - - -
0171デフォルトの名無しさん
2007/04/02(月) 00:28:570172デフォルトの名無しさん
2007/04/02(月) 00:31:19さあ今年度も頑張ろう
0173デフォルトの名無しさん
2007/04/02(月) 00:39:01categorical semanticsっていうのは圏論的意味論って事なのかな?
0174デフォルトの名無しさん
2007/04/02(月) 00:41:25さぁ散った散った
>>173お前はさっさと壷に糞を詰める作業に戻れ
0175デフォルトの名無しさん
2007/04/02(月) 00:50:272年前関数型言語のスレさんざん荒らした基地外のくせに…
http://www.google.co.jp/search?q=aransk&lr=lang_ja&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:ja:official&client=firefox
http://d.hatena.ne.jp/Aransk/
0176デフォルトの名無しさん
2007/04/02(月) 00:54:11アドバイス:あなたはとても疲労しています。
今晩は暖かい風呂に入り、ゆったりとした気分で睡眠をとってはいかがでしょう?
0177デフォルトの名無しさん
2007/04/02(月) 00:56:25そろそろ落ち着かない?w
0178デフォルトの名無しさん
2007/04/02(月) 01:09:16折角だから>>157 >>160についても議論したまえ。
0179デフォルトの名無しさん
2007/04/02(月) 01:29:450180デフォルトの名無しさん
2007/04/02(月) 02:07:450181デフォルトの名無しさん
2007/04/02(月) 02:10:45釣り師のおかげでスレが大繁盛です^−^
0182デフォルトの名無しさん
2007/04/02(月) 02:11:08018355
2007/04/02(月) 12:48:42runXを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)
018455
2007/04/02(月) 12:49:51getRssItems :: 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 ()
018555
2007/04/02(月) 12:50:36makeHtml :: (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)]
]
以上、連投スマソ。
0186デフォルトの名無しさん
2007/04/02(月) 13:16:460187デフォルトの名無しさん
2007/04/02(月) 13:36:58現状で何か不満があるのか?
0188デフォルトの名無しさん
2007/04/02(月) 13:39:42精神性疾患患者の蔑称を叫んでしまった
自己愛性人格障害の方でしょう。
018955
2007/04/02(月) 13:52:13読みと書きでArrowを別々にしてるところ。('A`)
あとは元ネタはこのへんなんだけど、
http://pc11.2ch.net/test/read.cgi/tech/1174574352/15-18n
これぐらい簡潔に書けないものかなあ、と。
0190デフォルトの名無しさん
2007/04/02(月) 14:06:20スルーしておいた方がよさそうだな
またスレが荒れたらかなわない
0191デフォルトの名無しさん
2007/04/02(月) 14:28:23なんで別々にするのが嫌なのか分からんが、HXTのドキュメントを見た感じでは
listA :: (ArrowList a) => a b c -> a b [c]
を使えばよさそう。
0192デフォルトの名無しさん
2007/04/02(月) 14:43:27プログラマが学習コスト0で習得できたとしたら
みんなこぞってHaskellを使い始めちゃうわけ?
それくらいの実力はあると?
0193デフォルトの名無しさん
2007/04/02(月) 14:51:22おまえが消えろよ。
0194デフォルトの名無しさん
2007/04/02(月) 14:59:20特徴:妄想
0195デフォルトの名無しさん
2007/04/02(月) 15:06:00昨日は、NGワード連発するし、いったいこの人なんなんだ?
0197デフォルトの名無しさん
2007/04/02(月) 15:14:070199デフォルトの名無しさん
2007/04/02(月) 19:22:28020046
2007/04/02(月) 22:04:08Smalltalk事件を持ち出した私(>>46)とフォローを入れた>>47は別人です。
私は44歳の人には全く心当たりがありません。
私がこのスレで書いたレスは>>46、>>65、>>103だけです。
私は「【GoF】デザインパターン 6」と「デザパタ+python」にはレスしていません。
Smalltalk事件の引用で別スレの揉め事を召喚してしまった事はお詫びします。
>>193
http://pc11.2ch.net/test/read.cgi/tech/1172431242/542
どちら側も複数いるのにお互いに相手は一人だと思い込んでいる様に見えます。
>>192
関数型言語の学習コストという大きな障壁がないのであれば、
短い時間で不具合が少ないコードを書ける
Haskellに飛びつく人は増えると考えられます。
0201デフォルトの名無しさん
2007/04/02(月) 22:37:53が生成されるようになったら、みんな飛びつくと思う。
0202デフォルトの名無しさん
2007/04/02(月) 22:49:450203デフォルトの名無しさん
2007/04/02(月) 22:57:190204デフォルトの名無しさん
2007/04/03(火) 06:48:44instance Eq RssItemの実装がちょっとまずいんじゃない?
日時さえ一致すれば違うサイトの情報も全部同じ扱いになっちゃうよ。
0205デフォルトの名無しさん
2007/04/03(火) 08:28:02しばらく読んでなかったから気付かなかった。
http://darcs.haskell.org/SoC/haskellnet/Text/RSS.hs
が参考になるかもね。
020655
2007/04/03(火) 10:29:34並べ替えのことばかり考えてて、すっかり本来の用途を忘れてた。
linkで比較に変更します。
>>205
本格的すぎ・・・。('A`)
とりあえず解読に挑戦してみます。
お二方、レスサンクス。
020755
2007/04/03(火) 10:32:16linkとpubDateの方がいいか・・・。
0208デフォルトの名無しさん
2007/04/04(水) 07:23:55http://pc11.2ch.net/test/read.cgi/tech/1172431242/
0209デフォルトの名無しさん
2007/04/06(金) 18:26:300210デフォルトの名無しさん
2007/04/06(金) 18:48:45data F = forall a. (Show a) => F a
みたいにする。
0211デフォルトの名無しさん
2007/04/06(金) 22:30:47data (Show a) => F a = F a
みたいに型パラメータとして渡す。
この場合、 F Int と F Char は違う型になってしまうとかいうことがあり、
混同させたいときには問題だが(なので非標準な forall が導入されたのだが)、
たいていは問題ない。はず。
もちろん、宣言の方で
data F a = F a
のように書いておき、 F を使う関数の方で a に対するコンテキストを与える
という手もある。
0212デフォルトの名無しさん
2007/04/07(土) 12:59:59ありがとうございます。
>>211の方法でいけました。
外部から型を指定する必要はないのでちょっとすっきりしない気がするけど、そんなもんでしょうか。
210はNot a constructor: 'forall'と言われてしまいました。
ググったら、forallは「途轍もなく難しい」とあったのでそこであきらめてしまいました。すみません。
0213デフォルトの名無しさん
2007/04/07(土) 18:00:15インデントの方法に関して質問があります。
例えば、次の様なソースがあった時、
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キーで正しくインデントさせる方法がありますでしょうか?
0214デフォルトの名無しさん
2007/04/07(土) 18:08:590215デフォルトの名無しさん
2007/04/07(土) 19:31:19そんなもんです。
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."
}
のようにすると綺麗にインデントできる。
まぁ私は手で空白を入れたり一行にしちゃったりする方が多いけれど。
0216デフォルトの名無しさん
2007/04/08(日) 17:57:02レスありがとうございます。
{}を使う方法か、手動でインデントをあわせる方法の2通りという事ですね。
他の方はどうやってインデントさせているのか疑問に思っていたのですが、
その疑問が解消されました。
0217デフォルトの名無しさん
2007/04/08(日) 18:22:46いや、俺はemacs使ってないからよくわからんが。
0218デフォルトの名無しさん
2007/04/08(日) 19:29:17あん? 金儲けのためよ。
俺様がPyhonの本を書けば、Py厨が喜んで買うかなと思ったんだ。
が、市場調査の結果、お前らは金持ってなさそうだと判明したんで
撤退しというわけ。
世の中、ゼニだ。金持ちを相手にしないとな。
今度は関数型言語で名前を売ろうかななんて思るよ。
お舞には、無理だろうが
0219デフォルトの名無しさん
2007/04/08(日) 20:09:190220デフォルトの名無しさん
2007/04/09(月) 00:26:480221デフォルトの名無しさん
2007/04/09(月) 01:11:190222220-221の母
2007/04/09(月) 01:17:46誠に申し訳ございません、>>220-221の母でございます。
今夜、私がちょっと目を話した隙に、頭の弱い子が
この掲示板に何か書き込んでしまったようです。
取り急ぎ薬を飲ませて眠らせましたので、
もう悪戯をする事はないかと存じます。
本当にご迷惑をお掛けして申し訳ありませんでした。
0223デフォルトの名無しさん
2007/04/09(月) 07:30:06http://www.joachim-breitner.de/various/bfi.hs
0224223の祖母
2007/04/09(月) 07:32:48>>223の祖母でございます。
この朝、私共がちょっと目を話した隙に、
また頭の弱い子が この掲示板に何か書き込んでいたようです。
さきほど拘束衣を付けて施設に送り出しましたので
もう悪戯をする事はないかと存じます。
本当にたびたびご迷惑をお掛けして申し訳ありませんですた。
0225デフォルトの名無しさん
2007/04/09(月) 07:33:37ブレインファックの他の言語での実装も持ってきて。
0226デフォルトの名無しさん
2007/04/09(月) 07:34:37就職活動お疲れ様
0227デフォルトの名無しさん
2007/04/09(月) 07:37:16暇人だな似非コンサル人種は
0228デフォルトの名無しさん
2007/04/09(月) 08:31:46もともとbfはコンパイラが短い(機械語で200バイト前後)のが特徴らしい。
http://pc11.2ch.net/test/read.cgi/tech/1036013915/632/
D言語によるインタプリタ。
http://www.ping.de/~flori/flott/exe/session/source/projects/ruby/brainfuck/brainfuck.rb?tokens=Ruby&back_url=/~flori/flott/exe//session/project/ruby/brainfuck
Rubyによるインタプリタ。
http://d.hatena.ne.jp/tanakh/20040725#p1
Haskellによる比較的短いインタプリタ。
0229デフォルトの名無しさん
2007/04/09(月) 08:34:500230デフォルトの名無しさん
2007/04/10(火) 20:44:08イベント発生時のサーバ側からのプッシュとか、
リクエスト同士でのデータのオンメモリでのやりとりとか。
0231デフォルトの名無しさん
2007/04/11(水) 21:22:07Writing High-Performance Server Applications in Haskell, Case Study: A Haskell Web Server
0232デフォルトの名無しさん
2007/04/15(日) 04:08:19これって、Persecに比べて何がよいの?なんか随分古そうだけど。
0233デフォルトの名無しさん
2007/04/18(水) 02:33:07オス オラ素人ハスケラー
教科書見てプログラム書くだけじゃつまんねーぞぉ
30行くらいのサンプルプログラム晒してくれ
そんでその後に説明してくれ
どーせスレのびないんだし、頼んだぞぉ!
なんならこっちで
【数学者】Haskellはクソ言語【オナニー】
http://pc11.2ch.net/test/read.cgi/tech/1128011645/
0234デフォルトの名無しさん
2007/04/20(金) 21:23:210235デフォルトの名無しさん
2007/04/20(金) 21:24:210236233
2007/04/20(金) 22:46:40余裕でスルーかよw
0237デフォルトの名無しさん
2007/04/20(金) 22:53:11おもしろそうなら食いつく奴も居るんじゃね?
0238233
2007/04/20(金) 23:17:16よし!お題です。
歌詞検索サイト
http://www.uta-net.com/user/ichiran.html?Aselect=1&Keyword=&Bselect=1&Cselect=1
このWebサイトは歌詞を教えてくれるサイトです。
ただし、コピペや印刷はできないようになっています。
けど、ソースを見れば歌詞が入っています。
パーサー作って、曲名・歌手・作詞・作曲、そして歌詞をファイルに書き出してください。
なお、このWebサイトはID5桁で全歌詞が検索できます。
http://www.uta-net.com/user/phplib/view_6.php?ID=*****
↑こんな感じ
ということで、最終的には引数に数字5桁を入力すれば
ファイルの書き出しが行われるようにしてください。
面倒であれば完璧にこなさなくてもいいです。
細かな仕様は勝手につくってください。
0239デフォルトの名無しさん
2007/04/20(金) 23:37:540240デフォルトの名無しさん
2007/04/20(金) 23:52:23おまえ真性の馬鹿だろ
0241デフォルトの名無しさん
2007/04/21(土) 01:31:53どうすればいいですか?
--ソース
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
0242デフォルトの名無しさん
2007/04/21(土) 01:37:300243デフォルトの名無しさん
2007/04/21(土) 02:37:43そりゃソースはコピペできるけど直接コピーできねーじゃん
さっさと作れよハゲ
0244デフォルトの名無しさん
2007/04/21(土) 05:30:43ghc --make でおk
0246デフォルトの名無しさん
2007/04/23(月) 17:38:570247デフォルトの名無しさん
2007/04/23(月) 19:32:27でも、
一度も公の場所に出てなくて
質問している人もいっぱいいるでしょ。
0248デフォルトの名無しさん
2007/04/23(月) 21:44:260249デフォルトの名無しさん
2007/04/23(月) 21:48:30void はこのスレ的には いてはならない存在。
0250デフォルトの名無しさん
2007/04/23(月) 23:44:41ミ ・ ・ ミ [email protected]
( ° )〜 改名しました
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
0251デフォルトの名無しさん
2007/04/24(火) 00:17:04おまぃのダメさ加減は誤魔化しようがない。
0252デフォルトの名無しさん
2007/04/24(火) 11:53:08(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です。
0253デフォルトの名無しさん
2007/04/24(火) 17:32:52その場合、識別子レベルでパースしているような感じになる。「test」という
予約語と「testss」というトークンを比較して違う、というエラーなので
column が 1 になるようにわざわざしている。
(string "test") にしてみたら変わるでしょ。
0254デフォルトの名無しさん
2007/04/24(火) 18:27:01おっしゃるとおり変りました。
回答ありがとうございました。
*Parser> runParser (do {reserved "test"; (string "test")}) 0 "" "test te11"
Left (line 1, column 6):
unexpected "1"
expecting "test"
0255252
2007/04/24(火) 18:30:13*Parser> runParser (string "test") 0 "" "te11"
Left (line 1, column 1):
unexpected "1"
expecting "test"
stringでも先頭でしたね…
0256デフォルトの名無しさん
2007/04/25(水) 22:19:08Haskellってどういう処理につえーの?
どういうアプリケーションに向いてんの?
0257デフォルトの名無しさん
2007/04/25(水) 22:47:240258デフォルトの名無しさん
2007/04/25(水) 22:57:560259デフォルトの名無しさん
2007/04/27(金) 08:02:470260デフォルトの名無しさん
2007/04/27(金) 13:35:530261デフォルトの名無しさん
2007/04/27(金) 19:34:57よくしらんのだが国際化対策を
しないっていう理由があるの?
0262デフォルトの名無しさん
2007/04/27(金) 19:48:06なんかむかついてきたぞー
0263デフォルトの名無しさん
2007/04/27(金) 19:54:190264デフォルトの名無しさん
2007/04/27(金) 20:37:180265デフォルトの名無しさん
2007/04/27(金) 20:53:040266デフォルトの名無しさん
2007/04/27(金) 20:55:360267デフォルトの名無しさん
2007/04/27(金) 20:56:120268デフォルトの名無しさん
2007/04/27(金) 20:58:020269デフォルトの名無しさん
2007/04/27(金) 21:02:100270デフォルトの名無しさん
2007/04/27(金) 21:08:370271デフォルトの名無しさん
2007/04/27(金) 23:05:24タイポ タイポ ティンポー!!
0272デフォルトの名無しさん
2007/04/28(土) 00:37:040273デフォルトの名無しさん
2007/04/28(土) 00:52:300274デフォルトの名無しさん
2007/04/28(土) 01:39:55UTF-8の場合、BOMはBOMとしてではなくUTF-8であることを示す為に利用される。
0275デフォルトの名無しさん
2007/04/30(月) 15:06:460276デフォルトの名無しさん
2007/04/30(月) 15:15:07http://www.haskell.org/index.html のこと?
うちからはつながったけど。
0277デフォルトの名無しさん
2007/04/30(月) 15:20:000278デフォルトの名無しさん
2007/04/30(月) 15:47:420279デフォルトの名無しさん
2007/04/30(月) 16:15:01∩___∩ /゙ミヽ、,,___,,/゙ヽ
| 丿 ヽ i ノ `ヽ'
/ ○ ○ | / `(○) (○)´i、
| U ( _●_) ミ 彡,U ミ(__,▼_)彡ミ
彡、 |∪| ,,/ ,へ、, |∪| /゙
/ ヽ ヽノ ヾ_,,..,,,,_ / ' ヽノ `/´ ヽ
| ヽ ./ ,' 3 `ヽーっ / |
│ ヾ ヾl ⊃ ⌒_つ ソ │
│ \,,__`'ー-⊃⊂'''''"__,,,ノ |
> arashi = "先生 Haskell が生きてるの"
> main = putStr "はいはいわろすわろす"
〃∩ ∧_∧
⊂⌒( ・ω・) はいはいわろすわろす
`ヽ_っ⌒/⌒c
⌒ ⌒
0280デフォルトの名無しさん
2007/04/30(月) 17:57:490281デフォルトの名無しさん
2007/04/30(月) 18:04:07川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]
0282デフォルトの名無しさん
2007/05/01(火) 00:27:03対して抽象化は、対象物のある特徴的な側面を抽出し概念化することだ。
仮想化で抽象化の技術が使われることはあるだろうが、その逆は考え難い。
コンピュータを使い、扇風機やコタツを抽象化することはできても、仮想化する
ことはできないのだ。少なくとも今の技術では無理だ。コンピュータがその姿形
を変えることはできないのだから。コンピュータが仮想化できるものは、コンピュー
タそのものが直接扱うものだけだ。例えば、仮想メモリ、仮想ネットワーク、仮想
マシン、仮想キーボードといったものだ。
抽象化した結果表現されるものは、設計者が想定した概念やイメージだ。しかし、
実在するものそのものではなく、人が考えたものであるために、このイメージは
非常に脆く、不安定だ。外部からの影響をもろに受け、形を変え易い。個々人が
持つイメージの些細な相違から認識のずれが生じ易い。扇風機の使い方は人に
よって異なることはないが、人がイメージしたものは、その生成から、破棄に至る
まで、非常に不安定な状態になり易い。それを防ぐには、イメージそのものをなる
べく強固なものにし、インターフェースに一貫性と整合性をもたせ、外因による影響
を受けに難くく、壊れ難くするための技術を見につけ、理解を深めておくしかない。
0283デフォルトの名無しさん
2007/05/01(火) 11:30:030284デフォルトの名無しさん
2007/05/01(火) 11:42:53長すぎて読む気しない
0285デフォルトの名無しさん
2007/05/01(火) 13:51:39長すぎて読む気しない
0286デフォルトの名無しさん
2007/05/01(火) 15:15:300287デフォルトの名無しさん
2007/05/02(水) 06:39:55「長すぎて読む気しない」と書き込んでその反映を確認する時間より>>282を読む時間のほうが長いとか、
この程度のもの読むのに「労力」の存在を意識してしまうとか、そういう低学歴のたぐいは問題外。
0288デフォルトの名無しさん
2007/05/02(水) 22:08:44ここが2chだという自覚のない基地害
0289デフォルトの名無しさん
2007/05/02(水) 23:55:21長すぎて読む気しない
0290デフォルトの名無しさん
2007/05/03(木) 00:14:50唐突に関係ない概念を持ちだして逃げてはいけません :-)
0291デフォルトの名無しさん
2007/05/03(木) 10:09:40ヘ_ヘ ____________________________
ミ ・ ・ ミ [email protected]
( ° )〜
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
0292デフォルトの名無しさん
2007/05/03(木) 12:33:150293デフォルトの名無しさん
2007/05/03(木) 12:36:470294デフォルトの名無しさん
2007/05/03(木) 19:42:27http://whatisthematrix.warnerbros.com/
0295デフォルトの名無しさん
2007/05/04(金) 20:09:43自分の$HOME以下にライブラリをインストールした際に、
そのパスをghcに見つけてもらうにはどうしたら良いでしょうか
0296デフォルトの名無しさん
2007/05/04(金) 20:14:48マニュアルを読んでそれに従う
0297デフォルトの名無しさん
2007/05/04(金) 20:14:54ghc-pkg -list
して、インストールしたはずのライブラリがのってる?
0298デフォルトの名無しさん
2007/05/07(月) 00:07:16IOは別としても、Maybeやリストを単体じゃなくてdoや>>=でバリバリ繋いだり、
あるいは合成モナド作ったりとかって実際のプログラムでどの位やるもの?
0299デフォルトの名無しさん
2007/05/07(月) 00:59:58書いて、置換用のデータを Map でもたせ、 Reader で処理するというプログ
ラムを書いたことがあるよ。
そのとき、一部のデータは IO で読まないといけなくなり(実行したときの
日付とかそういうやつな)、けっきょく ReaderT IO になった。
あと IO 処理で繰り返しっぽくなりそうなのを ListT にしたりすることはある。
0300デフォルトの名無しさん
2007/05/07(月) 01:32:24長すぎて読む気しない
>>300
Y
0301デフォルトの名無しさん
2007/05/07(月) 01:33:16これを実践での広い応用範囲が想像できないけど、
使い慣れたら、バリバリ使って格段に楽になって保守性もぐんと上がるもんでしょうかね。
お勉強レベルのサンプルだと、結局3行のコードが2行になる、とかそんな程度だけど。
0302デフォルトの名無しさん
2007/05/07(月) 07:36:50ちょっと気になったので適当なコードで"do"をgrepしてみた。結果。
IO: 58
StateT Cont: 38
Maybe: 20
Parsec.GenParser: 19
Either: 17
IO以外も結構使ってる。
0303デフォルトの名無しさん
2007/05/07(月) 17:07:06Yコンビネータで再帰ですか?
0304デフォルトの名無しさん
2007/05/08(火) 12:50:56ワロタ
0305デフォルトの名無しさん
2007/05/11(金) 00:14:521〜100までを出力するにはどうすりゃいいのよ
0306デフォルトの名無しさん
2007/05/11(金) 01:33:260307デフォルトの名無しさん
2007/05/11(金) 04:02:44print 2
print 3
...
print 100
0308デフォルトの名無しさん
2007/05/12(土) 18:58:15unP :: 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を合わせたようなやつです。
0309デフォルトの名無しさん
2007/05/12(土) 23:12:52具体例は何?何を抽象化してモナドにしたの?
モナドが見つかったとしてもそれを適用してかつ使えるものじゃないと。
0310デフォルトの名無しさん
2007/05/13(日) 09:27:00モナド自体が珍しい訳じゃないのか。
>何を抽象化してモナドにしたの?
自然言語の、「普通のもの」とか「平均的なもの」という表現を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
0311デフォルトの名無しさん
2007/05/14(月) 22:55:55範囲がIntに収まる場合はわかるのですが、それより大きい範囲を使いたい
場合はどのようにすればよいでしょう。
class Enum a where
toEnum :: Int -> a
となっていてIntに収まらないといけないのかとも思ったのですが、
instance Enum Integer
とあって、下のsuccも動くのでできるのかもと。
Prelude> succ 1000000000000000::Integer
1000000000000001
とんでもなくアホな事を聞いてたらすいませんです。
0312デフォルトの名無しさん
2007/05/14(月) 23:06:57Haskellレポートの6.3.4によると、fromEnumやtoEnumは変換できない場合には
実行時エラーを発生させて良いらしい。
その場合、succ,predなどについてデフォルトメソッドを使うわけにいかないから、
全て自分で定義を与えるしかない。
0313デフォルトの名無しさん
2007/05/14(月) 23:19:00> 全て自分で定義を与えるしかない。
なるほど、こういう方法があるのですね。
挑戦してみます。
0314デフォルトの名無しさん
2007/05/15(火) 00:06:19考えてみる。いつになるかわからないけど。
>モナド自体が珍しい訳じゃないのか。
わからない。でも実際使えるモナドなら確実に珍しいはず。
それとMonadだけじゃなくてFunctorも定義しておかないとモナドにならない。
0315デフォルトの名無しさん
2007/05/15(火) 00:11:220316デフォルトの名無しさん
2007/05/15(火) 00:43:12Monadを定義すればFunctorは決まりませんか。
fmap = liftM = (\f x -> x >>= return . f)
0317デフォルトの名無しさん
2007/05/16(水) 05:29:18次期Haskell(1.6?)って、いまメーリングリストでどんなやり取りしてんの?
日本語でおせーて
0318デフォルトの名無しさん
2007/05/16(水) 13:16:090319デフォルトの名無しさん
2007/05/16(水) 13:50:170320デフォルトの名無しさん
2007/05/16(水) 14:16:16普通のデータ型あんだろ?
data A = B Int | C String
みたいな。
データ型を用意して、return とか (>>=) とか (>>) とかの関数を用意すれば立派なモナドだよ。
0321デフォルトの名無しさん
2007/05/17(木) 01:05:07質問
Javaってプリミティブ型(char, int)とオブジェクト型(String)があるけど、
HaskellのCharやIntは、全部Object型みたいなもんなの?
もしそうなら、Javaに比べて必然的にメモリ使用量は多くなる?
0322デフォルトの名無しさん
2007/05/17(木) 01:14:270323デフォルトの名無しさん
2007/05/17(木) 01:14:37Haskellにもプリミティブデータ型が存在します。
Char や Int などはプリミティブです。
String は Char のリストとして表現されますので、メモリ使用量は多くなります。
すべての場合において Java より Haskell の方がメモリ使用量が多いかどうかはしりません。
0324デフォルトの名無しさん
2007/05/17(木) 06:55:15CharやIntは、ユーザが同等の型を自分で定義することが非現実的、という点でプリミティブだけど、
他のあらゆるデータ型と対等に扱える(多相関数に渡せ、多相データ型に保持できる)ことと、
基本的に参照(ポインタ)を介して操作される、という点では明らかにオブジェクトに近い。
例えば、データ構造中にIntを一個保持するには、普通、ポインタ一個分と整数一個分の
領域が必要になる。
GHCでは、「真の」プリミティブ型としてInt#やChar#などが使える。(非ボックス化型、unboxed typeという)
これはJavaのプリミティブ型に相当するもので、多相関数に渡せない。これを使って、例えばIntは
data Int = I# Int#
と定義されている。(I#は単なるデータ構築子の名前)
0325デフォルトの名無しさん
2007/05/18(金) 00:58:49ベストアンサー賞を授ける
0326デフォルトの名無しさん
2007/05/18(金) 19:21:57で必ずoneの方が小さい値になるようにしたい時とか
data Hoge = Hoge Int
でIntの値をある範囲におさめたい時とかどのようにすれば良いでしょうか。
宣言のしかたや、コンストラクタでなんとかできるものですか?
後者については最初はBoundedでなんとかできるかと思ったのですが
勘違いをしていたみたいですし。
0327デフォルトの名無しさん
2007/05/18(金) 19:37:170328デフォルトの名無しさん
2007/05/18(金) 22:34:50せっかく教えていただいたのに本当に申し訳ないのですが、
書き込んでいただいてから今まで調べてみたのですが
わかりませんでした。
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
ヒントか記載いただいた記法に関して説明されているところ
など教えていただいてもいいですか?
0329デフォルトの名無しさん
2007/05/18(金) 22:41:15直接の言語サポートがないので、そういうときは抽象データ型を使うのが普通。
不変条件を侵さないように注意深く操作を定義して、
モジュールからはそれらの操作だけをエクスポートし、データ構築子は隠しておく。
ユーザは公開された操作だけを使うから、不変条件は自動的に守られる。
>>327
それはどういう方言?実装ある?
0330デフォルトの名無しさん
2007/05/19(土) 00:47:39そういう方法が!
定石とかも全く知らないので大変助かりました。
memomemo
http://www.sampou.org/haskell/tutorial-j/modules.html
> 11.2 抽象データ型
0331デフォルトの名無しさん
2007/05/19(土) 02:46:37亀レスすまそ。
>Monadを定義すればFunctorは決まりませんか。
>fmap = liftM = (\f x -> x >>= return . f)
それは確かにそうなるのだけどそれは
自然変換が「自然」になっているからそうできるだけで
(注:あんまよくわかっていない)
わざわざそれで定義するのは変な気がする。
--けれどももしかしたらFunctorクラスで作られているのは普通の函手で
--fmap = (\f x -> x >>= return . f)
--これは自己函手と見るべきなのかも知れないとか思ったり。
0332デフォルトの名無しさん
2007/05/19(土) 02:49:16普通モナドを作るならまず函手と自然変換を考えなきゃ。
たぶんモナド作るなら(注:完全な私見)
自然変換(なんかやりたい操作)が思いつく
|
なにを函手とすればいいのか思いつく。
|
モナドにはならないけどとりあえず元々やりたかった操作が
実現できる。
|
モナドになるように元々の考えを洗練。
|
モナドになる or モナドにならない
という風になるんじゃないかと思いながら考えている。(全然知らんが)
多分、モナドになることを最初の目的として作っても
トリビアルな物しかできないんじゃないかなやっぱし。
最初からモナドを意識しなくても考えを突き詰めに突き詰めて
洗練に洗練を加えた構造が見出せれば勝手にモナドになっていると思うし。
0333デフォルトの名無しさん
2007/05/19(土) 09:08:430334デフォルトの名無しさん
2007/05/19(土) 22:56:390335デフォルトの名無しさん
2007/05/20(日) 13:01:370336デフォルトの名無しさん
2007/05/20(日) 13:03:180337デフォルトの名無しさん
2007/05/21(月) 22:48:28wxHaskellを解説してるサイトで、
>普通に圧縮したら6MB弱にしかならなかったのでこりゃ駄目だと
>思ったら余分なデータの削除なるオプションで500KB弱になった。
って記述があったんだけどなんてコマンドなの?
調べたらstripってのがあるらしいんだけど使えないしGHCのマニュアルにも載ってないし
0338デフォルトの名無しさん
2007/05/21(月) 22:52:06winならcygwin入れれば使えるよ
0339デフォルトの名無しさん
2007/05/21(月) 23:21:14メモリも2G近く消費するし。
O0でも遅い。
O-1とかないのだろうか。
0340デフォルトの名無しさん
2007/05/21(月) 23:39:180341デフォルトの名無しさん
2007/05/22(火) 00:07:19ふつうのHaskell読んだけど、どうもこれだけじゃ全然不足みたいで、
ファンクタだのArrowだのモナドの合成だの、どこまであるのか、やればいいのか見えない。
とりあえずココまで、みたいなのってある?
0342デフォルトの名無しさん
2007/05/22(火) 01:28:49未だに自然変換が理解できていないせいかなんともわからん。
「自然」ってどういうことなんだろう?
0343デフォルトの名無しさん
2007/05/22(火) 01:31:34とりあえずライブラリ読めば?
0344デフォルトの名無しさん
2007/05/22(火) 05:53:37自分の作りたい物が作れるまで。
作りたい物のない「勉強のための勉強」は苦痛でしかないから止めとけ。
0345デフォルトの名無しさん
2007/05/22(火) 08:10:42実際「役に立つ概念」ってのはそう多くなくて,自然に定義する限り
まともな概念はだいたいモナドになってくれるはず.
(ならないものはだいたい使い物にならない概念だと思う)
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, *) はモナドになっている.
0346デフォルトの名無しさん
2007/05/23(水) 00:27:21さすがです・・・。というかどこまでわかっているんですか・・・。
とりあえず保存しました。
いつか自然に理解できるようになりたいです。
にしても
> が自然な気がする.
表現から類推するだけですけど
本当に自然に自然かどうかわかるようになるんですね・・・。
やっぱり「自然」はかなり強力な概念なのか。
0347デフォルトの名無しさん
2007/05/23(水) 01:38:10>>346
345での「自然」は、厳密な意味の自然変換というよりは
直感に整合する,というくらいの意味で使ってる.
(ただし,それは普通は自然変換になるんだけど)
実のところ,結構適当な関数を選んでも自然変換になっていて,
たとえば 4 の読み替えのところを次のようにしてやる:
j : X -> T X を j(x) = (x, "Hello"と表示)
これでも j は自然変換になる.逆にどんなのが自然変換に
ならないかというと,読み替えが X に依存するとき,たとえば
i : X -> T X を j(x) = (x, "これの型は X"と表示)
とすると自然変換にはなっていない.まあ一般の
「画面情報付きにする」関数が,型によって違う挙動をするのは
不自然(つけてるのが単なる画面情報じゃないはず)だよね.
0348デフォルトの名無しさん
2007/05/23(水) 01:45:16そうか。
標準ライブラリの範囲か。それはよさそう。
>>344
でも、せっかくの道具を知らずにゴリゴリはイヤだよ。
0349デフォルトの名無しさん
2007/05/23(水) 01:45:55というよりも「型情報を表示する」ような操作と考えるのが自然.
これは 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, *) はまたモナドになっている.
#というわけで,そんなに自然変換にこだわらなくても適当に
#それっぽく定義をしておけば,勝手にモナドになってくれてるもんです.
0350デフォルトの名無しさん
2007/05/23(水) 13:01:35そもそも"それっぽく定義"とやらができるようになるまで
かなりの訓練が必要かと思われるのですが。
0351デフォルトの名無しさん
2007/05/23(水) 23:24:56いえいえ、少佐。
それ以前に私にはあなた方の使用している文字列が
日本語と認識できないのです。
0352デフォルトの名無しさん
2007/05/24(木) 01:13:52>345での「自然」は、厳密な意味の自然変換というよりは
>直感に整合する,というくらいの意味で使ってる.
>(ただし,それは普通は自然変換になるんだけど)
それはなんかわかります。っていうかいままで言ってきた
それっぽいことはほぼそれを仮定しています。
それゆえに自然は理解したいんです。
>#というわけで,そんなに自然変換にこだわらなくても適当に
>#それっぽく定義をしておけば,勝手にモナドになってくれてるもんです.
というわけでこれも同意です。でも、当分自然変換にはこだわると思います。
IOモナド・・・なんだか自分にとってそのうち黒歴史に
なっていく予感がしますがやっぱり面白そうですね。
#ちなみに函手 T だとまずいから函手 U に変更って部分がわからないです。
#必要性はなんとなくわかりますが函手を変更しても、うまく整合して
#モナドになってくれるというところが見当もつきません。orz
>>350
>そもそも"それっぽく定義"とやらができるようになるまで
>かなりの訓練が必要かと思われるのですが。
確かに。うーん。でもとある方向性をもちながらHaskellやっていれば
なんとなく"それっぽく定義"がなんとなくわかるようになるような気もする。
というかHaskell作った人たちはそうなるように作っているような気がする。
0353デフォルトの名無しさん
2007/05/24(木) 01:26:420354デフォルトの名無しさん
2007/05/24(木) 01:57:55/ _|ノ ├〈,.-― ;. _ ,ゞ--'、:\___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| /
. `/,' ヽ \ ',/
∧ヽ \ \:.:.:.. ∧
0355デフォルトの名無しさん
2007/05/24(木) 13:17:050356デフォルトの名無しさん
2007/05/24(木) 21:25:010357デフォルトの名無しさん
2007/05/25(金) 02:19:16PowerShellのことだな?
0358デフォルトの名無しさん
2007/05/25(金) 23:28:50swap ~(x,y) = (y,x)
この~って何?
0359デフォルトの名無しさん
2007/05/26(土) 00:08:030360デフォルトの名無しさん
2007/05/26(土) 05:07:31遅延パターンと言って、引数を評価せずに即座に照合が成功し、
導入された変数(その例ではxやy)の値が必要になって初めて評価が起こるようなパターン。例えば、
swap' (x, y) = (y, x)
と定義すると、
case swap' undefined of (_, _) -> 4
はundefinedだけど、
case swap undefined of (_, _) -> 4
は4になる。
>>359
それは無茶だw
0361デフォルトの名無しさん
2007/05/26(土) 12:13:28http://www.sampou.org/haskell/tutorial-j/patterns.html#tut-lazy-patterns
でもおれは使ったことないなあ……
0362デフォルトの名無しさん
2007/05/26(土) 12:29:440363デフォルトの名無しさん
2007/05/26(土) 12:31:42(この人絶対このスレ見てる・・・)
http://itpro.nikkeibp.co.jp/article/COLUMN/20070305/263828/
0364デフォルトの名無しさん
2007/05/26(土) 13:07:22ヤツはそんなとこで記事書くようになったのか?
出世したもんだ。
0365デフォルトの名無しさん
2007/05/29(火) 00:48:25未だにshelarcyの読み方が分からないっす
0366デフォルトの名無しさん
2007/05/29(火) 23:11:21読みを探そうと思ってヤツのホムペ行ったら・・・なんだよこれw
0367デフォルトの名無しさん
2007/05/30(水) 21:40:17いまだに理解できないオレ、へたれ♂
Javaでいうと常にfinalってことか?
ある関数に引数を渡すと、必ず同じ値が返ってくるとか言うけど、
引数に3を与えても、5を与えても同じ値が返ってくるのか?
我ながら根本的に理解してないようなんだが、
だれか助けて。
ちなみに「ふつける」は半分以上読みました
0368デフォルトの名無しさん
2007/05/30(水) 21:42:030369デフォルトの名無しさん
2007/05/30(水) 21:48:010370デフォルトの名無しさん
2007/05/30(水) 22:01:10>ある関数に引数を渡すと、必ず同じ値が返ってくるとか言うけど、
>引数に3を与えても、5を与えても同じ値が返ってくるのか?
違う。ただし、「同じ」引数を渡せば、必ず同じ値が返ってくる。
>>369
仕様では決まってないから処理系依存だと思う。
ただ、現在出回ってる処理系はどれも自動並列化はしないと思う。
0371デフォルトの名無しさん
2007/05/30(水) 23:20:46代入っつーかバインド
数字に記号あてはめてんの
0372デフォルトの名無しさん
2007/05/30(水) 23:25:16俺はお前に教えられるほど超人的な指導力は持ち合わせていない
0373デフォルトの名無しさん
2007/05/30(水) 23:54:26>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の流儀。
それだけのこと。
0374デフォルトの名無しさん
2007/05/31(木) 01:01:54っていうか、Arrow以前にポイントフリースタイルって何が嬉しいの?
Arrowも単にスタイルだけの問題?
0375デフォルトの名無しさん
2007/05/31(木) 01:13:15> ポイントフリースタイルって何が嬉しいの?
変数書かなくていいからきれいすっきり。ただそれだけ。
0376デフォルトの名無しさん
2007/05/31(木) 03:12:47関数型言語ってGoFのデザインパターンをつかえんの?
ぜんぜん無理?
0377デフォルトの名無しさん
2007/05/31(木) 04:20:21haskell ではないが。
http://www.norvig.com/design-patterns/
0378デフォルトの名無しさん
2007/05/31(木) 23:01:57わかんないよ父ちゃん!
フィールドと再代入がないのに、
どうやってプログラミングすればいいんだよ
class MyInt {
private int[ ] i;
public void increase(int value) {
i += 1;
}
public decrease(int value) {
i -= 1;
}
}
0379デフォルトの名無しさん
2007/05/31(木) 23:09:530380デフォルトの名無しさん
2007/05/31(木) 23:29:58だから、呼ぶ側で値を持ってて、引数で渡せよ。
そうすれば非finalなフィールドはいらんだろ。
つか、いろいろソース読んでソース書いてれば慣れる。
0381デフォルトの名無しさん
2007/06/01(金) 01:54:23これはひどい
0382デフォルトの名無しさん
2007/06/01(金) 04:45:20下のように2つの数値を受け取るように書くにはどう定義すりゃいいの
main 5 10
0383デフォルトの名無しさん
2007/06/01(金) 07:33:59受け取るのは「文字列のリスト」だから心配ない。
0384デフォルトの名無しさん
2007/06/01(金) 08:45:520385デフォルトの名無しさん
2007/06/01(金) 10:30:46例として、ふたつの引数の和を表示するなら、
main = do
[a, b] <- getArgs
print $ read a + read b
という感じで。
0386デフォルトの名無しさん
2007/06/01(金) 22:29:05ところで、こんなコンパイルエラーでたんだけど、どういう意味?
myIf.hs:4:16: parse error on input `='
特にダブルクォートとシングルクォーテーションの意味が知りたいのです
0387デフォルトの名無しさん
2007/06/01(金) 22:58:370388デフォルトの名無しさん
2007/06/02(土) 02:09:03これってどういうこと? x = f x って。
fがたとえば id ならまだいいけど、(+ 1)だったら?
っていうか言語的に、letの機能ってどうなってんの?
0389デフォルトの名無しさん
2007/06/02(土) 02:38:410390デフォルトの名無しさん
2007/06/02(土) 03:16:09http://haskell.org/onlinereport/exps.html#sect3.12
のこと?
定義のスコープがin の中と、そして定義の右辺、とあったけど、疑問が強まっただけ…。
fix f = let x = f x in x
は
fix f = let y = f x in y
と等価ってわけじゃないってことでしょ?
0391デフォルトの名無しさん
2007/06/02(土) 03:43:54やってみればわかるけど fix (+1) はループして値が定まらない。
0392デフォルトの名無しさん
2007/06/02(土) 03:56:29fix (\l -> 1:l)
とやると、[1, 1, 1, ...という無限リストができる。
fix (\l -> 1:1:(zipWith (+) l (tail l)))
とやると……。
0393デフォルトの名無しさん
2007/06/02(土) 06:18:57Haskellには遅延評価があるので、関数以外のものも再帰的に定義できる。
ones = 1 : ones
とすれば、onesは1が無限に続くリスト。
x = (1, fst x)
とすれば、xは(1, 1)。もちろん再帰的定義は常に有効な訳ではなく、
x = x
などと定義すればxを評価した瞬間に無限ループに陥るし、
x = x + 1
でも同様。
letに特有のことは何もない。モジュールのトップレベルでも同じ。
0394デフォルトの名無しさん
2007/06/02(土) 13:49:10仕事で使っている人とかいる?
0395デフォルトの名無しさん
2007/06/02(土) 15:09:43つまり、
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でも無限ループだよね?
0396デフォルトの名無しさん
2007/06/02(土) 18:04:280397デフォルトの名無しさん
2007/06/02(土) 18:47:19おk。
idでも無限ループ。
>一部だけは取り出せる
完全に取り出せることもある。fが(const 4)のときとか。
0398デフォルトの名無しさん
2007/06/02(土) 23:43:50レベルが低下しているというかそもそも高くなっていない。
本質的に何も言っていないも同然じゃないか?
(とは言いすぎか。少なくとも一般的に使えそうにないとは感じる。)
そりゃ評価もされんわ。
0399デフォルトの名無しさん
2007/06/03(日) 00:23:02コピペにマジレスかこわるい
0400デフォルトの名無しさん
2007/06/03(日) 00:30:160401デフォルトの名無しさん
2007/06/03(日) 00:51:500402デフォルトの名無しさん
2007/06/03(日) 01:35:22part 1の頃はレベル高かったと思う。
0403デフォルトの名無しさん
2007/06/03(日) 02:04:100404デフォルトの名無しさん
2007/06/03(日) 12:10:06コピペちゃうわ
0405デフォルトの名無しさん
2007/06/03(日) 13:03:26すまん
Lisp系のスレにコピペしたの俺
0406デフォルトの名無しさん
2007/06/03(日) 14:48:48俺はMLスレ。
ていうか、なんか他のスレにもコピペがしてあるんだけど。
他にもコピペしてる奴がいるのか。
0407デフォルトの名無しさん
2007/06/03(日) 15:14:42レベルが低いと嘆きつつ、こんな最底辺のネタになるとレスが増える不思議。
0408デフォルトの名無しさん
2007/06/03(日) 17:12:39みえみえの煽りをマジに受け取るなよ
厨房じゃあるまいし
0409デフォルトの名無しさん
2007/06/03(日) 20:29:30PerlならCGIとか仕事の補助ツールとか用途があるので
まだいじる動機が見つかるんだけど、Haskellはなんか
目的が定まんないんだよね。
これまでやってきた言語とちがうっぽいので、興味はある
からここ覗いたり解説サイトとか流し読みしてるんだけど、
あと一歩、手をつけるきっかけが無いんだわ。
0410デフォルトの名無しさん
2007/06/03(日) 20:34:280411デフォルトの名無しさん
2007/06/03(日) 21:32:55今まで別の言語でやってた部分をリプレースするからには、
Haskell使うとよりハッピーになれるかが決め手だろうな。
C/C++:処理速度重視、アセンブラとのインターフェースが楽。
Perl:標準入出力で事足りる場合はこっち。
Java:特定の環境ではこれしか案件がない。
Haskell:……何に使える? 何が得意?
0412デフォルトの名無しさん
2007/06/03(日) 21:44:03Parsecでパーサー書いて処理したりとか。
0413デフォルトの名無しさん
2007/06/03(日) 22:07:48俺は趣味プログラマで、シェルスクリプトとHaskell以外はあまり書かないから、
大して参考にはならんかも。
0414デフォルトの名無しさん
2007/06/03(日) 23:43:34ghcはMLで書き直した方がいいんじゃないか。
0415デフォルトの名無しさん
2007/06/03(日) 23:52:210416デフォルトの名無しさん
2007/06/04(月) 00:33:03日本語がへなちょこなのにか?
0417デフォルトの名無しさん
2007/06/04(月) 00:35:05haskellは習得に時間が掛かりすぎる。
遅延評価で最適なコードを書くには頭使いすぎる。
0418410
2007/06/04(月) 00:39:50日本語周りぐだぐだだし、他の言語のリプレースになるなんて思ってないよ。
0419デフォルトの名無しさん
2007/06/04(月) 00:42:20何なんだこの言語の開発者どもは。
誰も彼もやる気が感じられねーぜ。
0420デフォルトの名無しさん
2007/06/04(月) 01:36:59頭使わないで書いていいのが遅延評価のいいところじゃないのか?
0421デフォルトの名無しさん
2007/06/04(月) 02:26:12fix f = let x = f x in x
と、
fix f = f $ fix f
ってどう違う?
0422デフォルトの名無しさん
2007/06/04(月) 02:47:30>>>395の fix ってYコンビネータ?
Yコンビネータと同じ関数。再帰を使って定義しておいてコンビネータと呼んで良いのかは知らない。
>どう違う?
結果は同じ。素朴な実装だと、前者ではfixの呼び出し一回につきfは
一回しか呼ばれないのに対し、後者では何回でも呼ばれ得る。例えば、
let xs = fix (1:) in xs !! (xs !! n)
は、前者ではO(1)、後者ではO(n)の空間を使うはず。
0423デフォルトの名無しさん
2007/06/04(月) 04:39:46main = print $ bad (Very bad)
data Silly = Very (Silly -> Int)
bad :: Silly -> Int
bad (Very f) = f (Very f)
0424デフォルトの名無しさん
2007/06/04(月) 10:42:30遅延評価を最大限に生かすには手続き型よりも頭使うよ
0425デフォルトの名無しさん
2007/06/04(月) 13:24:25遅延評価を最大限に生かす、ってどんなの?
0426デフォルトの名無しさん
2007/06/04(月) 18:30:20いやO0でも充分遅いから。
0427デフォルトの名無しさん
2007/06/04(月) 22:11:12http://vista.jeez.jp/img/vi8096131420.png
0428デフォルトの名無しさん
2007/06/04(月) 22:13:59萌えキャラ化したジャイアン?
0429デフォルトの名無しさん
2007/06/07(木) 01:01:46節操がないって言うか、ポリシーがないって言うか。
0430デフォルトの名無しさん
2007/06/07(木) 01:16:13結構ポリシーがあるほうだと思う。
節操がないという言葉に一番当てはまるのはDあたりだと思う
0431デフォルトの名無しさん
2007/06/07(木) 01:30:540432デフォルトの名無しさん
2007/06/07(木) 01:30:550433デフォルトの名無しさん
2007/06/07(木) 01:54:510434デフォルトの名無しさん
2007/06/07(木) 11:39:330435デフォルトの名無しさん
2007/06/07(木) 11:46:55Haskellで実装されたperl6は既に動いている。
よってHaskell>>>超えられない壁>>>C/C++
0436デフォルトの名無しさん
2007/06/07(木) 12:23:51Perlはこれ自体がポリシーな訳だが。
0437デフォルトの名無しさん
2007/06/07(木) 13:37:140438デフォルトの名無しさん
2007/06/07(木) 15:58:390439デフォルトの名無しさん
2007/06/07(木) 22:51:36いきなり馬鹿呼ばわりする人は大抵自分が…
0440デフォルトの名無しさん
2007/06/07(木) 23:52:27自演乙
0441デフォルトの名無しさん
2007/06/08(金) 00:33:42何でもないレスが自演に見えるのは妄想性の病気だと思うんだ。
0442デフォルトの名無しさん
2007/06/08(金) 01:09:18それはともかく、Haskellでの正当な流儀ってどうなってんだ?
みんな(.)で繋ぐのか?でもそれだけではプログラムが書けない。
doで書くのか?でもモナドだけで書くのか?てか、ほとんど手続き型じゃん。
パターンマッチで書くのか?じゃあADTってなんだ?
誰かが論文書いた?また仕様追加するの?じゃあ今までの書き方は何だったの?
0443デフォルトの名無しさん
2007/06/08(金) 01:12:11まあもちつけ。
0444デフォルトの名無しさん
2007/06/08(金) 01:17:16みんな(.)で繋ぐのか?でもそれだけではプログラムが書けない。
forで書くのか?でもwhileだけで書くのか?てか、ほとんど関数型じゃん。
定数で書くのか?じゃあenumってなんだ?
誰かが論文書いた?また仕様追加するの?じゃあ今までの書き方は何だったの?
0445デフォルトの名無しさん
2007/06/08(金) 01:36:26ネタにマジレスすると、
>>442はスタイルの話をしているわけだが、
>>444は些末な文法要素の話でしかない。
7以降、スタイルへの影響も出てくるだろうけど、
Haskellでのスタイルの不定さにはまだまだ及ばない。
0446デフォルトの名無しさん
2007/06/08(金) 01:39:02結局実行順も状態も必要って事なんだろうな
0447デフォルトの名無しさん
2007/06/08(金) 06:56:130448デフォルトの名無しさん
2007/06/08(金) 07:11:27てかdoで書く場合とそうでない場合って結構明確に分かれてないか?
0449デフォルトの名無しさん
2007/06/08(金) 11:20:04┌──────────┐ //´ __,,>、
| ::::::::::| /::/ / ̄:::::::::::::::\
└┬────────┬┘ /::::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
0450デフォルトの名無しさん
2007/06/08(金) 11:37:32こっちは大学中に無難そうな野球男みつけて、彼氏が入団直後に結婚OKして卒業後ほどなく主婦。
ほとんど金なんか稼いだことないけどw。
毎日午前中は友達と電話したりフジの番組ずっと6時から10時ぐらいまで見て
旦那は気の毒ねーみたいな話してる。男らしさによればこんな腐った私らみたいなんでも
何不自由なく生活できることが男にとっての甲斐性・男冥利らしいから
ほんと助かるわ。マゾかと思ってしまう・・・みたいな話。
午後は基本的にいいとも→ごきげんよう→ザワイド(3時まで)ははずせないかな〜。
そこから買い物でかけたりオバサン同士で話したりして、5時前に帰ってきて7時までスーパーニュースかなあ。
30分くらいで適当に晩飯作って自動で洗ってくれる風呂のボタン押して8時から11時ぐらいまではまたテレビw
同じ25歳でも、片やこっちは専業主婦と言う立派な職業で
職歴として堂々と語れて、しかも「女性として社会に活躍するのをあきらめて
旦那さんを一生支える決意したなんてすばらしい女性なんだ」と言われるw。
いや、単に楽だし安心だからなんだけどw。支えるなんてことほとんどしてないよw。
片や男の子は毎日父親から母親から「スネかじってる」だの「男のくせに」だの言われて
就職活動しないと人間否定されて、勇気出して遠出して受けに行ったのに結果出さなかったら
過程の努力は無視されてまた「男だろいつまでもウジウジしてんな」とか言われて。10個も20個も履歴書書くのなんて面倒で考えられないしw
決して養ってもらうと言う立場には一生なれなくて果てはホームレスか飢え死に、欝・凍死・自殺。
0451デフォルトの名無しさん
2007/06/08(金) 11:43:48太るなよ
0452デフォルトの名無しさん
2007/06/08(金) 13:05:21ちゃんとした書き方してるんだって言う満足感がないだろ
RubyならちゃんとRuby的に書くのが1人前のRubyユーザ。
言語はRubyでもJava的に書いてたらそれはRuby初心者。
いってみれば、Haskellはいつまで経っても我流の半人前。
0453デフォルトの名無しさん
2007/06/08(金) 13:06:410454デフォルトの名無しさん
2007/06/08(金) 13:34:410455デフォルトの名無しさん
2007/06/08(金) 14:11:160456デフォルトの名無しさん
2007/06/08(金) 14:15:17ライスカレー
0457デフォルトの名無しさん
2007/06/08(金) 19:46:48君の言う「Ruby的」とやらだって一通りじゃないだろ
0458デフォルトの名無しさん
2007/06/08(金) 22:48:39どっかで聞いた話がいっぱい入ってね?
0459デフォルトの名無しさん
2007/06/08(金) 23:34:02ハスケル。アクセントはハのところで、あらいぐまのラスカルと似たイントネーション。
0460デフォルトの名無しさん
2007/06/09(土) 00:28:480461デフォルトの名無しさん
2007/06/09(土) 00:29:56突然 Haskell がラブリーに見えてきた俺ガイル。
0462デフォルトの名無しさん
2007/06/09(土) 00:46:580463デフォルトの名無しさん
2007/06/09(土) 01:13:40http://www.csc.liv.ac.uk/~grant/Teaching/COMP205/haskell.jpg
0464デフォルトの名無しさん
2007/06/10(日) 02:48:08Haskellって固い印象だから、こういうキュートなデザインはいいと思う
http://haskell.org/hoogle/
0465デフォルトの名無しさん
2007/06/11(月) 18:16:55あと、性能で勝っているのにCleanのがマイナーな理由。
http://shootout.alioth.debian.org/gp4/benchmark.php?test=all&lang=ghc&lang2=clean
0466デフォルトの名無しさん
2007/06/11(月) 18:55:00大人の事情ってやつ
0467デフォルトの名無しさん
2007/06/11(月) 19:29:19性能って何だ
0468デフォルトの名無しさん
2007/06/11(月) 19:30:41誰が営業してるんだ
誰がこれで金儲けてんだ
0469デフォルトの名無しさん
2007/06/11(月) 21:11:31あとコンパイル時間も比べてほしいな
GHCぼろ負けするだろうからさ
0470デフォルトの名無しさん
2007/06/11(月) 21:22:100471デフォルトの名無しさん
2007/06/11(月) 21:39:03cleanの営業はいてもいなくてもいっしょだな
0472デフォルトの名無しさん
2007/06/11(月) 21:43:10Cleanも日本語の解説書が出れば一気に人気が出るよ。
0473デフォルトの名無しさん
2007/06/11(月) 21:49:30フリーソフトが金取ってるソフトにユーザー数で勝つのは
割りと一般的だと思うけど。
0474デフォルトの名無しさん
2007/06/11(月) 21:50:230475デフォルトの名無しさん
2007/06/11(月) 22:20:43解説書は出るのを待つんじゃなくて書くもんだよ。
0476デフォルトの名無しさん
2007/06/11(月) 22:30:14"Concurrent Clean" の検索結果 約 80,200 件中 1 - 50 件目 (0.31 秒)
0477デフォルトの名無しさん
2007/06/11(月) 22:37:36C#みたいにMSとかってんなら話は別だが
0478デフォルトの名無しさん
2007/06/11(月) 22:47:35なので、ダウンロードすらしていない。
0479デフォルトの名無しさん
2007/06/11(月) 23:00:160480デフォルトの名無しさん
2007/06/11(月) 23:26:23・開発環境は無料
・登録しろって言ってくるけど、しなくてもダウンロードできる
・開発も公開も、企業じゃなくて大学がやっている
おまえらもうちょっと調べてから投稿しろよ。
0481デフォルトの名無しさん
2007/06/12(火) 00:30:49俺も最初はそう思ったけど、>>480 の通り、登録しなくてもダウンロード出来るよ
0482デフォルトの名無しさん
2007/06/12(火) 00:32:22邪魔
消えろ
0483デフォルトの名無しさん
2007/06/12(火) 00:38:10そんなことはみんな知ってるよ。
0484デフォルトの名無しさん
2007/06/12(火) 01:23:49無理すんなよ
0485デフォルトの名無しさん
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)
こういうときってどうやって対処すればいいの?
0486デフォルトの名無しさん
2007/06/13(水) 04:17:18それって型なしλ計算でしょ?
haskellは型があるもん
0487デフォルトの名無しさん
2007/06/13(水) 11:50:23その数の定義で行くと、
たとえば、threeは
ペアを作る関数
pair m n = (\x -> x m n)
として、これをpair m n を (m, n) と書くとして、
(false, (false, (false, I)))
ってなっちゃうじゃん?
2番目の要素がペアなのかIなのか決まらないじゃん。
0488デフォルトの名無しさん
2007/06/13(水) 11:59:150489デフォルトの名無しさん
2007/06/13(水) 23:21:110490デフォルトの名無しさん
2007/06/14(木) 00:41:57schemeでやってみるか、データ型駆使するか?
0491デフォルトの名無しさん
2007/06/14(木) 00:51:02複数回の関数呼び出しにまたがって保持されるデータ
0492デフォルトの名無しさん
2007/06/14(木) 00:55:29ヒルベルト空間論というか量子力学で言うところの|ψ>じゃない?
つまり安直に状態とは可分なヒルベルト空間の元である〜。
でファンクタFを作用させるのはF|ψ>みたいに考えるといいのか。
(F 'join' F)|ψ> -> F|ψ>
てか?
exp(F) = 1 + 1/2! * F + 1/3! * F + 1/4! * F + ...
とかも考えたら面白そう。
0493デフォルトの名無しさん
2007/06/14(木) 01:06:26すこし頭を冷やして来い。
0494デフォルトの名無しさん
2007/06/14(木) 01:16:250495デフォルトの名無しさん
2007/06/14(木) 01:29:130496デフォルトの名無しさん
2007/06/14(木) 01:37:19一行目から最後まで。全て。
0497デフォルトの名無しさん
2007/06/14(木) 01:47:120498デフォルトの名無しさん
2007/06/14(木) 01:50:000499デフォルトの名無しさん
2007/06/14(木) 02:14:09何故“状態”の線形性を仮定してるの?
何故全ての関手が線形で、しかもドメインとコドメインが等しいことを仮定しているの?
何故各“状態”について内積が定義できることを仮定してるの?
joinのくだりは意味不明だからコメントを避けるが、
exp Fみたいな関数はhaskellではbotだし。
名前が似てるだけのものを混同してる。
0500デフォルトの名無しさん
2007/06/14(木) 02:22:140501デフォルトの名無しさん
2007/06/14(木) 08:04:01厳しい追求は可哀想。
0502デフォルトの名無しさん
2007/06/15(金) 03:19:56データ型を駆使するやりかたをおぼえたいっす。
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を取り出して非ゼロと判定してたのか。
0503デフォルトの名無しさん
2007/06/16(土) 22:35:35を評価すると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になっています。
0504デフォルトの名無しさん
2007/06/16(土) 23:10:08Prelude> 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
0505デフォルトの名無しさん
2007/06/16(土) 23:16:48型推論を終えた時点で数値の型が曖昧なときは、デフォルト化によって解決される。
どういう風にデフォルト化するかはdefault宣言で決めるんだが、宣言がないときは、
・できればInteger
・それがダメならDouble
・それがダメならエラー
という風になっている。最初の式の型は(Num a) => aだから、Integerが優先される。
log10の絡んだ式の型は(Floating a) => aで、Integerは適合しないから、第二候補のDouble
が使われる。Doubleには表現できる数に上限があるので、Infinityにもなる。
0506デフォルトの名無しさん
2007/06/17(日) 00:02:25ありがとうございます。駄目な理由は理解しました。
でも解決策がすぐに分からないような初心者なのでもう一回調べてみます。
どうもでした!
0507506
2007/06/17(日) 00:18:48floorLog10 :: Integer->Int
floorLog10 x = length (show x)
でうまくいきました。
floorLog10 ((iterate (*2) 1) !! 100000)
=> 30103
0508デフォルトの名無しさん
2007/06/17(日) 09:06:02data X a = T (X a -> a)
のようにx = x -> x という型を作れれば,不動点が作れるというのは何となく分かるんだけど
例えば右辺がどうしてX a -> aでa -> X a や X a -> X aではないのかとか ???
0509デフォルトの名無しさん
2007/06/17(日) 09:22:30$ 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 )
(固まる)
0510デフォルトの名無しさん
2007/06/17(日) 19:50:0312.2.1. Bugs in GHC
ttp://www.haskell.org/ghc/docs/6.6.1/html/users_guide/bugs.html#bugs-ghc
GHC's inliner can be persuaded into non-termination using the standard way to encode recursion via a data type
0511デフォルトの名無しさん
2007/06/20(水) 17:17:21回避策ってないんですかね。-O0でもダメだし
0512デフォルトの名無しさん
2007/06/22(金) 17:09:56比較する言語のマイナーさに驚いた
0513デフォルトの名無しさん
2007/06/24(日) 03:20:400514デフォルトの名無しさん
2007/06/24(日) 17:40:03無限に続くとはいえ結局使うのは有限個の要素なんだし、それなら最初から有限リストとしてしまえばいいのでは?
もしそうならCとかの遅延評価がない言語でも十分実装できるようになる
誰か無限リストでないと困るような例を教えてくれ
0515デフォルトの名無しさん
2007/06/24(日) 17:45:54リストの形で扱えるようにしたもの、じゃないの?
0516デフォルトの名無しさん
2007/06/24(日) 17:46:41例えば素因数分解のための素数リストとか。
0517デフォルトの名無しさん
2007/06/24(日) 19:43:57それでないと実現できないってのじゃなくて、
そういう形に抽象化して考えるってのに意義があるんだよ。
0518デフォルトの名無しさん
2007/06/24(日) 19:51:310519デフォルトの名無しさん
2007/06/24(日) 19:54:10最初から有限個の要素にするってことは、「どこで打ち切るか」の判断を
リスト生成関数に埋め込むことになるが、無限リストを使えばこれが分離出来る。
例えば、「素数を小さい方から千個求める」という操作と「千以下の素数を全て求める」という
操作をループで書いた場合、この二つの操作の共通部分を括り出すのが難しい。
一方、素数を小さい方から並べた無限リストprimesを使えば、この二つは
take 1000 primesとtakeWhile (<=1000) primesになって、素数生成の
部分は容易に共用出来たことになる。
0520デフォルトの名無しさん
2007/06/24(日) 19:59:45だから、そういう形に抽象化したら何が楽になるんだ?
0521デフォルトの名無しさん
2007/06/24(日) 20:10:480522デフォルトの名無しさん
2007/06/24(日) 20:13:24無限のリストをやるから、処理の方で必要な分だけ使え、ってほうが楽。
0523デフォルトの名無しさん
2007/06/24(日) 20:19:50遅延評価が働くかどうかっていうのをいつも意識の隅においてプログラミングしなきゃいけないなんて、
めんどくないか?
0524デフォルトの名無しさん
2007/06/24(日) 20:25:570525デフォルトの名無しさん
2007/06/24(日) 20:37:43普通の人は遅延評価の方が難しいだろう。
0526デフォルトの名無しさん
2007/06/24(日) 20:58:33そりゃ遅延評価に慣れない人には遅延評価の方が難しいだろう。
0527デフォルトの名無しさん
2007/06/24(日) 21:00:160528デフォルトの名無しさん
2007/06/24(日) 21:04:57そして、Haskellはもっと直観的な記法に取って代わられると予言してやろう。
0529デフォルトの名無しさん
2007/06/24(日) 21:07:10なぜそう思う?
というか何か主張するときは根拠も述べてくれ。
0530デフォルトの名無しさん
2007/06/24(日) 21:34:30根拠なんかないよ。
直観だ。
0531デフォルトの名無しさん
2007/06/24(日) 21:35:16同意
0532デフォルトの名無しさん
2007/06/24(日) 23:07:500533デフォルトの名無しさん
2007/06/25(月) 01:47:040534デフォルトの名無しさん
2007/06/25(月) 02:23:29んなことはない。込み入った機能をわざわざ使うにはそうだが、
ロジック自体はHaskell98の範囲で事足りる。
低レベル系のことを言ってるのなら、それは言語の問題ではなくライブラリの問題。
0535デフォルトの名無しさん
2007/06/25(月) 05:06:530536デフォルトの名無しさん
2007/06/25(月) 05:07:530537デフォルトの名無しさん
2007/06/25(月) 05:40:200538デフォルトの名無しさん
2007/06/25(月) 05:45:12Prolog50冊、Haskell2冊。一部言及された書物の数でも似た
ようなものだ。
出版物の意味が変わってしまった、というだろうか。
0539デフォルトの名無しさん
2007/06/25(月) 05:48:57アローの本か?
0540538
2007/06/25(月) 05:52:270541デフォルトの名無しさん
2007/06/25(月) 07:26:210542デフォルトの名無しさん
2007/06/25(月) 07:32:42という時代ではないんだね。
0543デフォルトの名無しさん
2007/06/25(月) 16:17:590544デフォルトの名無しさん
2007/06/25(月) 16:47:40>Prolog50冊
これの影響で増えただけじゃないの?
http://ja.wikipedia.org/wiki/%E7%AC%AC%E4%BA%94%E4%B8%96%E4%BB%A3%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF
0545デフォルトの名無しさん
2007/06/25(月) 21:46:27そうなんですが。
1980-90年代にPrologが担おうとした役割を今人はHaskellに
求めているという事情がある。Prologの書籍の過半がAIに
言及し、そのコードの基礎を示していることなどを考えると
やはり、現在の日本のHaskell出版物の状況は寒い。
0546デフォルトの名無しさん
2007/06/25(月) 21:51:03>1980-90年代にPrologが担おうとした役割
って何?
Haskell って事は AI に特化した事じゃないんだよね?
0547デフォルトの名無しさん
2007/06/25(月) 22:09:070548デフォルトの名無しさん
2007/06/27(水) 09:39:14Haskellというか関数型言語は蛸壺内の内輪ネタに終始しているな。
0549デフォルトの名無しさん
2007/06/27(水) 21:12:44俺もそのひとりだ
0550デフォルトの名無しさん
2007/06/27(水) 21:16:360551デフォルトの名無しさん
2007/06/27(水) 23:01:06それが計算機科学者。
0552デフォルトの名無しさん
2007/06/27(水) 23:13:180553デフォルトの名無しさん
2007/06/27(水) 23:24:270554デフォルトの名無しさん
2007/06/27(水) 23:44:15あたりまえでしょ?
数学者はn次元の公式を渡して、物理学者は3次元の公式をほしがるんだ。
0555デフォルトの名無しさん
2007/06/27(水) 23:49:450556デフォルトの名無しさん
2007/06/28(木) 05:09:320557デフォルトの名無しさん
2007/06/28(木) 06:24:34Haskellじゃ何がメリットなのかも理解されず世間へのハッタリもかませない。
金儲けには全く向いてないな。
学者のみなさん、
Haskellだとどんな所がおいしいとか、俺に説明してみてください。
0558デフォルトの名無しさん
2007/06/28(木) 06:43:300559デフォルトの名無しさん
2007/06/28(木) 11:50:400560デフォルトの名無しさん
2007/06/28(木) 13:50:24→ある種のバグはこれで撲滅できる。メンテナンス性もまずまず。
多相性による再利用性の向上。型推論による簡潔な記述。純粋関数的なreasoningの容易さ。
→より短期間でプログラムを開発できる。
工学的に申し分ない言語じゃないか。
Prologなど比較にならんわ。
あ、lazinessはうんこ。
0561デフォルトの名無しさん
2007/06/28(木) 15:26:19遅延評価をやめるなら最低限遅延リストの代替が欲しい。
0562デフォルトの名無しさん
2007/06/28(木) 15:27:100563デフォルトの名無しさん
2007/06/28(木) 16:45:25そんな八方美人はみんなから嫌われます
0564デフォルトの名無しさん
2007/06/28(木) 16:59:490565デフォルトの名無しさん
2007/06/28(木) 17:00:510566デフォルトの名無しさん
2007/06/28(木) 17:04:13それは現状でもできる。
>>565
イラネ
0567デフォルトの名無しさん
2007/06/28(木) 17:09:58そういう言語は人気ないだろ
0568デフォルトの名無しさん
2007/06/28(木) 17:22:13main = print $ reflect( @[1, 2] + @[3, 4] )
で[4, 5, 5, 6]が表示されるとか、
main = reflect( @(writeFile (@getHomeDirectory ++ "/test.txt") @getContents) )
とか。
0569デフォルトの名無しさん
2007/06/28(木) 17:24:24Haskell の人気があるとでも?
0570デフォルトの名無しさん
2007/06/28(木) 17:36:15それを捨てたら意味ない気がする。
まあ確かにreasoningがしやすいという側面もあるんだろうけれど、
遅延評価を捨てた時点で、unsafeIOを使いまくるやつ続出な希ガス
0571デフォルトの名無しさん
2007/06/28(木) 17:38:21その構文は何?読めん。
reifyならtemplate haskellにあるけど
0572デフォルトの名無しさん
2007/06/28(木) 17:58:33Haskellは筋が通ってるから大衆人気はなくとも、この方面からは権威ある言語として認められている。
0573デフォルトの名無しさん
2007/06/28(木) 18:17:29reflectじゃなくて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はたぶん直接は関係ない。
0574デフォルトの名無しさん
2007/06/28(木) 18:46:45以下文章を上記翻訳サイトにて中→日にせよ
スゲиシギゝ,ザァ,ユЮ.
θイ,ゎモモモモマいデ.
びデた,ゝС,さーモモモモデゝねг
0575デフォルトの名無しさん
2007/06/28(木) 18:49:24do構文よりもさらに直観的かもしんない。
構文糖として実装する場合、liftMやらliftMnやらを色々と埋め込む実装になるんだろか。
reify( @[1, 2] + @[3, 4] )
は、
let x +? y =liftM2 (+) x y in [1,2] +? [3,4]
みたいな感じで。
liftMの埋め込みが決定可能かどうかは知らない。
0576デフォルトの名無しさん
2007/06/28(木) 19:31:45歴史的にはそうなんだろうが、今となっては遅延評価が足を引っ張ってるような。
でもHaskellが遅延評価を捨てることはないだろうから別言語ってことになるんだろうな。
unsafe IOは使いたい奴には使わせとけば良いんじゃないかと。
0577デフォルトの名無しさん
2007/06/28(木) 19:35:01とても見やすいとは思えないな
0578ヒゲメガネ
2007/06/28(木) 19:38:45お前がHaskellに慣れてないだけ。こんなもん大学学部生でもすぐに読めるようになる。
表面的な構文なんぞに拘る人は一生JavaかPerlでも使っててください。
0579デフォルトの名無しさん
2007/06/28(木) 19:51:52知識の浅さが垣間見えて仕方がない。
0580デフォルトの名無しさん
2007/06/28(木) 19:52:29別に見にくいとは思わない。
ただ、個人的には読みやすさよりも書きやすさがHaskellの魅力だと思う。
>>578
表面的な構文は重要だろ…
中括弧とセミコロンが必須だったらここまで好きにはならなかった。
0581デフォルトの名無しさん
2007/06/28(木) 19:53:15俺はレイアウト構文をやめてほしいがな。
0582デフォルトの名無しさん
2007/06/28(木) 19:56:39なんで?明示的に区切るのでは駄目?
0583デフォルトの名無しさん
2007/06/28(木) 20:02:47たとえば、do{・・・;・・・;}は許されるのに、case ・・・ of {・・・;・・・;}は許されない。
0584デフォルトの名無しさん
2007/06/28(木) 20:03:43あまりにも無益。
どちらかといえばDRY原則とかに拘るほうがまだ有益。
確かにfunction f x = などと定義するのはキモイような気もするが、それも慣れだ。
たとえば(functionよりはちと短いが)ML系ではいちいち関数の前にlet とかrecとかvalだとかを付けるわけだが、それに文句を言う奴など居ない。
0585デフォルトの名無しさん
2007/06/28(木) 20:14:03通ったけど。
Prelude> case 4 of {0 -> 2; 4 -> 4;}
4
>>584
>>578が重要でないと言ったからそれに反論しただけ。
別に構文の詳細について議論する気はない。
主観的には間違いなく重要な点なのでこれもどうしようもない。
0586デフォルトの名無しさん
2007/06/28(木) 20:15:08許されますが
ghci> case 1 of{0->0;1->1;x->x;}
1
0587デフォルトの名無しさん
2007/06/28(木) 20:15:09haskellだと、どこチューニングすれば速くなるとかがよくわからん
「慣れてない」の一言で済ませるのは簡単でいいやね・・・
0588デフォルトの名無しさん
2007/06/28(木) 20:19:44だからプロファイラとかがあるわけで。
オーダーを改善することくらいなら何も考えずできるだろうけど。
つか、上の人は「読みやすさ云々は慣れの問題」と言っただけじゃねーの
0589デフォルトの名無しさん
2007/06/28(木) 20:19:47それも慣れればかなりできるようになる。
ただ、Haskellのチューニングは少し特殊で、通常の言語の扱いに
慣れただけではうまくできないことが多い。
http://www.haskell.org/haskellwiki/Performance
このへん参照。
0590デフォルトの名無しさん
2007/06/28(木) 20:20:590591589
2007/06/28(木) 20:21:080592デフォルトの名無しさん
2007/06/28(木) 20:25:27Cほどじゃないが、それなりに支持された書き方ではあるはず
0593デフォルトの名無しさん
2007/06/28(木) 20:46:48どのコンパイラだ
0594デフォルトの名無しさん
2007/06/28(木) 20:50:19ghci 6.4.2
0595デフォルトの名無しさん
2007/06/28(木) 20:51:13Hugs> case 1 of {1->1;x->x;}
1
つかHaskellの言語仕様でそ。コンパイラがどうのよりも
0596デフォルトの名無しさん
2007/06/28(木) 21:06:32それなんてインタプリタ?
0597デフォルトの名無しさん
2007/06/28(木) 21:08:520598デフォルトの名無しさん
2007/06/28(木) 21:12:460599デフォルトの名無しさん
2007/06/28(木) 21:15:04それくらい試せよ。
0600デフォルトの名無しさん
2007/06/28(木) 21:16:03> 意味に影響を与えるレイアウトは、そのレイアウトによって決定される場所にブレースとセミコロンを付け加えることによって、完全に記述することができる。
Haskell98 の仕様なんだが……
0601デフォルトの名無しさん
2007/06/28(木) 21:23:35こんなパイソンみたいな書き方キモすぎる。
どっちかに統一せえや。
0602デフォルトの名無しさん
2007/06/28(木) 21:49:190603デフォルトの名無しさん
2007/06/28(木) 22:06:240604デフォルトの名無しさん
2007/06/28(木) 23:48:280605デフォルトの名無しさん
2007/06/29(金) 00:45:30わかりやすいし無駄がない
人間はアホだから、機械と違ってインデントしねーとコード嫁ねーし、
理にかなってるわ
0606デフォルトの名無しさん
2007/06/29(金) 00:49:22さて流れに逆らって低レベルな質問
(1)コマンドライン引数を2つ以上取得したいときはどうすんの?
getArgsではできないの?
(2)main = do cs <- getContents
Moge cs
Moge :: Int -> String
-- 以下略
こんなふーなプログラム書いてみたら、「csはStringじゃなきゃダメよ」って感じで
怒られたんだけど、StringをIntに変換する単純な関数ないの?
0607デフォルトの名無しさん
2007/06/29(金) 00:50:300608デフォルトの名無しさん
2007/06/29(金) 01:05:03(1) getArgsでは引数の配列が得られる。
-- 引数を表示するプログラム
import System
main = getArgs >>= mapM_ putStrLn
(2) String -> Int ができる関数としては read がある。
例えば
hoge :: Int
hoge = read "1234"
とすればhogeは1234。
出力の型に変換できないような入力文字列だった場合はエラーが起きる。
0609606
2007/06/29(金) 01:34:21なるほろろ
どーりで、「toInt」とか「int」でホグってもでてこないわけだ
型を見ると、
Prelude. read :: Read a => String -> a
これはintじゃなくてもできるの?
read "True"
read 'c'
ってやってみると、「no parse」ってエラーになった
0610デフォルトの名無しさん
2007/06/29(金) 02:12:45hoogleで「String -> 」とかでふぐれ。
0611デフォルトの名無しさん
2007/06/29(金) 05:17:30Intじゃなくてもできる。例えば、
if read "True" then 1 else 0
なら、文脈からBoolが要求されているので、Boolとして読む。
要求する型を明示するには、
read "True" :: Bool
みたいに書く。
0612デフォルトの名無しさん
2007/06/29(金) 22:01:07main = 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を副作用なしで書く方法ある?
0613デフォルトの名無しさん
2007/06/30(土) 12:57:16せめてSystem.IOモジュールの一覧くらい眺めてみたらどうだ
0614デフォルトの名無しさん
2007/06/30(土) 14:40:25import 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
関数の中では、型変数の型は一つしかとれないということなのかな・・・?
こういう場合はどうしたらいいんだろう。
0615デフォルトの名無しさん
2007/06/30(土) 14:47:49型クラスつかえ
0616デフォルトの名無しさん
2007/06/30(土) 17:09:33わかってないなら、無理に返事しなくてもいいよ
0617デフォルトの名無しさん
2007/06/30(土) 18:37:52hGetContentsは副作用に頼って遅延IOを実現している訳だが、
リストの代わりに専用のデータ構造を使えば、似たようなスタイルを副作用なしで
実現できないだろうか、という話。
0618デフォルトの名無しさん
2007/06/30(土) 19:09:20hGetContents が遅延 IO を実現しているのは、副作用うんぬんとは関係がな
い。というか、遅延しない IO にも副作用が必要なわけで、その書き方だと
「副作用に頼らずに IO を実現したい」と言っているように見える。
どうも unsafeInterleaveIO を探しているという話に思えるんだけど、どうですか。
もしくは Streams か SSC を見てみてもいいかも。 Streams にそういう操作が定義されていたかどうかは覚えていないが。
0619デフォルトの名無しさん
2007/06/30(土) 19:09:59型による分岐にはData.Typeable.castを使う。
ただ、動的に分岐するより、>>615の言う通り型クラスで静的に型を決める方が普通。
0620デフォルトの名無しさん
2007/06/30(土) 19:21:43俺が副作用と言ったのはまさにunsafeInterleaveIOのこと。
「副作用に頼らずに」のところは「unsafeInterleaveIOに頼らずに」と読み替えてくれ。
>遅延しない IO にも副作用が必要なわけで
ふつうの(遅延しない)IOモナド上の操作は参照透過で副作用はない、という立場で書いた。
0621デフォルトの名無しさん
2007/06/30(土) 20:25:40>わかってないなら、無理に返事しなくてもいいよ
少なくともここまでで意図が誰にも伝わってないと思うのだがどーよ。
へたれ仮想コードで解れという方が無理な話。
で、フタを開けてみれば…>>620みたいな馬鹿が出てきたのか。
0622デフォルトの名無しさん
2007/06/30(土) 20:46:230623デフォルトの名無しさん
2007/06/30(土) 21:42:01ああそういうことか。
出来るか出来ないかでいえば大して難しくないだろう。でも標準にはないね。
いまちょっと Streams を見てみたが Streams にもそういう仕組みはないようだ。
0624デフォルトの名無しさん
2007/06/30(土) 21:54:55r;;;;;ノヾ / ̄ ̄ ̄ ̄ ̄
─ ヒ‐=r=;'< ひざまずけ!
'ヽ二/ \______
/ │ \
r;;;;;ノヾ
r;;;;;ノヾ ∩ ヒ‐=r=;'∩ / ̄ ̄ ̄ ̄ ̄ ̄
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄\ ∩ヒ‐=r=;'∩\'ヽ二/< 命乞いをしろ!
>>621から石を取り戻せ! > 'ヽ二/ / | / \________
__________/ | 〈 | |
/ /\_」 / /\」
 ̄ / /
 ̄
0625612
2007/06/30(土) 22:30:38まとめてたら効率の悪い実装を思いついたので、それも書いた。
0626デフォルトの名無しさん
2007/06/30(土) 23:48:570627デフォルトの名無しさん
2007/07/01(日) 00:01:45易しく解説してください。
0628621
2007/07/01(日) 01:04:44newtype Stream a = Stream (IO (Maybe (a, Stream a)))
これって意味あるんか?
IOを別の型として再定義しただけでしょ?駆動するのに専用の関数が必要ならあんまり意味が無い希ガス
せめてmonadにしてみるとか。あ,そしたら単にIO monadの(ほぼ)再定義になるだけか。
0629デフォルトの名無しさん
2007/07/01(日) 07:34:07型の再帰が必要なのでその定義は必須。
後で抽象データ型として扱うために名前を付けておくという意味もある。
0630デフォルトの名無しさん
2007/07/01(日) 08:10:53>>627
ちょっと前にだけど書いてみた。
ttp://www.aya.or.jp/~takuo/arrow_for_2ch/arrow_for_2ch.pdf
Monadを少しは知ってる人向けのArrowの紹介。
今見てみると、もう少し具体例とか使い方とか書いたほうが良かったと思うけどせっかく書いたので。
0631デフォルトの名無しさん
2007/07/01(日) 09:33:09GJ!
Arrowは少しは知ってたけど、おかげでArrowApplyとMonadの関係が分かった。
0632614
2007/07/01(日) 11:24:15>>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"
つづく
0633614
2007/07/01(日) 11:25:15String(または[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'
もっと標準的なやり方があるのかな?
0634デフォルトの名無しさん
2007/07/01(日) 11:53:47それはどうしようもない。一応、例えば
instance Hoge Char
instance (Hoge a) => Hoge [a]
の二つを用意できれば、Haskell98の範囲で書けたことになるけど。
0635614
2007/07/01(日) 16:55:46なるほろ。ありがとう。
haskellって使いにくいなぁ、って思うことがよくあるんだけど、今回の件のように、俺がまだ使いこなせてないだけなんだろうなぁ。
もっと精進せねば。
0636614
2007/07/01(日) 16:56:34635は633へのレスじゃなくて634ね。
0637デフォルトの名無しさん
2007/07/01(日) 17:02:42いや、実際にHaskellは使いにくいと思う。
2年ぐらいHaskellを使っているが、いまだにHaskellがJavaとかcamlとかより使いやすいと感じたことはない。
0638デフォルトの名無しさん
2007/07/01(日) 20:30:000639デフォルトの名無しさん
2007/07/01(日) 21:40:040640デフォルトの名無しさん
2007/07/01(日) 22:21:22arrowって圏論の射のことだろ?
0641低級プログラマー(Java)
2007/07/03(火) 00:23:50import System
main = do cs <- getArgs
putStrLn $ map toUpper cs
__ , -------- 、__
, - ':::::::::::::::::::::::::::::::::::::::::\
/ ;;;;;;;::::::::::::::::::::::::::::::::;;;;;;;;;;;;;;\
/,,;,,,,, ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ,,,,,,,;:::丶
/ :::::::::;;,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,;:::::::::::::::ヽ
i゙:::;:::::||::::::ii:::::::::::||::::::::::::::::::;:::::::::::::::::::::::::::゙i
i゙::::|;;;;| |;;;;| |::::::::::| |:::::::::::::::::||:::::::::::::::::::::::::::::|
. i゙::::::i ''''''''''' '───' |;;;;;;;;;;::::::::::::::::::::|
.|:::::::|,-====-´ ゙ヽ,,,,,,,,,,,,、 |:::::::::::::::::::|
|;::::::::|,-----、 ~ニニ,,_` |:::::::::::::::::::|
`ヽ、i (、i´ノ ´い,, ノ ' |;;;::::::::::::::/ なんで、エラーすぐ出るん?
. i ^~~~ー==-- ー'-+、 / ゙-、;;;;/
{ ヽゝ '-'~ノ
λ ''゙゙゙'''-''---、 /-'^
ヽ, ^~^ (
/ `丶 、 , - /^l
| /( ノ `''''''´~ __, - ' ゙i、
{ / /| ̄ ̄ ̄ ̄ _,- '¨ }
{/ / ゙ー────'~ \|
/ ヽ \
0642低級プログラマー(Java)
2007/07/03(火) 00:26:34print $ Char.ord '1'
ってやると49が帰ってくるんですが、どういう仕様ですか先生。
0643デフォルトの名無しさん
2007/07/03(火) 00:34:50getArgs は IO [String]
>>642
そういう仕様
0644デフォルトの名無しさん
2007/07/03(火) 00:46:18↓の記事を見つけたのですが、いきなりモナドとか知らん用語が連発でなんというか、全速力で置いていかれました。
http://itpro.nikkeibp.co.jp/article/COLUMN/20060801/244812/
もっとヘタレ向けの入門記事を…何かオヌヌメの記事はないでしょうか?
0645デフォルトの名無しさん
2007/07/03(火) 19:59:040646デフォルトの名無しさん
2007/07/03(火) 20:54:520647デフォルトの名無しさん
2007/07/03(火) 20:55:350648デフォルトの名無しさん
2007/07/03(火) 21:19:140649デフォルトの名無しさん
2007/07/03(火) 21:20:280650デフォルトの名無しさん
2007/07/03(火) 22:29:23|・ω・`)つ『ふつうのHaskellプログラミング』
0651低級プログラマー(Java)
2007/07/03(火) 23:47:45---
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
0652デフォルトの名無しさん
2007/07/04(水) 00:06:46そら "Nothing" は Int じゃないやろ。
0653デフォルトの名無しさん
2007/07/04(水) 00:12:53コンパイラの中の人は、多分こんな判断をしてる。
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だと注釈を付けている。
さて、これを満たすような型は…
と探して見つからなかったからコンパイルエラーになってる。
0654低級プログラマー(Java)
2007/07/04(水) 00:54:05もうこんなふうにしてみました。全然ダメ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
0655デフォルトの名無しさん
2007/07/04(水) 01:28:34print $ quad_from (10, 20 ,30, 40) $ (read (head args) :: Int)
にすればOK(最後の括弧)。
0656デフォルトの名無しさん
2007/07/04(水) 01:38:02:: Int ってのがあれだと範囲ひろすぎちゃったのね
サンクス
0657デフォルトの名無しさん
2007/07/04(水) 02:00:20C/C++系は遅延評価が無いことによる再帰記述への躊躇さを言い訳にした本当の低脳が使う言語
0658デフォルトの名無しさん
2007/07/04(水) 03:40:41ついでにPrologもお願いします。
0659デフォルトの名無しさん
2007/07/04(水) 05:52:41haskellの処理系作ってる人あまりいないっしょ
0660デフォルトの名無しさん
2007/07/04(水) 07:17:02その例では「:: Int」の部分は要らない。
(quad_fromの第二引数になっている時点でIntだと分かるので)
念のため。
0661デフォルトの名無しさん
2007/07/04(水) 12:20:59こいつはいい。GJ
ところで、ArrowLoopについても解説願えないかな…?
あれ全然わかんない。
0662デフォルトの名無しさん
2007/07/04(水) 12:53:04ArrowApplyの図ってこんな感じで良いんじゃないかと思う。
内側にarrowが入るスロットがあって、第二引数はそのスロットの入力に繋がってる。
┌───┐
f─┼─┐ │
│ ↓ │
│┏━┓│
b─┼┨ ┠┼→
│┗━┛│
└───┘
0663デフォルトの名無しさん
2007/07/04(水) 14:09:24それだとappの中にarrowが静的にあるような感じになってしまっていまいち。
中のarrowを点線にするといいかもしれません。
でもやっぱり現時点ですと─|と→|はどちらもarrowに入力する、という意味なので統一できなそうです。
0664デフォルトの名無しさん
2007/07/04(水) 14:17:010665デフォルトの名無しさん
2007/07/04(水) 15:34:060666デフォルトの名無しさん
2007/07/04(水) 16:03:410667デフォルトの名無しさん
2007/07/04(水) 17:13:37俺 『うっせえよ毛唐、英語が世界の共通語とかナチュラルに思ってんじゃねえよ』
外人 『hmm…』
俺 『Fack you』
外人 『oh』
外人 『miss spell』
外人 『Fuck you』
俺 『Fuck you』
外人 『good!』
その後、一緒に冒険に出かけ、友人になった
0668630
2007/07/04(水) 19:15:00つまり、KlisliArrow (ArrowMonad a) は a と等価であるらしい。
細かい証明は載ってないのでArrow則から証明しようと思ったら途中で力尽きた。
圏論に関する知識があるともっと簡単に証明できるんだろうか。
とりあえず後で修正しときます。
0669デフォルトの名無しさん
2007/07/05(木) 01:49:52訂正するならついでに MonadLoop も MonadFix に……
0670デフォルトの名無しさん
2007/07/05(木) 02:08:50フォント何つかってんの?
MacでHaskellしてんの?
0671デフォルトの名無しさん
2007/07/05(木) 02:37:18takuoはVista使い。PDFもAdobe製品で吐いてる。
0672デフォルトの名無しさん
2007/07/05(木) 03:37:57了解しました。
>>670
イラレ買ったら付いてくる小塚ゴシックです。
0673低級プログラマ(Java)
2007/07/06(金) 02:36:54main = 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" | | |
0674デフォルトの名無しさん
2007/07/06(金) 02:43:28ところで、この文章しょっちゅう見かけるんだけど、うまく翻訳できません。
「Char型が推論されたが不可で、String型が期待されたが、マッチできなかった。」
"美しい"日本語を見せてくれませんか。
0675デフォルトの名無しさん
2007/07/06(金) 02:43:53unlinesいらないじゃん
0676デフォルトの名無しさん
2007/07/06(金) 02:53:23map :: (a -> b) -> [a] -> [b]
な、なぜだ・・・
map 使うとリストが返ってくるから、 unlines しなきゃいけないんじゃないのか・・・
OTL
0677デフォルトの名無しさん
2007/07/06(金) 02:56:200678デフォルトの名無しさん
2007/07/06(金) 03:01:25toUpper が Char -> Char で String が [Char] なんじゃないの?
0679デフォルトの名無しさん
2007/07/06(金) 03:02:22それで十分説明されてると思うけど。
0680デフォルトの名無しさん
2007/07/06(金) 03:03:110681デフォルトの名無しさん
2007/07/06(金) 03:05:09■GHCiでいま実行してみた
Prelude> Char.toUpper "abc"
"ABC"
えーと、そうか・・・
map :: (a -> b) -> [a] -> [b]
これを見て、この場合は安易にStringのリストが帰ってくると思い込んでたのか・・・
Charのリスト(=String)が返ってくるのかこの野郎ぅ
0682デフォルトの名無しさん
2007/07/06(金) 03:08:45ということを、おぼえました
おやすみ
0683デフォルトの名無しさん
2007/07/06(金) 03:13:390684デフォルトの名無しさん
2007/07/06(金) 08:05:17http://www.haskell.org/visualhaskell/
0685デフォルトの名無しさん
2007/07/06(金) 08:11:56型Stringが期待されているが、推論されたのは型Charで、マッチできなかった。
0686デフォルトの名無しさん
2007/07/06(金) 09:41:54日本語のお勧めの本てあるでしょうか?
>コンピュータサイエンス入門 アルゴリズムとプログラミング言語 (大堀 淳 他)
とりあえずこの本は持ってるんですが、
後半が難しいんで、長い間放置してました。
最近また気になりだして、下の本でλについて勉強やり直そうと思います。
>計算論 計算可能性とラムダ計算 (高橋 正子)
他に手に入る良い本があったら教えてください。
数式沢山出てくるとかより、実装寄りの本がありがたいです。
0687デフォルトの名無しさん
2007/07/06(金) 13:58:180688デフォルトの名無しさん
2007/07/06(金) 14:42:360689デフォルトの名無しさん
2007/07/06(金) 14:50:41googleのツールのところにyoutubeが新しく入ってるんだけど、youtubeってgoogleのサービスだったの?
0690デフォルトの名無しさん
2007/07/06(金) 15:04:290691デフォルトの名無しさん
2007/07/06(金) 15:05:180692デフォルトの名無しさん
2007/07/06(金) 15:25:40mapが抜けてまつよ。
Prelude> map Char.toUpper "abc"
"ABC"
0693デフォルトの名無しさん
2007/07/06(金) 18:27:250694デフォルトの名無しさん
2007/07/06(金) 19:04:09strToInteger = (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 の前に確実に表示されるように
するにはどうすればいいでしょうか?
0695デフォルトの名無しさん
2007/07/06(金) 19:20:39stdoutをflushするんだ
0696デフォルトの名無しさん
2007/07/06(金) 19:21:17import 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 ) )
0697デフォルトの名無しさん
2007/07/06(金) 22:38:510698デフォルトの名無しさん
2007/07/06(金) 22:50:00Haskellの弱点を取り上げた解説本が欲しいな。
「Haskellでうまくいかない1000の理由」とか。
0699デフォルトの名無しさん
2007/07/06(金) 22:55:05ちょっ、1000もあるのかよw
0700デフォルトの名無しさん
2007/07/06(金) 23:25:470701デフォルトの名無しさん
2007/07/07(土) 06:50:070702デフォルトの名無しさん
2007/07/07(土) 06:57:13http://www.cin.ufpe.br/~haskell/haskelldotnet/
プロジェクトは止まってるっぽいけど。
0703デフォルトの名無しさん
2007/07/07(土) 14:15:140704デフォルトの名無しさん
2007/07/07(土) 15:50:29やめてほしい
0705デフォルトの名無しさん
2007/07/07(土) 19:06:580706デフォルトの名無しさん
2007/07/07(土) 19:35:15お嬢さん、ワシといっしょにH(askell)せんか?
0707デフォルトの名無しさん
2007/07/07(土) 19:40:540708デフォルトの名無しさん
2007/07/07(土) 19:52:570709デフォルトの名無しさん
2007/07/07(土) 20:12:000710デフォルトの名無しさん
2007/07/07(土) 20:31:360711デフォルトの名無しさん
2007/07/07(土) 20:36:18・根本的に実行効率が良くないのは弱点だろう。
・あとはかなり言われているけど、モジュールシステムが貧弱。
・型クラスとモナド、高階な型が合わさって複雑になりがちで初学者には敷居が高い。
(複雑になっても型付きのおかげでバグが混入することは少ないのだけど。)
・多バイト文字の扱いが非常に貧弱。
・純粋関数的でグローバル変数や状態が書きづらいのでモジュール性だとかメンテナンス性が低くなりがち。
リファクタリングツールが充実すればある程度はなんとかなるのだけれど。
・データや「もの」を中心にしたプログラミング(オブジェクト指向のような)ではなく
処理を中心にしたプログラミングなため、従来のプログラマの直観に合わない。
・Javaや、Rubyのような軽量言語と違い現実のプログラミングにすぐ適用できるフレームワークやライブラリがない。
あっても型による技巧に走りがちで習得に時間がかかったりする。
・能力がそこそこなプログラマを多数雇うような開発形態には圧倒的に不向き。
(モダンな関数型言語はすべからくそうなるだろうが)
0712デフォルトの名無しさん
2007/07/07(土) 20:39:51モジュールシステムはトップダウンだが、型クラスは必要に応じて使うために必然的にボトムアップになり、大まかなコードの把握には向かないというか。
0713デフォルトの名無しさん
2007/07/07(土) 21:18:35・型レベルの計算が書きにくい。
・GHCの出力がLGPLのlibgmpに依存している。
0714デフォルトの名無しさん
2007/07/07(土) 21:55:090715デフォルトの名無しさん
2007/07/07(土) 21:57:41Debug.Trace使え。
もしくはunsafePerformIO
0716デフォルトの名無しさん
2007/07/07(土) 22:27:22だれうま
0717デフォルトの名無しさん
2007/07/07(土) 22:28:29遅延評価が役にたつような
0718デフォルトの名無しさん
2007/07/07(土) 22:35:57賽の河原の石積み
0719デフォルトの名無しさん
2007/07/07(土) 22:54:08それでもHaskell自体に慣れる必要があるが
0720デフォルトの名無しさん
2007/07/08(日) 09:12:10最高の応用先だな
0721デフォルトの名無しさん
2007/07/08(日) 15:41:48SADでも必死に会社に行っている人 [メンタルヘルス]
圏論 / カテゴリー論 / Category Theory 3 [数学]
お前らも大変だな
0722デフォルトの名無しさん
2007/07/08(日) 15:47:14アイドルマスターは、遅延評価がほにゃららみたいなことを言ってた
http://www.youtube.com/watch?v=IOKtbRNl1SM&mode=related&search=
要は、曲に合わせて、キャラクターが自動的に判断して踊ると。
0723デフォルトの名無しさん
2007/07/08(日) 19:28:410724デフォルトの名無しさん
2007/07/08(日) 21:24:500725デフォルトの名無しさん
2007/07/08(日) 21:26:25>・型レベルの計算が書きにくい。
そんなのが書き易い言語ってこの世に存在するのか?CoqとかAgdaとか?
0726デフォルトの名無しさん
2007/07/08(日) 21:46:59念頭にあったのはC++。
0727デフォルトの名無しさん
2007/07/09(月) 03:03:50素人なりにHaskellでいくつかプログラムを書いてみて
これはかなり不便に感じた。
あとになって参照したい設定項目が増えたときなんか
Haskellじゃなかったら修正楽だろうなって思うこと多々。
0728デフォルトの名無しさん
2007/07/09(月) 03:43:08モジュール性だとかメンテナンス性の向上を研究してるはずなのに
これ↓じゃ意味無いじゃん
> ・純粋関数的でグローバル変数や状態が書きづらいのでモジュール性だとかメンテナンス性が低くなりがち。
0729デフォルトの名無しさん
2007/07/09(月) 03:54:300730デフォルトの名無しさん
2007/07/09(月) 04:12:00あればいいなあ、という段階
0731デフォルトの名無しさん
2007/07/09(月) 05:02:22型を書くのが面倒になるから俺は使ってないけど。
0732デフォルトの名無しさん
2007/07/09(月) 08:56:03>・純粋関数的でグローバル変数や状態が書きづらいのでモジュール性だとかメンテナンス性が低くなりがち。
は、
>731とか、あとは適切な抽象データ型で隠蔽する(=他のプログラミング言語と同じで)、ってのが正解だと思って書きました。
たとえばある関数で別の場所にある変数が必要になった場合、implicit parameterで渡すってのはかなりやりやすいと思います。
もしくは、適切に定義した抽象データ型を使いまわしているならば、そのコンストラクタにフィールドを一つ追加すればOKになるはず。
純粋関数的な枠組みはメリットも多いのではないかな、…たとえばリファクタリングがゴリゴリできるとか(HaReとか
0733続き
2007/07/09(月) 09:04:41Haskellプログラマは抽象データ型を使ってモジュール性を高く設計するようになるんじゃないかなーと思ってます。
『モジュラープログラミング養成ギプス』という感じで。
純粋関数的な枠組みに制限されているためにバグが減るのと似たような感じ。
もちろん、アドホックにグローバルな状態を追加できる他言語で開発したほうが、短期的には使い易くなると思うけれど。
0734続き
2007/07/09(月) 09:15:32たとえば純粋関数fに状態を入れる場合は、
純粋関数 (f :: ... -> X) の型を (f :: ... -> IO X) とか (f :: ... -> State s X) に修正する必要がある。
0735デフォルトの名無しさん
2007/07/09(月) 18:53:520736デフォルトの名無しさん
2007/07/09(月) 20:48:460737デフォルトの名無しさん
2007/07/09(月) 22:03:310738デフォルトの名無しさん
2007/07/09(月) 22:09:420739デフォルトの名無しさん
2007/07/09(月) 22:25:560740デフォルトの名無しさん
2007/07/09(月) 23:05:32戦時のアメリカだな
0741デフォルトの名無しさん
2007/07/10(火) 00:01:320742デフォルトの名無しさん
2007/07/10(火) 00:06:230743デフォルトの名無しさん
2007/07/10(火) 09:44:05ついていけないオワタ\(^o^)/
0744デフォルトの名無しさん
2007/07/10(火) 12:36:340745デフォルトの名無しさん
2007/07/10(火) 12:43:27俺は Another junior Haskell programmer か・・
0746デフォルトの名無しさん
2007/07/10(火) 13:07:160747デフォルトの名無しさん
2007/07/10(火) 19:19:41変わられるのでは。無限リストはメモリ馬鹿食いするからやってられない。
def fib():
a = b = 1
while True:
yield a
a,b = b, a+b
for n in fib(): print n # フィボナッチ数列
遅いし
ライブラリ少ないし
英語必須だし
デバッグしづらいし
デバッグしづらいし
まあ、haskell学習中の八つ当たりの書き込みですけど。
0748デフォルトの名無しさん
2007/07/10(火) 19:33:26それに速さを追求しながらPythonを使うというのもおかしな話。
0749デフォルトの名無しさん
2007/07/10(火) 20:58:17無知丸出しだな
0750デフォルトの名無しさん
2007/07/10(火) 22:02:24試してないけど。
0751デフォルトの名無しさん
2007/07/11(水) 03:30:05あほか
遅延評価なめるな
0752デフォルトの名無しさん
2007/07/11(水) 12:30:58ところで『ふつうのHaskellプログラミング』と『入門Haskell』
を読み終えたので次の学習対象を探していたところ、
『An Introduction to Functional Programming Systems Using Haskell』
を図書館で見つけたのですが、誰か読んだ経験のある人、
今の段階の学習レベルとしてこの本は適切だと思われますか?
0753デフォルトの名無しさん
2007/07/11(水) 12:42:34入門Haskell、ふつうのHaskell読んだならAn Intro...は内容が重複しているから読まなくてもよさそうな気がする。
それよりもライブラリの方をよく勉強した方がいい。
というのは、Haskellのライブラリの場合はCのライブラリとかと違って使いやすさとかそういうのよりも、
数理理論面の方が強いから、実装のしかたとかが独特で勉強になると思うよ。
0754デフォルトの名無しさん
2007/07/11(水) 12:44:38Scrap your boilerplateなどの論文も読んでみるといい。
Allows関連も勉強してみるといい。
0755デフォルトの名無しさん
2007/07/11(水) 12:47:580756デフォルトの名無しさん
2007/07/11(水) 18:36:36Allows
Allows
Allows
Allows
0757デフォルトの名無しさん
2007/07/11(水) 18:48:560758デフォルトの名無しさん
2007/07/11(水) 23:15:53なんかあるの?
Haskell'でMonad廃止してArrowにする事になったとか?
0759デフォルトの名無しさん
2007/07/11(水) 23:35:32いい加減時期バージョンの情報とかないのか
0760デフォルトの名無しさん
2007/07/11(水) 23:54:100761デフォルトの名無しさん
2007/07/12(木) 02:01:530762デフォルトの名無しさん
2007/07/13(金) 21:33:42ふつける読んでGHCちょっといじって見た程度なんだけど。
難しいモナドは使ったことないし、liftも使ったことないし、合成なんて何それ状態。
0763デフォルトの名無しさん
2007/07/13(金) 22:03:30今時OCamlだろwウケるw
0764デフォルトの名無しさん
2007/07/13(金) 22:07:110765デフォルトの名無しさん
2007/07/13(金) 22:57:25あと2〜3年かかりそうだが
0766デフォルトの名無しさん
2007/07/14(土) 02:17:420767デフォルトの名無しさん
2007/07/14(土) 02:36:59自分の中でなんかスッキリした気持ちになった時が快感なんだ
0768デフォルトの名無しさん
2007/07/14(土) 03:03:17>766は遅延評価の勉強を遅延評価しろって言いたかっただけだと思われ
0769デフォルトの名無しさん
2007/07/14(土) 03:09:080770デフォルトの名無しさん
2007/07/14(土) 03:19:480771デフォルトの名無しさん
2007/07/14(土) 03:25:120772デフォルトの名無しさん
2007/07/14(土) 08:29:500773デフォルトの名無しさん
2007/07/14(土) 08:53:530774デフォルトの名無しさん
2007/07/14(土) 08:59:25boost 使う。
0775デフォルトの名無しさん
2007/07/14(土) 13:52:14今は動きないの?
0776デフォルトの名無しさん
2007/07/15(日) 23:02:40「今現在どういうやつか」できまるもんよ
0777デフォルトの名無しさん
2007/07/16(月) 03:07:0910〜20万人を殺すことも基本だからな。
0778デフォルトの名無しさん
2007/07/18(水) 00:17:010779デフォルトの名無しさん
2007/07/18(水) 01:32:31サイバネティクスに詳しい人なら知っていますが、
犯罪者にとっては、マイクロチップをインプラントして
マインド・コントロールするのも常識ですね。
そんな、他の計算時間を奪ったり、
他の計算プログラムを破壊したり、
共有データを捏造したりする、
ヒューリスティクス計算法をユダヤソルバと言います。
二番煎じは中華ソルバですが。
0780デフォルトの名無しさん
2007/07/21(土) 11:15:170781デフォルトの名無しさん
2007/07/21(土) 12:33:430782デフォルトの名無しさん
2007/07/21(土) 18:48:400783デフォルトの名無しさん
2007/07/28(土) 13:16:280784デフォルトの名無しさん
2007/07/28(土) 13:20:40オマエモナー
0785デフォルトの名無しさん
2007/07/28(土) 13:49:440787デフォルトの名無しさん
2007/07/28(土) 21:20:360788デフォルトの名無しさん
2007/07/28(土) 21:29:170789名無しさん@そうだ選挙に行こう
2007/07/29(日) 01:42:14こんな私ですがよろしくお願いします。
0790名無しさん@そうだ選挙に行こう
2007/07/29(日) 02:01:24彼女(彼氏)いないプログラマって、白髪めちゃめちゃ多くないか?
セックスって健康面でとても大事な行為なんだな
0791名無しさん@そうだ選挙に行こう
2007/07/29(日) 13:21:54無さにイライラするようになる。
Pythonで高階関数を頻繁に使うようになる。
0792名無しさん@そうだ選挙に行こう
2007/07/29(日) 14:20:400793名無しさん@そうだ選挙に行こう
2007/07/29(日) 14:26:24出来るけど Haskell は出来ないよね。
0794名無しさん@そうだ選挙に行こう
2007/07/29(日) 14:28:50データ型で実現可能
0795名無しさん@そうだ選挙に行こう
2007/07/29(日) 14:38:23混在させるだけならいくらでも。
import Data.Dynamic
list = [toDyn 4, toDyn "foo", toDyn sqrt]
やりたいことによってはもっと良い方法があるかも。
0796デフォルトの名無しさん
2007/07/30(月) 06:36:22Lispユーザといっても簡単なマクロみたいな使い方だからなぁ
0797デフォルトの名無しさん
2007/07/30(月) 06:54:22純粋かどうかを気にする人には邪道だろうけど。
0798デフォルトの名無しさん
2007/07/30(月) 21:40:330799デフォルトの名無しさん
2007/07/30(月) 23:35:210800デフォルトの名無しさん
2007/08/01(水) 01:49:14悪意のある低知能はこんなスレを関連させるな。
0801デフォルトの名無しさん
2007/08/02(木) 00:09:12>>308
haskellがすでに大流行してる。本屋でもHaskell本だらけだし、
Javaから呼び出してJVM上で動かせるし。最近ではプログラム
始めたばかりの初心者でも普通にモナドを使いこなしてる。
Javaから呼び出して?VM上で?できたっけ???
0802デフォルトの名無しさん
2007/08/02(木) 00:39:530803デフォルトの名無しさん
2007/08/02(木) 01:54:15でもそれだとjavaから呼び出すことにはならないし・・・
なんなんだろう?
0804デフォルトの名無しさん
2007/08/08(水) 12:59:030805デフォルトの名無しさん
2007/08/08(水) 13:07:46モナドであることはIOの性質の一つに過ぎないのに。
実際、IOを扱うためにはまずモナドを理解しなきゃならんと
勘違いしてる入門者は多いんじゃないだろうか。
0806デフォルトの名無しさん
2007/08/08(水) 14:10:12それ、俺。
C/C++/Java しか使ったことがないので
面白そうだなと思って入門的なウェブページ
眺めてみたけど、「モナド」とかわけわかめな用語が出てきて挫折。
「俺は、俺は、Hello World とかしたい程度なのに」と絶叫、死亡。
代数学で出てきたような気もするが、全然意味が違う気もする。
というより、なんかゴルゴ13に狙撃されそうな名前だしさ。
0807デフォルトの名無しさん
2007/08/08(水) 23:23:52もさ……もさもさ
0808デフォルトの名無しさん
2007/08/09(木) 02:34:13モナドの定義より先にHaskellでのモナドの実装をみる方がHaskellでモナドプログラミングするためには良いと思う。
0809デフォルトの名無しさん
2007/08/09(木) 22:57:000810デフォルトの名無しさん
2007/08/10(金) 00:31:17That is what when you lose one gonad.
0811デフォルトの名無しさん
2007/08/10(金) 17:52:50東大学部生の教養プログラミングに
物申す展開か
0812デフォルトの名無しさん
2007/08/11(土) 11:19:390813デフォルトの名無しさん
2007/08/11(土) 16:59:130814デフォルトの名無しさん
2007/08/11(土) 20:22:01なんかサンプルコードキボンヌ
0815デフォルトの名無しさん
2007/08/12(日) 02:22:500816デフォルトの名無しさん
2007/08/12(日) 12:26:330817デフォルトの名無しさん
2007/08/12(日) 19:55:120818デフォルトの名無しさん
2007/08/13(月) 14:24:170819デフォルトの名無しさん
2007/08/17(金) 23:20:06今、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ではどう書いたらよいですか。
0820デフォルトの名無しさん
2007/08/17(金) 23:52:32T型の値を変更する関数を書く代わりに、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
0821820
2007/08/18(土) 00:28:29(Point x y)のところはpoint@(Point x y)で。
0822819
2007/08/18(土) 11:03:32ありがとうございます。
augmentRenを直列に並べるのは思いつかなかったです。
なぜか並列に並べなければいけないという思い込みがありました。
0823819
2007/08/24(金) 23:54:16囲碁のルールをhaskellで実装してみました。
(純碁なので上げハマを数える機能は実装してない。パスも未実装)
http://www.uploda.net/cgi/uploader4/index.php?file_id=0000018533.udn
ここはこう書くと処理が速くなるとか、
こうしたほうがエレガントだとかありましたら教えてください。
宜しくお願いします。
0824デフォルトの名無しさん
2007/08/26(日) 03:13:50「rから何かへの関数」がモナドになっているみたい。実装は Control.Monad.Instances 内。
モナドだというからにはdoで連ねることができるんだろうけど、どういう挙動になるんだろう。
0825デフォルトの名無しさん
2007/08/26(日) 04:28:52Hugsのファイルを見てみたら
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)
0826デフォルトの名無しさん
2007/08/26(日) 06:23:42Readerモナドと同じ。関数をReaderにラップする手間が省けるだけ。
0827デフォルトの名無しさん
2007/08/26(日) 11:05:36Control.Monad.Readerに instance MonadReader r ((->) r) ってのがあるね。
0828819
2007/08/26(日) 15:34:26haskellは演算子を定義できるそうですが、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
0829デフォルトの名無しさん
2007/08/26(日) 16:24:38だから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が出来るようになる。
0830デフォルトの名無しさん
2007/08/26(日) 16:32:59そのソースなら、+の代わりにMain.+やPrelude.+と書いて
曖昧性を除けば良い。面倒だけど。
自分で+を定義せずにPrelude.+を拡張するなら>>829の通りだけど、
乗算が定義されていない型をNumのインスタンスと宣言しないといけない。
Haskellの弱点の一つだな。
0831819
2007/08/26(日) 19:58:45どちらの方法でもいけることを確認しました。
829の方法を採用させていただきたいと思います。
クラスについても勉強したいと思います。
ありがとうございました。
0832デフォルトの名無しさん
2007/09/03(月) 14:55:42http://halogen.note.amherst.edu/%7Ejdtang/scheme_in_48/tutorial/overview.html
0833デフォルトの名無しさん
2007/09/03(月) 19:20:24マルチコアでスケールする Scheme とか、リアルタイム性能を持った
Scheme とか、大量のメモリを効率良く使える Scheme が書ける訳じゃ
ないんだよね。ただ、世間に出回っている Scheme 処理系を 1 つ
増やしたいだけなのであれば C で充分。
0835デフォルトの名無しさん
2007/09/03(月) 20:48:50そうですよねー
0836デフォルトの名無しさん
2007/09/03(月) 21:25:25それにCで十分てのも意味不明。CでできるからってCを使う理由にはならないだろ。
0837デフォルトの名無しさん
2007/09/03(月) 22:54:43call/cc とかもちゃんと動いてちょっと感動した記憶がある
プログラム意味論の面白さを始めて実感した瞬間だったな
0838デフォルトの名無しさん
2007/09/04(火) 00:49:16楽しいんだろうけど、動いたらおしまいなんだよね? 常用出来る様な処理系を書こうとしたら C や
C++ で書き直す事になるでしょ。何かむなしいのう…
0839デフォルトの名無しさん
2007/09/04(火) 02:31:40Prologくらいの変り種になると,それを何かの言語で実装したものは(toy実装であっても)
例えば「ユニフィケーションライブラリ」とでも呼ぶべき存在になるので
けっこう実用性があると思うけど.
On LispというLispの本ではデータベースのインタフェイス(普通ならSQLが来る位置?)
としてPrologを実装してた.
0840デフォルトの名無しさん
2007/09/04(火) 02:48:12hsをCにコンパイルすれば問題ない
0841デフォルトの名無しさん
2007/09/04(火) 02:50:36それが大事なんじゃないの?
0842デフォルトの名無しさん
2007/09/04(火) 11:05:43HaskellでPerl6、SMLでECMAScriptってのは
そもそもその時点で動作する処理系自体が存在しなかったから
実用性よりもまずきちんと動くことが重要。
0843デフォルトの名無しさん
2007/09/04(火) 11:14:110844デフォルトの名無しさん
2007/09/04(火) 20:13:46実用云々を言う以前に、Perl6の仕様は固まりきっていないんだけどね。
0845デフォルトの名無しさん
2007/09/04(火) 21:46:39>>843 が『Parrot 経由』と言ってるのは、Pugs に Parrot 用のアセンブラを吐かせて
Parrot VM で実行するという事じゃないかな。Parrot が実用になった暁には、そういう
アプローチはありだと思う。ただし、Parrot が実用になるのは…
>>832 のチュートリアルを一通り読んだら、自分でインタープリタを改造して JavaVM /
MS CLR / Mono VM / Parrot VM / LLVM 用のコンパイラを作れば良いんだよね。
と、>>832 の中身を読まずにカキコ。
0846デフォルトの名無しさん
2007/09/05(水) 00:40:270847デフォルトの名無しさん
2007/09/06(木) 18:10:20Escape from Zurg: An Exercise in Logic Programming
http://lambda-the-ultimate.org/node/2434
Embedding Prolog in Haskell
http://lambda-the-ultimate.org/node/112
前者はPrologよりもHaskellの方が探索問題に向いてるし初学者向きなんだぜ、という話らしい。
出典はJFP。
後者はしらん
0848デフォルトの名無しさん
2007/09/07(金) 18:58:30http://wiki.mozilla.org/Tamarin:WeeklyUpdates/2007-09-04#Self-hosting_Compiler
http://hg.mozilla.org/tamarin-central/?file/e04bf4a973f3/esc/
ES4 RI で Tamarin のバイトコード出力できるようになったようだ。
0849デフォルトの名無しさん
2007/09/07(金) 19:12:050850デフォルトの名無しさん
2007/09/08(土) 19:09:21Ocamlとかありますが、こちらは関数型としてはルーズな仕様と聞きました。
関数型の特徴を一通り体験できる、典型的な言語って何でしょうか。
0851デフォルトの名無しさん
2007/09/08(土) 19:22:290852デフォルトの名無しさん
2007/09/08(土) 19:30:43関数型の重要な特徴はどっちにもあるから好きに選べば良い。
むしろ、HaskellとOcamlの両方にあるのでなければ「典型的な」特徴と言いにくい気がする。
片方を知ればもう片方を学ぶのも比較的簡単なので、気に入らなければやり直せば良いし。
0853850
2007/09/08(土) 19:55:57みたんですけど、とっつきやすい感じがしました。
あと、ドキュメント、ライブラリが充実しているのはどちらなんでしょうか。
0854デフォルトの名無しさん
2007/09/08(土) 19:59:52去年まで金無し君だったけど、Haskellで
二年で350万貯めた。一度やってみなよ。
初回のみだけど、参照透明性を捨てれば副作用(4000円くらい)が貰える。
もらうだけもらってプレイせずに換金することもできるし、遅延評価を
思い切って止めてしまえば50パーセントで二倍速になる。
金なきゃMLスレで布教活動すればいいだけ。暇つぶしになる。
\とか$とか色々あるのでマジでお勧め。
0855デフォルトの名無しさん
2007/09/08(土) 22:50:41このコピペの元ネタを教えてはもらえまいか?
0856デフォルトの名無しさん
2007/09/08(土) 23:01:060858デフォルトの名無しさん
2007/09/11(火) 04:22:350859デフォルトの名無しさん
2007/09/11(火) 11:35:14【審議拒否】
∧,,∧ ∧,,∧
∧∧ (・` ) ( ´・) ∧∧
(ω・` ) U ) ( Uノ( ´・ω)
| U u-u u-u (U ノ
u-u ∧,,∧ ∧,,∧ u-u
(・ω・`) (´・ω・)
(l U) (U ノ
`u-u'. `u-u'
0860デフォルトの名無しさん
2007/09/11(火) 12:46:430861デフォルトの名無しさん
2007/09/11(火) 13:04:36ただし、ライブラリが腐ってたときに、自分で回避策を書いたり
パッチを送ったりする気になる程度にHaskellを愛していないと、
やってられなくなるかも。
0862デフォルトの名無しさん
2007/09/11(火) 13:20:14入門書のサンプル弄ったり、C用のアルゴリズム辞典のアルゴリズムを移植して満足しているレベルの俺には
ほぼ絶望的ってことはわかりました
0863デフォルトの名無しさん
2007/09/11(火) 14:56:090864デフォルトの名無しさん
2007/09/11(火) 15:19:46-optl-mwindowsをつけてコンパイル
0865デフォルトの名無しさん
2007/09/13(木) 01:48:170866デフォルトの名無しさん
2007/09/13(木) 02:21:350867デフォルトの名無しさん
2007/09/14(金) 09:14:18とりあえず、eclipseのプラグインとか、Visual Haskelとか入れてみたんですけど
入力支援とかうまくできないみたい。
emacsですか、そうですか。
0868デフォルトの名無しさん
2007/09/16(日) 19:09:01リストとかalistとかのデータ構造を直接操作するのが多くて、
そのせいでスケーラブルじゃないプログラムが量産されてる気がする
0869デフォルトの名無しさん
2007/09/16(日) 19:54:44再利用性が低い気がする
0870デフォルトの名無しさん
2007/09/16(日) 20:05:19あとうんこじゃない言語を知ってる人は俺に教えてくれ。
>>869
俺はむしろ逆の印象を受ける。
再利用に強いが変更に弱い。
0871デフォルトの名無しさん
2007/09/16(日) 20:21:05Lispを筆頭に関数系は大抵そうじゃないかと思ったが、
それ以前に、スケールするかどうかは、テータ構造を直接触ってるかどうかと関係ないのではないか。
0872デフォルトの名無しさん
2007/09/16(日) 22:08:57問題の規模に応じたスケール?
0873デフォルトの名無しさん
2007/09/16(日) 22:32:24C#
0874デフォルトの名無しさん
2007/09/17(月) 07:20:59Dと比べるとC#なんてうんこ
0875デフォルトの名無しさん
2007/09/17(月) 08:23:150876デフォルトの名無しさん
2007/09/17(月) 11:58:23Dはないw
コンパイラもライブラリもボロボロ
あれで何か作るって無謀すぎる
まだ形になってるC#の方がまし
0877デフォルトの名無しさん
2007/09/17(月) 12:30:48D自体は相変わらず突っ走ってるよ。
バグ取りもそこそこに、言語機能をどんどん追加していってる。
実装予定してる機能も多数ある。
それに対して、取り巻きの方は死んでる。
どのプロジェクトも、ライブラリを最新版のコンパイラで動かすのをあきらめてる状態。
もうみんなやる気ないみたい。
0878デフォルトの名無しさん
2007/09/17(月) 20:30:25付き合いたくはないね。
0879デフォルトの名無しさん
2007/09/20(木) 21:44:57を見ながら勉強しています。
ここに出てくる
data ABC = 'A' | 'B' | 'C'
が
Syntax error in data type declaration (unexpected character literal)
と言われます。なにが間違っているんでしょうか。
また
data Blood = "A" | "B" | "O" | "AB"
が
Syntax error in data type declaration (unexpected string literal)
といわれます。文字列を値にすることはできないのでしょうか。
なおHugsを使っています。
0880デフォルトの名無しさん
2007/09/20(木) 21:54:40そんな構文はない。
data ABC = A | B | C
とか
data Blood = A | B | O | AB
となら書けるけど。
この場合、AとかABとかは文字でも文字列でもない新しい値。
0881デフォルトの名無しさん
2007/09/20(木) 22:42:51にある
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でも同じようなことができますか。
0882デフォルトの名無しさん
2007/09/20(木) 22:51:38ありがとうございます。
いわゆる列挙型を定義しようとしていたのですが、列挙型の値に文字、文字列、数値は指定できないということでしょうか。
あと、
data Rank = A | B | C
data Blood = A | B | O | AB
としたいのですが
Multiple declarations for data constructor "A"
といわれます。列挙型の値の名前空間というかスコープは、グローバルということでしょうか。
0883デフォルトの名無しさん
2007/09/20(木) 23:06:56O(n)だと思う。参照されなくなったリストはGCによって回収されるので。
Haskellのリストは書き換えられない。破壊的に更新したいなら専用のデータ構造が要る、例えば
http://www.haskell.org/ghc/docs/latest/html/libraries/base/Data-Array-IO.html
>>882
列挙型の値を指定するというのが良く分からん。列挙値はそれ自体で値じゃないか?
Cのenum { a = 3};みたいな指定がしたいということなら、それは不可能。
必要なら整数と相互変換する関数を書けば良い。
>列挙型の値の名前空間というかスコープは、グローバルということでしょうか。
そう。正確にはモジュールレベル。
0884デフォルトの名無しさん
2007/09/21(金) 09:51:28O(n)にはならないように思うのですが。
整列が完了したら、参照されなくなったリストはGCされますが、整列中の間は参照されているわけですからGCされませんよね?
再帰呼び出しごとに新しいリストが作られ、それらは呼び出しから戻らないとGCされませんが、呼び出しから戻る前に別の再帰呼び出しが発生するわけだから、やはりメモリ消費量はO(n)ではないと思います。
また再帰呼び出しの深さは最大n-1になるので、やはりO(n^2)ではないでしょうか。実際には、呼び出しの深さは平均でlog(n)でしょうから、 O(n*log(n))が正解かもしれませんが。
詳しい人、お願いします。
0885デフォルトの名無しさん
2007/09/21(金) 12:10:42確かにそうだ。最悪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]
0886デフォルトの名無しさん
2007/09/21(金) 12:47:02>>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)になるっぽい
0887886
2007/09/21(金) 13:00:44import 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の部分を変化させながら計測していった。
0888デフォルトの名無しさん
2007/09/21(金) 13:12:52total allocは確保したメモリの総量だから、空間効率を計るのには使えない。
+RTS -sstderrをつけてmaximum residencyを見ればO(n)になってるのが分かると思う。
0889デフォルトの名無しさん
2007/09/21(金) 13:13:52ttp://kukuli.jp/haskell/qsort.zip
0890デフォルトの名無しさん
2007/09/21(金) 13:18:28>total allocは確保したメモリの総量だから
補足。確保->回収->確保で多重に計上されるってことね。
maximum residencyは瞬間的な使用中のデータ量の最大値(を実測で近似したもの)。
0891886
2007/09/21(金) 14:04:46>>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
と書くといいかなと思ったり。
0892デフォルトの名無しさん
2007/09/21(金) 18:05:39>HaskellのGCって、いらなくなった瞬間に動くものだったんだな。
デフォルトだと確保エリアの大きさは256kらしいから、第0世代のGCは頻繁に起こるんだろう。
>と書くといいかなと思ったり。
それだとリストの先頭しかeagerに評価されないから、
[99, 100, 97, 98, 95, 96, ..., 4, 1]
みたいなリストが入力だとO(n^2)になる。
リストを最後まで評価させるために>>885ではlengthを使ってる。
0893デフォルトの名無しさん
2007/09/21(金) 18:33:36実行時間の3割がGCとか、普通ですよね
0894デフォルトの名無しさん
2007/09/21(金) 18:41:45まあ、メモリ確保は馬鹿みたいに速いんだから許してやろうぜ。
0895デフォルトの名無しさん
2007/09/21(金) 20:23:16このコードが理解できない初心者のために、教えてください。
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 は全体のメモリ消費量で単位はバイトでしょうか。
0896デフォルトの名無しさん
2007/09/21(金) 20:50:31見てみました。わざわざありがとう。
で、この絵では再帰呼び出しのときには古いリストが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をよくわかってないので勘違いしてるかもしれませんが、お願いします。
0897デフォルトの名無しさん
2007/09/21(金) 21:07:44それで合ってる。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を回収できない。
0898デフォルトの名無しさん
2007/09/21(金) 21:37:360899デフォルトの名無しさん
2007/09/21(金) 21:49:14GCがある環境なら考慮していいと思う。じゃないと、机上の空論となるから。
GCがなければO(n^2)になるのが、逐次GCがかかることでO(n)になるなら、そっちを議論しないとあんまり意味なくね?
0900デフォルトの名無しさん
2007/09/21(金) 21:49:560901デフォルトの名無しさん
2007/09/21(金) 22:02:09力作ありがとうございます。
seqは完全に遅延評価を回避できるわけではないんですね。なんというか、オブジェクト指向言語でよく出てくるshallow copyとdeep copyの違いみたいな感じでしょうか(つまりseqはshallow copyに似ている)。
しかし完全に評価するためにlengthを使うのって、bad know howですよね。
このためにlengthを使うのは、lengthの本来の用途ではないのだから、完全に評価するための専用の関数が標準で用意されるべきたと思いました。たとえその実体がlengthであったとしても。
0902デフォルトの名無しさん
2007/09/21(金) 22:16:34を使うのかな。
これはこれで目的外使用な気もするが。
0903デフォルトの名無しさん
2007/09/21(金) 23:04:59処理系がタコなせいで遅いのなら、そっちを直すべきじゃね?
0904886
2007/09/21(金) 23:41:03-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。
0905デフォルトの名無しさん
2007/09/24(月) 10:50:26消費時間0%…遅延評価のマジックですなあ
0906デフォルトの名無しさん
2007/09/24(月) 11:13:33いや、プロファイラの精度の問題だろw
>total time = 0.05 secs (1 ticks @ 50 ms)
一個しか標本を取ってないんだから、片方が100%になるのは必然。
0907デフォルトの名無しさん
2007/10/01(月) 22:33:18parsecというものをimportしてParserを作らないといけないのでしょうか?
0908デフォルトの名無しさん
2007/10/01(月) 22:41:570909907
2007/10/02(火) 16:59:39ふつうのHaskellプログラミングに乗ってないんだ
0910デフォルトの名無しさん
2007/10/02(火) 17:11:53ghc/libraries/base/Data/ByteString/Char8
0911デフォルトの名無しさん
2007/10/02(火) 20:21:40ざんねん載っているぞ
0912デフォルトの名無しさん
2007/10/02(火) 21:07:05Hoogleで欲しい関数の型を検索してみると割とヒットするよ。
今回はString->[String]。
0913デフォルトの名無しさん
2007/10/07(日) 00:59:40http://www.youtube.com/watch?v=9fohXBj2UEI
An introduction to monads including the definition and a look at the monoid monad.
Category Howto & DIY
Tags: category functor monad monoid
0914デフォルトの名無しさん
2007/10/07(日) 17:09:38こんなマニアックなものがあるのか・・・
0915デフォルトの名無しさん
2007/10/07(日) 17:59:08モジュール名を’M’から始めないとinvalid_nameとかいわれるのはなぜなんだぜ?
0916デフォルトの名無しさん
2007/10/10(水) 09:37:48Haskellプラグインをどこが作ってるのかは知らないが、
オープンソースなんだろうし、開発を手伝ってきたら?
0917907
2007/10/15(月) 22:15:18ありがとう
0918デフォルトの名無しさん
2007/10/17(水) 06:53:13EclipseFP ?
ttp://eclipsefp.sourceforge.net/
0919デフォルトの名無しさん
2007/10/20(土) 02:31:070920デフォルトの名無しさん
2007/10/20(土) 13:24:39複数の引数をまとめてリストにしたい場合はどうするのでしょうか?
0921デフォルトの名無しさん
2007/10/20(土) 13:53:09型クラスを使って真似する方法はあるけど。
0922デフォルトの名無しさん
2007/10/20(土) 20:58:00> 定義できない
> 方法はある
どっちなんだ
0923デフォルトの名無しさん
2007/10/20(土) 21:06:12できない。似たようなことをする方法はある。
0924デフォルトの名無しさん
2007/10/20(土) 21:24:31hoge :: 任意個のa -> b ではなくて hoge :: [a] -> b
引数の型が違う時は
data Param = PInt Int | PString String
hoge :: [Param] -> b
みたいな感じ。
0925デフォルトの名無しさん
2007/10/21(日) 22:36:34List comprehensionという語の日本語訳が難しいのですが
普通はどう訳されているのでしょうか?
0926デフォルトの名無しさん
2007/10/21(日) 22:40:02リスト内包表現
っていうかぐぐれよ
0927デフォルトの名無しさん
2007/10/21(日) 22:40:33リストの内包表記
0928デフォルトの名無しさん
2007/10/21(日) 23:26:090929デフォルトの名無しさん
2007/10/21(日) 23:54:260930デフォルトの名無しさん
2007/10/22(月) 22:53:32なぁなぁ
まえにPDFうpしてくれた人の作品じゃないか?
背景がまったく同じだ
http://www.nicovideo.jp/watch/sm1324200
0931デフォルトの名無しさん
2007/10/22(月) 22:58:150932デフォルトの名無しさん
2007/10/23(火) 00:59:43http://japan.zdnet.com/oss/story/0,3800075264,20359294,00.htm
0933デフォルトの名無しさん
2007/10/23(火) 20:35:09Text.Printfを見てみるといい。(単に可変個の引数の話だけど)
0934デフォルトの名無しさん
2007/10/23(火) 22:05:140935デフォルトの名無しさん
2007/10/23(火) 22:23:260936デフォルトの名無しさん
2007/10/23(火) 22:47:15Cと連携したりできんの?
CからHaskellの関数呼んだりHaskellからCの関数呼んだり
0937デフォルトの名無しさん
2007/10/23(火) 22:49:55ソースのことだと思われ
0938デフォルトの名無しさん
2007/10/23(火) 23:03:34できるよ。
0939デフォルトの名無しさん
2007/10/23(火) 23:04:54どーやって?
CとHaskellって型とかだいぶ違う気がするけどそこらへんどーすんの?
0940デフォルトの名無しさん
2007/10/23(火) 23:15:16haskell ffiでググレ
0941デフォルトの名無しさん
2007/10/23(火) 23:17:30あまりの優しさにチンコ取れた
ありがとー読んでくる
0942デフォルトの名無しさん
2007/10/24(水) 20:47:28Clearsilverのバインディングなんてあったんだな
0943デフォルトの名無しさん
2007/10/26(金) 19:43:350944デフォルトの名無しさん
2007/10/26(金) 19:56:21英語 → http://haskell.org/onlinereport/
0945デフォルトの名無しさん
2007/10/26(金) 21:09:02思慮が足りないな。
仮にもhaskellに興味を持つような人間がそのサイトを知らないわけないだろ。
>>943が言いたいのはそのサイトが不便だってことなんだろうよ。
0946デフォルトの名無しさん
2007/10/26(金) 21:26:01流石にそれは見たことあるわ
>>945
そうそう
もっと適当にまとまってるとこねぇかな
ふつける読み返したり>>944見たりするのはめんどくさい…
0947デフォルトの名無しさん
2007/10/26(金) 22:19:25言い出しっぺの法則。というわけで、wikiでも建てて作ってくれ。
0948デフォルトの名無しさん
2007/10/26(金) 22:31:51ttp://vipprog.net/wiki/prog_lang/haskell.html
0949デフォルトの名無しさん
2007/10/26(金) 23:28:10はうまくいくのに
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 ""
0950デフォルトの名無しさん
2007/10/27(土) 02:37:030951デフォルトの名無しさん
2007/10/27(土) 03:42:36--source1.hs
Module Source1 (str1,str2) where
str1 = [| "a" |]
str2 = [| "b" |]
--source2.hs
import Source1
case x of { $(str1) -> 1; $(str2) -> 2}
0952デフォルトの名無しさん
2007/10/27(土) 08:43:40Tour of the Haskell Syntax
ttp://cs.anu.edu.au/Student/comp1100/haskell/tourofsyntax.html
0953デフォルトの名無しさん
2007/10/27(土) 08:57:52[| "a" |]の型はQ ExpであってQ Patじゃない。
そもそもパターンにspliceを書くことはできないはず。
0954デフォルトの名無しさん
2007/10/28(日) 02:29:01table = [(str1,1),(str2,2)]
fromMaybe (errror "") $ lookup x table
0955デフォルトの名無しさん
2007/10/28(日) 12:22:05ふたつの引数 m n をとって
m * (m+1) * .... * (n-1) * n を返す関数を
再帰的定義を用いて書け
なんて問題を解くのに30分もかかった…
普段とぜんぜん違う思考法を要求されて面白いねこれ
0956デフォルトの名無しさん
2007/10/28(日) 12:23:17Haskellやると頭がよくなった気がする。あくまで気がするだけだけど・・・。
0957デフォルトの名無しさん
2007/10/28(日) 13:41:46次のステップってどんなのがいいんでしょうか。
自分はWebアプリを実装してみようとか思ったんですけど、基本部品(Http
リクエスト解析とか、DB処理など)使ったものやるよりも、「Write Yourself a
Scheme in 48 Hours」みたいなのを勉強する方がよいのかな?と思ってます。
おすすめのHaskell学習資料なんかがあったら教えてください。
0958デフォルトの名無しさん
2007/10/28(日) 14:05:07まだHaskellであまりコードを書いてないなら、とにかくたくさん書いて慣れるのが重要だろう。
インタプリタ書くのは良い訓練だけど、やりたいことがあるならそっちをやった方が
モチベーションが上がりやすくて良いと思う。
0959デフォルトの名無しさん
2007/10/28(日) 14:05:15散々過去に同じ質問が出ているわけだが。
論文読め。
0960デフォルトの名無しさん
2007/10/28(日) 14:28:022に書いてある入門Haskellがおすすめ。
あとは、下記のやさしいHaskell入門かな。
http://www.sampou.org/haskell/tutorial-j/
そろそろもう一段階上の本を出してほしいなぁ > 著者さん達
0961デフォルトの名無しさん
2007/10/28(日) 14:41:02自分の経験から、あまり文法一覧を基本にした学習ではなくて、実際の
アプリ実装ベースでの学習をしたいと思ってます。目標はWebアプリの
雛形作ることなんですけど、既存コードの寄せ集めになってしまいそう
なので、Haskellのくせというか、定石みたいなの知った上でやりたいなと。
Write Yourself a Scheme in 48 Hoursみたいなのがいいんですけど、
似たようなの他にもあるかなぁと思って質問しました。
0962デフォルトの名無しさん
2007/10/28(日) 14:45:46プログラミング手法が確立されていないから、
研究目的以外でやるなら別の言語を使え。
0963デフォルトの名無しさん
2007/10/28(日) 19:33:04どう書く?org
http://ja.doukaku.org/
とか、
Programming:玉手箱
http://www.sampou.org/cgi-bin/haskell.cgi?Programming%3a%b6%cc%bc%ea%c8%a2
が参考になるかも
0964デフォルトの名無しさん
2007/10/28(日) 20:00:050965デフォルトの名無しさん
2007/10/28(日) 20:00:510966デフォルトの名無しさん
2007/10/28(日) 20:22:00nobsun乙wwwww
0967デフォルトの名無しさん
2007/10/28(日) 20:34:31>>963はただのNAIST生ですよ
0968デフォルトの名無しさん
2007/10/28(日) 20:37:08お前頭いいな。
(m+1) * .... * (n-1)
俺には、この省略されたところで何があったのか見当もつかん。
m+1<n ってことか?
0969デフォルトの名無しさん
2007/10/28(日) 20:44:44俺が察するに、m<nとして m, m+1, m+2, m+3, .. , n-3, n-2, n-1, n の乗積を求めたいんだろう。
0970デフォルトの名無しさん
2007/10/28(日) 21:16:07意味分からん
0971デフォルトの名無しさん
2007/10/28(日) 22:08:01その例は、手続き型でも大差ないだろう。
int f(int m, int n)
{
return m <= n? m * f(m+1,n) : 1;
}
0972デフォルトの名無しさん
2007/10/28(日) 22:10:55手続き型ならforでまわせよ、この豚
0973デフォルトの名無しさん
2007/10/28(日) 22:12:04CやFortranでは一気に面倒になるね。
0974デフォルトの名無しさん
2007/10/28(日) 22:37:35f m n = foldl (*) 1 [m..n]
0975デフォルトの名無しさん
2007/10/28(日) 23:34:32ああ、foldlはCで書かれてるなんて言わないでね。
0976デフォルトの名無しさん
2007/10/28(日) 23:39:37ghc落として見るが良い
0977デフォルトの名無しさん
2007/10/28(日) 23:47:15fl :: (a -> b -> a) -> a -> [b] -> a
fl _ x [] = x
fl fn init (el:la) = fl fn (fn init el) la
0978デフォルトの名無しさん
2007/10/28(日) 23:48:19wwww
アホがいる
0979デフォルトの名無しさん
2007/10/28(日) 23:49:22手で再帰を書かなくて済むことが重要
0980デフォルトの名無しさん
2007/10/28(日) 23:50:54fr :: (a -> b -> b) -> b -> [a] -> b
fr _ x [] = x
fr fn init (el:la) = fr fn (fn el init) la
0981デフォルトの名無しさん
2007/10/29(月) 00:01:07darcs遅せぇ
0982デフォルトの名無しさん
2007/10/29(月) 00:02:06それはfoldrじゃなくてfoldl . flipじゃないか
0983デフォルトの名無しさん
2007/10/29(月) 01:02:57ところが実装を気にするんだよな〜
なにしろ、再帰かどうかが大問題なんだから。
0984デフォルトの名無しさん
2007/10/29(月) 01:13:130985979
2007/10/29(月) 01:19:29大問題って、foldl再帰で実装されているかどうかを初めに問題にしたのは>>975だろ?
foldlが再帰的に定義されていたとしても>>974のfの定義自体は非再帰的なわけで、
>>974はそれをもって「非再帰の方が楽」という言い方をしたんだと俺は理解したんだが
0986デフォルトの名無しさん
2007/10/29(月) 01:49:300987デフォルトの名無しさん
2007/10/29(月) 02:13:050988デフォルトの名無しさん
2007/10/29(月) 20:37:430989デフォルトの名無しさん
2007/10/29(月) 21:02:25main = do cs <- getContents
putStrLn cs
はOKなのに
main = do cs <- getContents
<TAB><TAB>putStrLn cs
はダメなの?
0990デフォルトの名無しさん
2007/10/29(月) 21:21:37上もダメじゃないか?
csが(0から数えて)10桁目から始まるから、
二行目のputStrLnも10桁目にないといけない
タブ幅は8と決まってるから、タブ二つでインデントするとputStrLnが16桁目から始まることになる
0991デフォルトの名無しさん
2007/10/29(月) 21:23:150992デフォルトの名無しさん
2007/10/29(月) 21:33:540993デフォルトの名無しさん
2007/10/29(月) 22:10:17main = do { cs <- getContents;
<TAB><TAB>putStrLn cs}
にすればいいじゃない
0994デフォルトの名無しさん
2007/10/29(月) 22:15:49愛してる
>>993
何が悲しくて{}なんぞ使わにゃならんのよ…
0995デフォルトの名無しさん
2007/10/30(火) 02:15:020996デフォルトの名無しさん
2007/10/30(火) 07:32:03だれがうまい(ry
0997デフォルトの名無しさん
2007/10/30(火) 14:56:36ふつけるにも書いてなかったんだが、それずっと疑問だった。
Haskellってタブはスペース8個に決め打ちしてるのか?
そもそも等幅フォントじゃなかったらどうすんだとか、エディタ
選ぶ言語なの?
0998デフォルトの名無しさん
2007/10/30(火) 15:03:50等幅フォントでないと正しく見えない。
pythonのレイアウトも同じ。
0999デフォルトの名無しさん
2007/10/30(火) 15:08:471000デフォルトの名無しさん
2007/10/30(火) 16:13:06決め打ちしてる。
>そもそも等幅フォントじゃなかったらどうすんだ
例えば
・do、where、let、ofの後に必ず改行を入れる
・タブを使わない
の二点を守ればどんなフォントでも大丈夫。
10011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。