関数型プログラミング言語Haskell Part7

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
haskell.org
http://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の仕様により、行頭の半角スペースは表示されません。
 コードをインデントしたいときは、代わりに または全角スペースを使うことができます。
2デフォルトの名無しさん: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/
3デフォルトの名無しさん: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/
4デフォルトの名無しさん:2007/03/18(日) 19:01:59
・日本語の扱いについて

Haskell98によると、Charは一つのUnicode文字を表す(6.1.2)。
これに従って、比較的新しいHugsやGHC(6.4系を含む)ではCharは32ビット整数になっている。
ただし、どちらも入出力に際しての変換が完全でない。具体的には、
・ソースコード中の文字列リテラル
・System.IOライブラリでの入出力
が問題になる。

1. GHC6.4.2以前
ソースコード・入出力ともLatin-1を仮定する。Latin-1ではバイト値と
コードポイントが一致するので、入力時には外部エンコードの各バイトがそのままCharに
入り、出力時にはCharの下位8ビットのみが出力されるような実装になっている。
このため、あるエンコーディング(Latin-1とは限らない)の入力をgetLineで受け取り、
それをそのままputStrで表示すれば、入力時とおなじエンコードにおいて正しく表示される。
これを利用して、[Char]を、本来のコードポイントの列としてではなく、特定のエンコードの下での
バイト列として使うことができる。ただし文字列リテラルについては、GHCはLatin-1として
不正な文字を受け付けないので、EUC-JPのような例外を除くと、単純にリテラルを使うことはできない。

2. GHC6.6
ソースコードにはUTF-8、入出力にはLatin-1を仮定する。このため、EUC-JPでリテラルを直に
書くことはできない。

(続く)
5デフォルトの名無しさん:2007/03/18(日) 19:02:32
(続き)

3.最近のHugs(非WindowsかつCのwchar_tがUnicodeの環境、というかLinux)
ソースコード・入出力ともロケールのエンコードを利用する。

4.最近のHugs(Windows)
ソースコード・入出力ともLatin-1を仮定する。ただし文字列リテラルにShift-JISを使ってもエラーにならない。

5.最近のHugs(それ以外)
未調査。

・結局どうするか。
規格どおりにCharにUnicodeを入れるか、Charを単なるバイトとして扱うかの二択。

i. CharをUnicodeとして扱う
(3)以外の場合入出力で変換が必要。(2)または(3)以外の場合文字列リテラルでは
明示的なエスケープ(たとえば"\22234")が必要。

ii. Charをバイトとして扱う
(3)ではファイルをバイナリモードで開くなどの対策が必要。(1)でEUC-JPを使う場合と(4)
を除き文字列リテラルでは明示的なエスケープ(たとえば"\143\153")が必要。
lengthやisAlphaのような関数、およびwin32パッケージの関数(win32API)が正しく動作しない。
6デフォルトの名無しさん:2007/03/18(日) 19:12:44
>>1
乙。

で、前スレのネタを投下

989 名前:デフォルトの名無しさん[sage] 投稿日:2007/03/18(日) 16:51:08
hoge (x:xs) = fuga x : hoge xs
は、
データ構造の実装を直接触る、汚い・忌むべきコードなんだよ!
hoge xs = cons (fuga.head xs) $ hoge.tail xs
みたいにちゃんと関数で書くべきなんだ!!

もちろん、
bar Just a  = foo a
bar Nothing = baz
もダメダメだ!!!
7デフォルトの名無しさん:2007/03/18(日) 19:25:47
単なる皮肉だと思うけど
8デフォルトの名無しさん:2007/03/18(日) 21:50:15
じゃあそれが出来ないStringableがダメダメって事で。
9デフォルトの名無しさん: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のデータ構築子じゃないから。
10デフォルトの名無しさん:2007/03/18(日) 22:58:11
データ構築子じゃないとマッチングできないなら、
演算子でマッチングできるようにしてしまえばいいじゃない。

ただし、逆関数を定義する条件で。
11デフォルトの名無しさん:2007/03/19(月) 03:39:45
機能的にはそれで解決としても、性能的には。。。??
12デフォルトの名無しさん:2007/03/19(月) 05:57:58
Scalaにはextractorって機能があってパターンを定義できるね。
http://www.scala-lang.org/intro/extractors.html
13初心者:2007/03/20(火) 06:49:06
パターンマッチのコード書いてみたけどうまくいきましぇん
blueと打ってもblueと返ってきます
なんででしょーか

main = do cs <- getContents
       putStr $ aaaa cs

aaaa :: String -> String
aaaa cs = if cs == "blue" then "sky" else cs
14デフォルトの名無しさん:2007/03/20(火) 09:23:32
話題にしてるHaskellのパターンマッチではなくて、Stringの比較ね。
putStr $ aaaa cs

putStr $ aaaa.head.lines $ cs
とかしたらskyと返るかと。
あるいは、getContentsをgetLineにしてとか。
15デフォルトの名無しさん:2007/03/20(火) 11:43:00
どういう意図でgetContentsを使ったんだろ・・・。
延々とユーザーに入力させたいのか、入力は1回だけでいいのか。
16デフォルトの名無しさん:2007/03/20(火) 12:43:14
延々と入力させたいなら interact aaaa でもOKだな。
1716:2007/03/20(火) 12:55:26
OKじゃないや。interactの動作を勘違いしてた。
1813:2007/03/21(水) 00:01:34
ふつうのHaslekellプログラミング読んで、
map関数までしかやってないから、自然にgetContentsになりました

なんすか、aaaa.head.linesって
19デフォルトの名無しさん:2007/03/21(水) 00:43:49
linesしたものをheadしたものをaaaaする関数。
ふつけるにも出てない訳がない。
20デフォルトの名無しさん:2007/03/21(水) 00:45:19

「.」も「$」も同じ効果があるの?
21デフォルトの名無しさん:2007/03/21(水) 01:03:08
($) :: (a -> b) -> a -> b
$は最後までの括弧の代わり。
x$yの値は、(値yでの)関数xの「結果」。

(.) :: (b -> c) -> (a -> b) -> a -> c
.は関数の合成。
x.yの値は、関数yの結果を関数xに掛ける「関数」。
22デフォルトの名無しさん:2007/03/21(水) 01:12:29
×掛ける
○適用する
23デフォルトの名無しさん:2007/03/21(水) 01:13:45
難しいよママン
24デフォルトの名無しさん:2007/03/21(水) 01:41:50
a $ b $ c $ d は (a . b . c) d と書ける。
mapとかで処理を渡すときに
 map (\x -> a $ b $ c $ d)
と書く代わりに
 map (a . b . c)
とちょっとだけ楽ができる。
日本語で読むと「cしてからbしてaする」。
なぜか普通のaしてからbしてcするようなやつはない。>>=が似たようなもんだけど。
25デフォルトの名無しさん:2007/03/21(水) 01:44:28
 map (\x -> a $ b $ c $ d) の時点で意味不明な僕はスレ違いでしょうか
26デフォルトの名無しさん:2007/03/21(水) 01:49:05
それを読んで意味不明でもスレ違いではないが、
それを理解すべく調べて考えようとしないなら板違い。
27デフォルトの名無しさん:2007/03/21(水) 02:39:32
×(\x -> a $ b $ c $ d)
○(\d -> a $ b $ c $ d)
ってことでは?
28デフォルトの名無しさん:2007/03/21(水) 04:17:34
>>24
> なぜか普通のaしてからbしてcするようなやつはない。

つControl.Arrow

map (a >>> b >>> c)
29デフォルトの名無しさん:2007/03/21(水) 05:50:08
彼女とはaの前にcしちゃいました
30デフォルトの名無しさん:2007/03/21(水) 06:17:54
でもお金はきちんと払いました
31デフォルトの名無しさん:2007/03/22(木) 15:19:29
GHCでSDLを使おうと思って、
ttp://hackage.haskell.org/cgi-bin/hackage-scripts/package/SDL-0.4.0
にあるSDLのラッパーをインストールしようとしたんですけど、
下みたいになって途中で止まっちゃうんですけど、何ででしょう……。

C:\downloads\SDL-0.4.0>runghc Setup.lhs build
Preprocessing library SDL-0.4.0...
C:/ghc/ghc-6.6/libHSrts.a(Main.o):Main.c:(.text+0x1b): undefined reference to `_
_stginit_ZCMain'
C:/ghc/ghc-6.6/libHSrts.a(Main.o):Main.c:(.text+0x3f): undefined reference to `Z
CMain_main_closure'
collect2: ld returned 1 exit status
linking Graphics\UI\SDL\General_hsc_make.o failed
command was: C:\ghc\ghc-6.6\bin\ghc.exe -lSDL Graphics\UI\SDL\General_hsc_make.o
-o Graphics\UI\SDL\General_hsc_make.exe
Setup.lhs: got error code while preprocessing: Graphics.UI.SDL.General
32デフォルトの名無しさん:2007/03/22(木) 16:00:58
>>31
念のために聞くけど、buildの前にconfigureしてるよね?
3331:2007/03/22(木) 16:30:23
はい、configureはしてます。長くなると思ったのでログは書きませんでしたが、いちおうこんな感じで。
Configuring SDL-0.4.0...
configure: C:\ghc\ghc-6.6\bin\ghc-pkg.exe
configure: Dependency base-any: using base-2.0
configure: Using install prefix: C:\Program Files
configure: Binaries installed in: C:\Program Files\Haskell\bin
configure: Libraries installed in: C:\Program Files\Haskell\SDL-0.4.0\ghc-6.6
configure: Private binaries installed in: C:\Program Files\SDL-0.4.0
configure: Data files installed in: C:\Program Files\Common Files\SDL-0.4.0
configure: Using compiler: C:\ghc\ghc-6.6\bin\ghc.exe
configure: Compiler flavor: GHC
configure: Compiler version: 6.6
configure: Using package tool: C:\ghc\ghc-6.6\bin\ghc-pkg.exe
configure: Using ar found on system at: C:\ghc\ghc-6.6\bin\ar.exe
configure: No haddock found
configure: No pfesetup found
configure: No ranlib found
configure: Using runghc found on system at: C:\ghc\ghc-6.6\bin\runghc.exe
configure: No runhugs found
configure: No happy found
configure: No alex found
configure: Using hsc2hs: C:\ghc\ghc-6.6\bin\hsc2hs.exe
configure: No c2hs found
configure: No cpphs found
configure: No greencard found
34デフォルトの名無しさん:2007/03/25(日) 04:38:43
で、Stringableはリストになるの?
35デフォルトの名無しさん:2007/03/25(日) 14:30:21
型が充実してるって言うから、ちょっと勉強してみたけど、
簡単に実行時例外が発生するじゃん。なんだよこれ。

コンパイルが通れば論理的な誤り以外、
ほとんどバグが取れてるのかと思ったのに。 

実行時に読み込むデータとかの誤りなら仕方ないにしても、
そんなのない静的にすべて決まってるプログラムでも
実行時例外が起きえるなんて、全然だめじゃんwww
3635:2007/03/25(日) 14:46:59
すいません。こっちに書こうとして誤爆しました。
【数学者】Haskellはクソ言語【オナニー】
http://pc11.2ch.net/test/read.cgi/tech/1128011645/
37デフォルトの名無しさん:2007/03/25(日) 23:25:57
そっちのスレは見てないんだが head [] が実行時エラーになるという話を言っているのかな。

HLIST のような方法を取ることでその辺は解決可能じゃないかと思うんだけど、
どうだろう(head [] は型エラーとして検出できる)。
38デフォルトの名無しさん:2007/03/27(火) 02:02:44
同じモジュール内で、複数の代数的データ型に、
同じ名前のフィールドラベルを持たせるのはダメなんでしょうか。
セレクタがぶつかっているようです。

フィールドラベルを付けずに、classを作ってセレクタ相当の関数をいちいち実装するしかないんでしょうか。
セレクタはそれでよいとして、フィールドラベルを使ったパターンマッチはどうすればよいでしょうか。

型だけだと、それが何であるのかの情報が(セレクタしか)なくなって、可読性に不安を感じてしまいます。


あと、ふつけるを読了したのですが、
この後はHaskell98Reportを読むしかないのでしょうか。
かなり古くなってるみたいですけど。
39デフォルトの名無しさん:2007/03/27(火) 10:24:55
>>38
>同じ名前のフィールドラベルを持たせるのはダメなんでしょうか。
ダメ。

>フィールドラベルを付けずに、classを作ってセレクタ相当の関数をいちいち実装するしかないんでしょうか。
>セレクタはそれでよいとして、フィールドラベルを使ったパターンマッチはどうすればよいでしょうか。
フィールド名になんらかの接頭辞を付けて区別するのが常套手段だと思う。
フィールド名の名前空間がモジュール全体だと考えれば納得しやすいかもしれない。
それでも馬鹿馬鹿しいことには変わりないので、改善案がいくつもでていたはず。

>型だけだと、それが何であるのかの情報が(セレクタしか)なくなって、可読性に不安を感じてしまいます。
意味が分からん。

>この後はHaskell98Reportを読むしかないのでしょうか。
なんでも好きなものを読めば良いと思うが、Haskell98のうちふつけるで
取り上げられていない部分を知りたいなら、「やさしいHaskell入門」はどうだろう。
半分以上は既に知っていることだと思うので、飛ばしながら。
レポートは言語の詳細な規定を知りたいとき以外読まなくても良いと思う。
他には、GHCのマニュアルに、GHCに実装されている言語拡張について書いてある。

>かなり古くなってるみたいですけど。
Haskell98についての現役の定義であって、その意味では古くない。
ただ、Haskell98への拡張で、かなり広く使われている機能もあるので、
それについては別のものを読む必要がある。
40デフォルトの名無しさん:2007/03/31(土) 11:10:04
Haskellの界隈いったい最近どうなってるの?
なんか雰囲気がどんどんどんどん変になってるんだけど。
圏論もういいじゃん。普通にプログラミングとかやらねーの?
41デフォルトの名無しさん:2007/03/31(土) 11:19:43
普通にプログラミングやってるが。
42デフォルトの名無しさん:2007/03/31(土) 12:39:28
Fランク大の落ちこぼれが
東大学部生の教養プログラミングに
物申す展開か
43デフォルトの名無しさん:2007/03/31(土) 17:33:50
> Fランク大の落ちこぼれが
> 東大学部生の教養プログラミングに
> 物申す展開か
インターネットだと顔が見れないし、無駄に距離感が無いし、
こういう認識は大事である。
44デフォルトの名無しさん:2007/03/31(土) 20:52:49
>>40
今後の関数型言語界のために基礎を築いている段階。
ゆくゆくの関数型言語プログラミングがどうあるべきかを論じるには基礎研究が大切なの。
お分かり?
45デフォルトの名無しさん:2007/03/31(土) 20:58:59
H++マダー?
46デフォルトの名無しさん:2007/04/01(日) 01:01:33
「圏論もういいじゃん」は「基礎研究が大切なの」と反論されて当然ですが、
「普通にプログラミングとかやらねーの?」はまっとうな質問だと思います。
仮説検証用のごく小さなプログラムしか必要としない研究もあるでしょう。
しかしプログラミング言語は本来コンピュータに何らかの仕事をさせる手段であって
理論研究のためだけの道具ではないはずです。

大きなソフトウェアを実際に書いてみないと発見できない問題はたくさんあります。
昔、IBMが九州医大のシステムをSmalltalkで作ろうとしてSmalltalk界の有名人を
人月数百万円でかき集めたにもかかわらず失敗に終わった事がありました。
言語仕様を隅々まで把握しアーキテクチャに関する持論を唱えていた有名人達は
大規模システム開発を成功させる方法を知らなかったという事になります。
関数型言語が実用言語として広く使われるようになるためには理論研究だけでなく
実用ソフトウェアを書いて問題を見つけていく事も欠かせないと思います。

私からも改めてお聞きします。
Haskellでどんなソフトウェアを作っていますか?
47デフォルトの名無しさん:2007/04/01(日) 01:12:29
九大病院のSmalltalk事件はデスマーチが先。その状態からSmalltalk界の
グルをかき集めたけれど、手遅れだったというだけのこと。

それから、そのグルというのは現場の人達であり、理論屋ではなかった。
そもそもSmalltalkは学術的な面で特段価値のある言語ではないからね。
48デフォルトの名無しさん:2007/04/01(日) 01:13:20
まず、勘違いしないでほしいのは、haskellは研究用の言語ということ。
数多くの関数型言語があふれる中で標準として決められた言語。
研究の集大成としての言語。
実用が二の次だというのはしかたがないと思う。
49デフォルトの名無しさん:2007/04/01(日) 01:58:53
>haskellは研究用
マジデスカ (゚ロ゚)!!!!
職業プログラマーとしてはショック
50デフォルトの名無しさん: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/ ̄ヽ ヽ
         |  \     // /)ミ ー-∨   / ̄ ヽ
         |   (>―‐'/ /勺ヽ¨ア    /    }
         |   \三三‐'ノ ^ヽ/   /-―一 '

51デフォルトの名無しさん:2007/04/01(日) 05:40:56
【注意と警告】

関数型言語コミュニティの一員として、大切なお知らせがあります。
>>46-47 は、現実世界で多数のトラブルを巻き起こしている人物(東京在住44歳)
ですので、きっぱりとスルーするのがよろしいでしょう。

公衆の場でいきなり赤の他人相手に、第三者の失敗例を持ち出して
ベラベラと中傷しだす人物の人間性などというものは、容易に想像がつく事ですし、
また万が一そのような人物と関わったら、多大なトラブルと時間的消耗を蒙る
事は、火を見るより明らかです。

実際これまで現実のビジネスで、多くの人々が彼の言動に迷惑してきました。
その中には、彼と一緒に仕事をしていた一流大学出身の経営者や、エンジニア、
サイエンティスト、大学病院関係者等も含まれています。

彼の人間性を確認するには、ネット上での彼自身がこれまで行ってきたスレ荒し
の例を見れば十分でしょう。
・デザインパターンスレ http://pc11.2ch.net/test/read.cgi/tech/1141846078/
 特別な利害関係がきっかけで、繰り返し議論妨害を行っているのが彼です。
 彼の議論妨害には、精神性疾患の俗称の連呼という特徴があるので一目瞭然です。

私が察するに、彼の症状は「自己愛性人格障害」と呼ばれるものと存じます。
ここでは詳しく述べませんが、ピンときた方は症例を調べてみるとよろしいでしょう。

最終的な判断は聡明なみなさんにお任せ致します。それでは。
52デフォルトの名無しさん:2007/04/01(日) 05:53:53
なんという初厨の断末魔
53デフォルトの名無しさん:2007/04/01(日) 05:57:29
>>52
おい、おっさん
終わってるのはおまえだ
54デフォルトの名無しさん:2007/04/01(日) 06:12:43
はやく病院に逝って適切な処置受けりゃえぇーのに(w
55デフォルトの名無しさん:2007/04/01(日) 06:34:10
HaskellでRSSを引っ張って最新の数件表示するだけのサンプルに挑戦してるけど
かれこれ1ヶ月以上掛かってる。w

XML操作 → HXTでArrowの基礎から挑戦
日付のパース → MissingHを利用
表示 → 今はCGIライブラリで妥協してるけど本当はHAppS使いたい

難しすぎるわ。('A`)
56デフォルトの名無しさん:2007/04/01(日) 07:05:45
お前の学力では無理だから諦めろ

普通一ヶ月もあればツールやアプリの一本位書ける。
57デフォルトの名無しさん:2007/04/01(日) 07:36:41
そりゃどんだけエネルギーを割いてるかにもよるだろ。
ってかなんで煽ってんの?
58デフォルトの名無しさん:2007/04/01(日) 07:36:44
お前スレに張り付いてそんなことばかり言ってるな。
いい加減消えろ。
59デフォルトの名無しさん:2007/04/01(日) 09:03:24
お前にはムリ
60デフォルトの名無しさん:2007/04/01(日) 09:04:54
>>45
っ F#
61デフォルトの名無しさん:2007/04/01(日) 11:10:13
>>55
で、最後に日本語の扱いで泥沼になりそうだな
62デフォルトの名無しさん:2007/04/01(日) 11:10:48
C や Fortran プログラムで保存したバイナリファイルから、
データを読み込んで来て、ビットデータの処理をして
int や double のデータを取得するにはどうするの?

Lisp では、read-byte で読んでファイルを読んで、logand 等を使い、
double 等のデータを取得出来る様にはできてるんだけど、
Haskell ではどのように?
63デフォルトの名無しさん:2007/04/01(日) 11:27:52
まじめな研究に使う研究材料ですので、無駄です。
64デフォルトの名無しさん:2007/04/01(日) 11:41:14
>>62
「ビットデータの処理」って何?

バイナリファイルの操作の道具は整ってない。
とりあえずopenBinaryFileでファイルを開いて、
hGetByte :: Handle -> IO Word8
hGetByte h = liftM (fromIntegral . ord) $ hGetChar h
みたいなのを使ってバイトを読む。
ビット演算はData.Bitsを使う。

あるいは、メモリを直接操作することに耐えられるなら、hGetBufを
使ってバイナリデータをメモリに読み込み、Foreign.Storable.peekで
IntやDoubleとして読み出す。
65デフォルトの名無しさん:2007/04/01(日) 13:45:45
Why People Aren't Using Haskell
http://www.jelovic.com/articles/why_people_arent_using_haskell.htm

初代スレの932が5年前にリンクした上記ページは
Haskell普及のためにHaskellコミュニティがすべき事を提案しています。
1.十分なライブラリを含んだ標準版Haskellディストリを作る
2.研究者サークルから踏み出して熟練プログラマに対して宣伝を行う
3.DDJのような刊行物に記事を書く
4.Haskellで書かれた現実世界向けプログラムを発表する

2冊の入門本が出版されてblogで話題になったおかげで知名度は上がったと思います。
ライブラリの整備が進めば言語ユーザが増えていく事はGaucheが証明しました。
ユーザに言語学習を促すキラーソフトが言語をメジャーにする事はRoRが証明しました。
Haskellも役立つコードを増やせばさらに世間に普及するはずだと信じています。
66デフォルトの名無しさん:2007/04/01(日) 14:12:47
マルチバイト文字の出入力がまともにならん限り英語圏以外での流行など夢のまた夢。
67デフォルトの名無しさん:2007/04/01(日) 14:20:26
勝手にしてくれ。

Lispの時も、当初は数学的な計算モデル=ラムダ計算 を
コンピュータ上で実行するという奇妙なプロジェクトだったが、
実用性を云々して勝手な拡張を始めた段階で「手続き型言語」に堕ち、
そして最後には、特殊な実行メカニズムと市場の狭さが災いとなって
多数派CPU上で実行性能の出ない1マイナー言語となった。

もしHaskellの設計意図を解せぬ人が寄って集ってHaskellをダメにしたら、
その時はまた新しい研究成果を取り入れて、新しい純関数型言語の標準を決めればいい。

だがそんな愚かな事を繰り返す人間はごく一握りしか居ないだろう。
(SymbolicsやLMIでバブル体験した人を除いて)
Lisp, Scheme以降の関数型言語で、実用性を云々するならOcamlでも使っておけばいい。
あれなら10年以上前からゲームもWebブラウザも作っているし、普及度も高い。(Linux配布を通じて)

68デフォルトの名無しさん:2007/04/01(日) 14:24:29
職業プログラマを自称するLisp厨、Prolog厨には
イタイのが多いな。
69デフォルトの名無しさん:2007/04/01(日) 14:28:04
実験的言語、研究用言語に実用性を云々する厨房が寄って来ると
研究用テストベッドの機能が低下して、新しい物を生み出せなくなる。
70デフォルトの名無しさん:2007/04/01(日) 15:07:03
研究目的と実用目的の両方に対応することは本当に出来ないの?
それができないなら早いとこforkしてほしいな。
71デフォルトの名無しさん:2007/04/01(日) 15:13:17
つ Ocaml
72デフォルトの名無しさん:2007/04/01(日) 15:27:11
Haskellでさえ使っていてストレスを感じるので
Ocamlなんて話にならない。
73デフォルトの名無しさん:2007/04/01(日) 15:40:30
pupupu :p

えぇーっと。
そのストレスは「非実用性」に起因するんじゃなかったの?
74デフォルトの名無しさん:2007/04/01(日) 15:45:02
>>72
OCamlの方が君には楽だと思うよ
Cで慣れてる子はHaskellの方が異質に感じるはず。
75デフォルトの名無しさん:2007/04/01(日) 15:47:38
つまり、関数型言語ってのは、
実用に耐えない、穀潰し研究者達の内輪向け妄想オナニー理論ということ。
76デフォルトの名無しさん:2007/04/01(日) 15:50:03
>>75
つまり?
どういう論理?
77デフォルトの名無しさん:2007/04/01(日) 15:53:30
あのさ議論中すまないけど、
>>75は ↑の方で誰かが警告書いてくれた「精神性疾患」の人なんだ。
相手にせずスルーしとくのが、マナーだよ。
78デフォルトの名無しさん:2007/04/01(日) 16:00:52
親切な回答にいちいち逆切れしてスレを汚し出すようじゃ
誰にも相手にされないよな。
79デフォルトの名無しさん:2007/04/01(日) 16:01:30
>>77
ズバリ言われちゃったからって、ひどい逃げ口上だな。

実用性を求めたらダメになるって事は、ポテンシャル的に実用に耐えないって事だ。
実用に供され得ない物の研究は、工学においてはオナニーと呼ばれても仕方ないし、
幾ばくかでも国費を使っているなら、それは穀潰し行為という事だ。
80デフォルトの名無しさん:2007/04/01(日) 16:01:34

バカばっかだよな
 
81デフォルトの名無しさん:2007/04/01(日) 16:04:12
困った人が来ちゃったねw
82デフォルトの名無しさん:2007/04/01(日) 16:05:02
ここで暴れてるのは>>51って事で
スルー推奨
8382:2007/04/01(日) 16:06:02
ここで暴れてる人は、>>51に書かれてる人って事で
スルー推奨
84デフォルトの名無しさん:2007/04/01(日) 16:09:27
この前 On Lisp の訳本が出版されたけど Haskell にもそう言う本が欲しいね
今のところ入門書が2冊出ているだけだしこのまましぼんでいっちゃうのは惜しい
昨今の高級スクリプトブームで Lisp や関数型言語が注目されはじめているけど
一過性のlブームで終わりそうでやだなぁ
85デフォルトの名無しさん:2007/04/01(日) 16:11:20
> 一過性のlブームで終わりそうでやだなぁ

それは無いって。
毎年毎年、教育や研究で使う学生さんが量産されてるから。
86デフォルトの名無しさん:2007/04/01(日) 16:12:33
Haskellniおいて一過性のブームというなら、すでに終わってるんじゃないか?
あんまりブログでも書かれなくなったし
87デフォルトの名無しさん:2007/04/01(日) 16:12:55
俺自身もごく初期に夏季集中講義かなんかでこの系統の言語を学んだし。
88デフォルトの名無しさん:2007/04/01(日) 16:15:11
>>84
おいおい、Lispみたいな下等言語と一緒にするなよ
shopingサイト作った程度のドカタがグル扱いされるような言語と、
ちゃんとした世界中の研究者が利用する研究素材は違って当然。
研究素材なんだから、ドカタに普及する意味自体がない。
89デフォルトの名無しさん:2007/04/01(日) 16:16:12
数学基礎論とか地味ぃ〜な感じの分野のセンセが
学生さんに自分の分野に目を向けさせて、
引っ張り込むためのツールとしては機能してた気がする。
教育研究用ツールってのは、それでえぇんでない?
90デフォルトの名無しさん:2007/04/01(日) 16:16:46
>>88はスルー推奨
91デフォルトの名無しさん:2007/04/01(日) 16:16:55
この本はどうよ?

Programming in Haskell
ttp://www.amazon.co.jp/Programming-Haskell-Graham-Hutton/dp/0521692695/
9272:2007/04/01(日) 16:24:53
>>73
俺がストレスに感じることを「非実用性」と定義するなら、
Haskellは俺の知る中で最も実用的な言語だな。

>>74
お前の推測はどうでもいい。

そもそも俺個人の好みが問題なんじゃない。
「実用性を求めるならOcamlを使え」という議論が乱暴だと言っている。
93デフォルトの名無しさん:2007/04/01(日) 16:26:43
なんという非現実的な言葉遊びスレ
94デフォルトの名無しさん:2007/04/01(日) 16:27:24
RSS取得程度のプログラム作成に1ヶ月掛かる糞言語なんだろ?
Perlならものの数分だよ。2ちゃんねるやmixiを支えてる実用言語だけのことはある。
95デフォルトの名無しさん:2007/04/01(日) 16:33:18
>>92
あんたみたいな厨が、言語の価値を殺す。 Lispの轍を踏ませたいの?
96デフォルトの名無しさん:2007/04/01(日) 16:39:55
>>92-95 はスルー推奨
97デフォルトの名無しさん:2007/04/01(日) 16:45:16
“On Lisp”はLispのボトムアップによるスケーラビリティについて書いているけど、
Haskellにもそういった哲学ってあるの?
98デフォルトの名無しさん:2007/04/01(日) 16:46:07
>>96
おまえ、このスレに見覚えがあるだろ。
【面減る】ム板廃人列伝【最古】
http://pc5.2ch.net/test/read.cgi/tech/1083734838/
99デフォルトの名無しさん:2007/04/01(日) 17:01:47
404 Not Found
10070=72=92:2007/04/01(日) 17:06:22
>>95
批判なら具体的に頼む。
101デフォルトの名無しさん:2007/04/01(日) 17:06:26
新しい言語はちょっとかじってみたりするんだけど
大抵ライブラリが整備されていなくてあまり使わないんだよな。
.NET Frameworkがそれを解決してくれるかと思うんだけど
なかなか流行って行かないみたいだし。
というわけで結局無難な選択になってしまう。
102デフォルトの名無しさん:2007/04/01(日) 17:28:04
>>100 はスルー推奨
10346=65:2007/04/01(日) 18:11:31
>>67
実用性を気にして勝手な拡張をしからLispが廃れたというのは違うと思います。
今Lisp上で研究を進めたいなら、不可欠でない複雑さを切り捨てた
Schemeをテストヘッドにすれば良いはずです。

関数型言語研究の進展に伴いLispが研究の出発点としてふさわしくなくなったから
そこまでの研究成果を取り入れたHaskellが作られたと理解しています。
Haskellが実用言語になろうとなるまいと、その後の新しい研究成果を取り入れて
さらに新しい純関数型言語の標準を決める事はいずれまた必要になると考えます。

実用化に興味がない人がいてもいいとは思いますが、
良い言語であれば実用化を目指す人が現われるのもまた当然の事です。
研究成果が世間に広まるを嫌がるのでは一体何のための研究なのでしょうか。

>>100
>>67=>>95なのではないでしょうか。
それなら具体的な事はすでに書かれています。
104デフォルトの名無しさん:2007/04/01(日) 18:16:35
>>103
キミが実用Haskellを開発すればいい。
評価は世間が決めてくれる。と思うよ。

ただ既存のコミュニティは研究コミュニティだから、
迷惑はかけないで欲しい。約束だよ。
105デフォルトの名無しさん:2007/04/01(日) 18:26:41
MITのLispコミュニティ空中分解の原因は
AIブームによる研究者の起業と引き抜き。例えばSymbolicsとLMI。

かつての自由なコミュニティの崩壊を目の当たりにしたRMSが、
奮起してGNU宣言をして、その精神が今のオープンソースの
一つの源流となった。

ってそんなラヴ&ピース&ヒッピーな世界とは違うか。関数型言語コミュwは

いずれにせよ、いつの時代にも
虎の威を借りるネズミって居るもんだな。
こんな所でブツクサ言わずに自分でやればいい事なのにw
106デフォルトの名無しさん:2007/04/01(日) 18:38:41
実用性ってなに?
107デフォルトの名無しさん:2007/04/01(日) 18:40:23
>>103 がコードを一切書かずに
>>103 の懐が膨れ上がる仕組みのこと

108デフォルトの名無しさん:2007/04/01(日) 18:46:18
> 研究成果が世間に広まるを嫌がるのでは一体何のための研究なのでしょうか。

それはないな。
109デフォルトの名無しさん:2007/04/01(日) 19:19:40
そもそも実用性が低いから研究になるんだろ?
コボルの研究とか大学でするか?
110デフォルトの名無しさん:2007/04/01(日) 19:24:56
つまり、関数型言語ってのは、
実用に耐えない、穀潰し研究者達の内輪向け妄想オナニー理論ということ。
111デフォルトの名無しさん:2007/04/01(日) 19:25:54
話が逆だな。詐欺師お得意の詭弁って奴か。
112デフォルトの名無しさん:2007/04/01(日) 19:26:25
Haskellが理解できなくて逆恨みして荒らしてるのですね?
113デフォルトの名無しさん:2007/04/01(日) 19:27:50
>>109
話が逆だな。詐欺師お得意の詭弁って奴か。
114デフォルトの名無しさん:2007/04/01(日) 19:33:33
とりあえず、Haskellのような関数型言語でプログラミングするメリットを教えてください
今までよりプログラマは幸せになれるの?
幸せになれないのに研究なんかしないよね。
115デフォルトの名無しさん:2007/04/01(日) 19:33:41
逆ってどういう事?どこか詭弁
116デフォルトの名無しさん:2007/04/01(日) 19:38:51
言語やOSの研究でプログラマが幸せになると思ってんのか?
労働法の研究の方がはるかに幸せになるな
117デフォルトの名無しさん:2007/04/01(日) 19:39:42
お前ら学問・理系のどっか逝っとけ
118デフォルトの名無しさん:2007/04/01(日) 19:40:53
特定分野のプログラマが幸せになるのでもいいよ。
とにかく、誰かのためにならない研究なんて誰も注目するわけがない。
でも、注目している人がいるということは何か良いことがあるからでしょ?
それは一体何?
119デフォルトの名無しさん:2007/04/01(日) 19:42:45
>>117
↑の方の警告メッセージで指摘されてる人が一人で暴れてるだけだから、スルーしとけ。
120デフォルトの名無しさん:2007/04/01(日) 19:44:49
なんかジエンがほとんどっぽいなw

>>85
いや、そういうのは判るんだけど最近の注目度はちょっと異常だなと思って
高級スクリプトって書いたけど Pugs の影響も結構大きそうだね

ん?実用的な事例あるじゃないw

>>86
そうだねぇ、一気に引いた感じがする
今後本が出版するかも怪しいなぁ
Lisp ブームの方は結構長く続きそうだけど

前の話に戻るけど日本語文字列の扱いとか固まらないと国内じゃあまり弄る人いないかも
121デフォルトの名無しさん:2007/04/01(日) 19:45:47
20年前と比べてプログラマは幸せになってるか?
答えは否だ。
単金はやすくなり、納期は短くなった。使ってる言語やツールが進歩したにもかかわらずだ。

122デフォルトの名無しさん:2007/04/01(日) 19:52:17
実用性が上がると困るって、何がどう困るんでしょうか。
123デフォルトの名無しさん:2007/04/01(日) 19:57:22
プログラミングが簡単になる→プログラミングは誰でもできる仕事だと世間が考える→使い捨てOK
でも実際は質が悪いプログラムが量産されているだけにすぎない
124デフォルトの名無しさん:2007/04/01(日) 19:57:30
結果的に実用性が無くなるってのはあるだろうけどワザと実用性をさげる意味はないだろうなぁ
まぁオナニーでもなんでもいいじゃないか
好きという理由で使う言語ってのもあって良いと思うよ
それに関数型の考え方ってのは他の言語でも役に立つしねぇ
125デフォルトの名無しさん:2007/04/01(日) 20:00:48
>>103
> テストヘッド

とりあえず、おまぃは英語ができない事はよく判った。




126デフォルトの名無しさん:2007/04/01(日) 20:15:59
難しくて勉強が進みません。
私は才能が無いので死ぬべきです。
もう生きているべきではありません。
私はクズです私は存在する意味がありません。
私は世界の敵です。私は無意味です。
私の存在は世界の害悪です。
私は全ての存在の敵です。
127デフォルトの名無しさん:2007/04/01(日) 20:17:05
オレと同じでキミも暇だなw
128デフォルトの名無しさん:2007/04/01(日) 20:18:02
長々やってるこの流れも、大堀淳教授の講演スライドにある

一般ユーザ 「噂に違わぬtoy言語だ!」
研究者「関数型言語の美しさをわかってないやつだ!」

という2行にまとめることができる。
129デフォルトの名無しさん:2007/04/01(日) 20:21:30
>>128
ワロス
130デフォルトの名無しさん:2007/04/01(日) 20:29:30
これ単なる厨房の荒しを装ってるんだけど、
実際は44歳の人が荒してる、って事だよね?

なんで研究用言語の存在を(ry
131デフォルトの名無しさん:2007/04/01(日) 20:35:00
やねうらおって猿山のボスでしょう
よいしょしてくれる人がたくさんいてよかったね!
132デフォルトの名無しさん:2007/04/01(日) 20:36:13
はいはいつれたつれた。
133デフォルトの名無しさん:2007/04/01(日) 20:38:17
やねうらお?
ヤツは何かやってるの?
134デフォルトの名無しさん:2007/04/01(日) 20:46:26
ヒント:関係ない話題はOpenGLスレでどうぞ
135デフォルトの名無しさん:2007/04/01(日) 21:26:16
そして誰もいなくなった
136デフォルトの名無しさん:2007/04/01(日) 22:06:11
Haskellが研究用言語ってどういう意味?

関数型言語の研究成果が「盛り込まれてる」ってのは聞くけど、
それはHaskellが研究用と言うことを意味しない。

大体、研究ならモデルや理論構築で済む話であって、
わざわざ言語仕様どころか実装まで作るって、実用以外になんの目的があるのよ。

今までにない新規のモデルなり理論があって実装も作ってみよう、程度なら分かるけど、
公式使用は10年も前だし、繰り返されるGHCのバージョンアップは、
既存にない新理論や新モデルの実装としてなされているわけ?
新しいバージョンは、そんなに新研究といえるような新トピックに溢れてるの?

第一、研究用なら、ライブラリなんてこんなに要らないじゃん。なんでこんだけ付いてくるの?
もしかして、研究用って言ってる人の「研究」って、学部の演習のこと?そういうのは教育用って言うんじゃないの?
137デフォルトの名無しさん:2007/04/01(日) 22:07:14
頭悪
138デフォルトの名無しさん:2007/04/01(日) 22:08:23
うきよばなれしたすれだなあ
しがつばかってばかなことをいっぱいいうひなんだったっけ
139デフォルトの名無しさん:2007/04/01(日) 22:15:37
なあきょうだい、このおさんはいったいぜんたい なんで
けんきゅうようげんご というものを めのかたきに してるんだぜ?
140デフォルトの名無しさん:2007/04/01(日) 22:29:38
世の中にはね、一流の人間ばかり居る訳じゃないんだよ。
2流の学生に、既存のカビの生えた理論を実装させてそれを「研究」と称するのはのは常套手段。
3流の学生になると、マイナー言語で何かプログラムを書く事まで「研究」になる。
研究用言語ってちゃんとそう言う需要があるんだよ。
141デフォルトの名無しさん:2007/04/01(日) 22:32:27
こいつが復活したのか?
http://homepage3.nifty.com/Aransk/
142デフォルトの名無しさん:2007/04/01(日) 22:44:41
↓は関数型言語に興味がある奴は必読だなw
http://homepage3.nifty.com/Aransk/contents2.html
143デフォルトの名無しさん:2007/04/01(日) 22:52:15
ガイ・スティールもLispの実装に対する論文を書いてるんですが?
彼も2流なんですか?
144デフォルトの名無しさん:2007/04/01(日) 22:55:09
なんというゆとりの文系的思考w
145デフォルトの名無しさん:2007/04/01(日) 23:00:36
>>143
GLSはSchemeチップもやってた。
きっと半導体工場で作業服着る底辺工員に違いないw
146デフォルトの名無しさん:2007/04/01(日) 23:01:22
効率のよい実装も十分研究対象になると思うがね。
そこまでいうんなら、
その一流の論文とやらを教えてくれんかね。
147デフォルトの名無しさん:2007/04/01(日) 23:05:06
>>141
 >>51
148デフォルトの名無しさん:2007/04/01(日) 23:17:38
あほだなぁ。Lispは実用言語だろうが。実用なら実装は重要だ。
実用にならない物の実装方法なんて、それ自体何の意味もない。
149デフォルトの名無しさん:2007/04/01(日) 23:19:46
Lispの何処が実用言語なんだよ。
そんなことより、早く論文だせよ。
150デフォルトの名無しさん:2007/04/01(日) 23:32:28
>>149 うわ、頭悪そう(笑)
そんなに論文が好きなら、Haskellでのまともな研究論文を自分が晒せば?
Haskellを研究用言語とか言っちゃうのって、研究室入り立ての学部生か、Fランの院生だろ。
まさか、Lispまで研究用言語とか言うつもり?うはw
151デフォルトの名無しさん:2007/04/01(日) 23:34:07
>>149
 >>150=>>51の指摘している人物
152デフォルトの名無しさん:2007/04/01(日) 23:41:23
Lispはもはや研究としても価値のない言語。
萩谷先生がいってた。

Haskellの論文は
こっから好きなだけさがせ。
http://research.microsoft.com/~simonpj/
153デフォルトの名無しさん:2007/04/01(日) 23:44:24
Google知識Lisperの連続登場に爆笑
154デフォルトの名無しさん:2007/04/01(日) 23:46:30
ところで、論文はまだか。
それともコミュニケーションに飢えた基地外か
155デフォルトの名無しさん:2007/04/01(日) 23:46:47
Google厨 vs Google厨
156デフォルトの名無しさん:2007/04/01(日) 23:48:24
既視感のある発言の連発に爆笑

っつか他人のセリフ、パクリまくりの
自作自演しまくりじゃんこの厨房

やっぱ >>51 未満だな
157デフォルトの名無しさん:2007/04/01(日) 23:51:44
158デフォルトの名無しさん:2007/04/01(日) 23:52:25
なんでこんな身のない低レベルな話になっているんだw
Lisper の煽りならこっちでやった方がいいと思うよw

Lisp Scheme Part16
http://pc11.2ch.net/test/read.cgi/tech/1172404795/
159デフォルトの名無しさん:2007/04/01(日) 23:52:57
やっぱ、おまえ、上にあったスレの>>1だろ。成長しねぇなw
(キチ外)パワーは衰えてるけどww

>>152見たけど、
昔からのアイデアをHaskellに移植してみました系の論文ばっかに見えるんだけど、
どれがまともな研究なの?
160デフォルトの名無しさん:2007/04/01(日) 23:56:55
それHaskellの実用性を逆に証明してないか?

quantum programming
language QML [AG04, AG05], developed in Haskell


って書いてあるぞ
161デフォルトの名無しさん:2007/04/01(日) 23:58:29
どんなに大層な事をいっても相手をキチガイといったり罵倒したりしてればまともな話にならないと思うよ
相手の徹底的に打ち負かしてすっとしたいのは判るけど自分にとって何のプラスにもならないし
162デフォルトの名無しさん:2007/04/01(日) 23:58:32
>>157
それは何かのギャグかい?
それはHaskellを実用してる例なんだが。
やっぱ、>>150の洞察は正解のようだなw
163デフォルトの名無しさん:2007/04/02(月) 00:00:06
>>159
具体的にどの論文だ?
名前くらいかけよ。
164デフォルトの名無しさん:2007/04/02(月) 00:01:10
なんて説得して聞くたまじゃないかw

まともな人はもう放置だろうしオレも引いた方がいいかな
休みはほんとうに困るねw
165デフォルトの名無しさん:2007/04/02(月) 00:04:45
英語読めないところといい。

http://homepage3.nifty.com/Aransk/
だったようだなw
166デフォルトの名無しさん:2007/04/02(月) 00:05:56
>>161がとても良いことを言った。
167デフォルトの名無しさん:2007/04/02(月) 00:08:13
どうやら>>51は正解だったな
168デフォルトの名無しさん:2007/04/02(月) 00:17:30
本日のまとめ

変な人が、Haskellは研究用言語だ、実用厨は邪魔とのたまう
             ↓
煽られて探して来たのは、Haskellを実用にしている内容の英語論文
             ↓
結論:Haskellは研究用言語ではない。そんなこと言う奴は、やはり馬鹿。実用OK。
169デフォルトの名無しさん:2007/04/02(月) 00:19:33
てかどう見ても

http://www.cs.nott.ac.uk/~jjg/papers/qml-comp.pdf

はsyntaxとかmachine codeについて書いてあるし、
これは処理系実装に関する論文としか思えないのだが。

しかも、出てくる擬似言語もHaskellそっくりだし…


何処をみてモデルや理論構築だと思ったんだろ?
このAranskは?
170デフォルトの名無しさん:2007/04/02(月) 00:21:27
↑ 【注意!】)汚れが手に付かないよう、注意して捨てて下さい。
- - - - - - - - - - き り と り せ ん - - - - - - - - - -
171デフォルトの名無しさん:2007/04/02(月) 00:28:57
キミたちなかなか充実した休日を過ごしたなw
172デフォルトの名無しさん:2007/04/02(月) 00:31:19
April foolは終わった

さあ今年度も頑張ろう
173デフォルトの名無しさん:2007/04/02(月) 00:39:01
でも、量子コンピュータ用関数型言語って面白い研究だよね。
categorical semanticsっていうのは圏論的意味論って事なのかな?
174デフォルトの名無しさん:2007/04/02(月) 00:41:25
四月馬鹿はもう終わりだよ。
さぁ散った散った

>>173お前はさっさと壷に糞を詰める作業に戻れ
175デフォルトの名無しさん:2007/04/02(月) 00:50:27
ところでお前はてなにいたんだな。Aransk。
2年前関数型言語のスレさんざん荒らした基地外のくせに…

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/
176デフォルトの名無しさん:2007/04/02(月) 00:54:11
ヒント:   あなたの発言対象は発散しています。
アドバイス:あなたはとても疲労しています。
       今晩は暖かい風呂に入り、ゆったりとした気分で睡眠をとってはいかがでしょう?
177デフォルトの名無しさん:2007/04/02(月) 00:56:25
>>175
そろそろ落ち着かない?w
178デフォルトの名無しさん:2007/04/02(月) 01:09:16
諸君、議論したまえ。
折角だから>>157 >>160についても議論したまえ。
179デフォルトの名無しさん:2007/04/02(月) 01:29:45
情報板へカエレ
180デフォルトの名無しさん:2007/04/02(月) 02:07:45
一般向けの入門書が出版される研究用言語ってなんだよw
181デフォルトの名無しさん:2007/04/02(月) 02:10:45


釣り師のおかげでスレが大繁盛です^−^

 
182デフォルトの名無しさん:2007/04/02(月) 02:11:08
幼稚
18355:2007/04/02(月) 12:48:42
とりあえずできてるところまで晒してみる。('A`)
runXを1回済むようにできないか考えてるところ。
(実行にはHTTP, HXT, hslogger, FilePath, MissingHあたりが必要。)

import Data.List (sortBy)
import System.Locale (defaultTimeLocale)
import System.Time (CalendarTime)
import System.Time.ParseDate (parseCalendarTime)
import Text.XML.HXT.Arrow

data RssItem = RssItem { title    :: String,
             link    :: String,
             description :: String,
             pubDate   :: CalendarTime }
        deriving (Show)

instance Eq RssItem where
  a == b = (pubDate a) == (pubDate b)

instance Ord RssItem where
  compare a b = compare (pubDate a) (pubDate b)


main :: IO ()
main = getRssItems "http://www.microsoft.com/japan/msdn/rss.xml"
    >>=
    writeHtml "result.html" . take 10 . sortBy (\a b -> compare b a)
18455:2007/04/02(月) 12:49:51

getRssItems :: String -> IO [RssItem]
getRssItems url = runX $ readDocument [(a_validate, v_0)] url
             >>>
             getXPathTrees "/rss/channel/item"
             >>>
             ( getElemText "title"
              &&&
              getElemText "link"
              &&&
              getElemText "description"
              &&&
              getElemText "pubDate"
             )
             >>^
             \(t, (l, (d, p))) -> RssItem t l d (parseDate p)
          where
           getElemText n = getChildren >>> isElem >>> hasName n >>>
                   getChildren >>> isText >>> getText

parseDate :: String -> CalendarTime
parseDate = maybe dummyTime id . parseCalendarTime defaultTimeLocale "%a, %d %b %Y %H:%M:%S %Z"

dummyTime :: CalendarTime
dummyTime = let Just d = parseCalendarTime defaultTimeLocale "%Y/%m/%d" "1900/01/01" in d


writeHtml :: FilePath -> [RssItem] -> IO ()
writeHtml path items = do runX $ makeHtml items
                 >>>
                 writeDocument [(a_output_html, v_1), (a_output_encoding, utf8)] path
             return ()
18555:2007/04/02(月) 12:50:36

makeHtml :: (ArrowXml a) => [RssItem] -> a n XmlTree
makeHtml items = root [] [
          selem "html" [selem "body" $ arr (map makeLink) items]
         ]

makeLink :: (ArrowXml a) => RssItem -> a n XmlTree
makeLink item = selem "div" [
          mkelem "a" [sattr "href" (link item), sattr "target" "_blank"] [txt (title item)]
        ]

以上、連投スマソ。
186デフォルトの名無しさん:2007/04/02(月) 13:16:46
print文デバッグの人か
187デフォルトの名無しさん:2007/04/02(月) 13:36:58
>>183
現状で何か不満があるのか?
188デフォルトの名無しさん:2007/04/02(月) 13:39:42
いやむしろ、昨晩このスレで思わず、
精神性疾患患者の蔑称を叫んでしまった
自己愛性人格障害の方でしょう。
18955:2007/04/02(月) 13:52:13
>>187
読みと書きでArrowを別々にしてるところ。('A`)

あとは元ネタはこのへんなんだけど、
http://pc11.2ch.net/test/read.cgi/tech/1174574352/15-18n
これぐらい簡潔に書けないものかなあ、と。
190デフォルトの名無しさん:2007/04/02(月) 14:06:20
>>188
スルーしておいた方がよさそうだな
またスレが荒れたらかなわない
191デフォルトの名無しさん:2007/04/02(月) 14:28:23
>>189
なんで別々にするのが嫌なのか分からんが、HXTのドキュメントを見た感じでは
listA :: (ArrowList a) => a b c -> a b [c]
を使えばよさそう。
192デフォルトの名無しさん:2007/04/02(月) 14:43:27
でさーHaskellのライブラリが完備されて
プログラマが学習コスト0で習得できたとしたら
みんなこぞってHaskellを使い始めちゃうわけ?
それくらいの実力はあると?
193デフォルトの名無しさん:2007/04/02(月) 14:51:22
>>188=>>190=>>170=>>167=>>166=>>164=>>161=>>156=(略)=>>51 = ム板に巣くう粘着自演キチ外だろ。
おまえが消えろよ。
194デフォルトの名無しさん:2007/04/02(月) 14:59:20
>>193>>51で指摘されている危険人物
特徴:妄想
195デフォルトの名無しさん:2007/04/02(月) 15:06:00
一昨日晩は、いきなり無関係な第三者を中傷しだすし
昨日は、NGワード連発するし、いったいこの人なんなんだ?
19655:2007/04/02(月) 15:07:37
>>191
うは、ありがと。
もう少し探ってみる。('A`)
197デフォルトの名無しさん:2007/04/02(月) 15:14:07
判りやすいね
19855:2007/04/02(月) 17:53:37
>>191
listAとarrLの組み合わせで、Arrow内でのsort, takeが無事できますた。多謝。('A`)
199デフォルトの名無しさん:2007/04/02(月) 19:22:28
( ^ิ౪^ิ)━☞
20046:2007/04/02(月) 22:04:08
>>51
Smalltalk事件を持ち出した私(>>46)とフォローを入れた>>47は別人です。
私は44歳の人には全く心当たりがありません。
私がこのスレで書いたレスは>>46>>65>>103だけです。
私は「【GoF】デザインパターン 6」と「デザパタ+python」にはレスしていません。
Smalltalk事件の引用で別スレの揉め事を召喚してしまった事はお詫びします。

>>193
http://pc11.2ch.net/test/read.cgi/tech/1172431242/542
どちら側も複数いるのにお互いに相手は一人だと思い込んでいる様に見えます。

>>192
関数型言語の学習コストという大きな障壁がないのであれば、
短い時間で不具合が少ないコードを書ける
Haskellに飛びつく人は増えると考えられます。
201デフォルトの名無しさん:2007/04/02(月) 22:37:53
C並とはいかなくとも、Java程度の性能(実行時間とメモリ使用量)の実行コード
が生成されるようになったら、みんな飛びつくと思う。
202デフォルトの名無しさん:2007/04/02(月) 22:49:45
すでに実現済みだけど?
203デフォルトの名無しさん:2007/04/02(月) 22:57:19
文体一緒やで
204デフォルトの名無しさん:2007/04/03(火) 06:48:44
>>183
instance Eq RssItemの実装がちょっとまずいんじゃない?
日時さえ一致すれば違うサイトの情報も全部同じ扱いになっちゃうよ。
205デフォルトの名無しさん:2007/04/03(火) 08:28:02
>183
しばらく読んでなかったから気付かなかった。
http://darcs.haskell.org/SoC/haskellnet/Text/RSS.hs
が参考になるかもね。
20655:2007/04/03(火) 10:29:34
>>204
並べ替えのことばかり考えてて、すっかり本来の用途を忘れてた。
linkで比較に変更します。

>>205
本格的すぎ・・・。('A`)
とりあえず解読に挑戦してみます。

お二方、レスサンクス。
20755:2007/04/03(火) 10:32:16
> linkで比較

linkとpubDateの方がいいか・・・。
208デフォルトの名無しさん:2007/04/04(水) 07:23:55
むしろこちらを参考にすべきかと
http://pc11.2ch.net/test/read.cgi/tech/1172431242/
209デフォルトの名無しさん:2007/04/06(金) 18:26:30
代数的データ型で、クラスインスタンスをメンバ(?)にするにはどうすればいいんですか?
210デフォルトの名無しさん:2007/04/06(金) 18:48:45
非標準だけど、存在型を使って、
data F = forall a. (Show a) => F a
みたいにする。
211デフォルトの名無しさん:2007/04/06(金) 22:30:47
存在型を使うという手もあるけれど、標準に準拠する書き方では、
data (Show a) => F a = F a
みたいに型パラメータとして渡す。

この場合、 F Int と F Char は違う型になってしまうとかいうことがあり、
混同させたいときには問題だが(なので非標準な forall が導入されたのだが)、
たいていは問題ない。はず。

もちろん、宣言の方で
data F a = F a
のように書いておき、 F を使う関数の方で a に対するコンテキストを与える
という手もある。
212デフォルトの名無しさん:2007/04/07(土) 12:59:59
>>210-211
ありがとうございます。
>>211の方法でいけました。
外部から型を指定する必要はないのでちょっとすっきりしない気がするけど、そんなもんでしょうか。
210はNot a constructor: 'forall'と言われてしまいました。
ググったら、forallは「途轍もなく難しい」とあったのでそこであきらめてしまいました。すみません。
213デフォルトの名無しさん:2007/04/07(土) 18:00:15
すいません。emacsのhaskell-modeでプログラムしているんですが、
インデントの方法に関して質問があります。

例えば、次の様なソースがあった時、
import System
import System.IO
main = do
putStrLn $ "Woud you like some coffee?(y/n)."
hFlush stdout
c <- getChar
if c == 'y'
then putStrLn "Yes,please."
else putStrLn "No,thank you."

thenやelseの前でTabキーを押すと、if式と同じインデントになってしまうのですが、
それだとコンパイルエラーになってしまいます。なので、今はスペースでインデントを
付けています。Tabキーで正しくインデントさせる方法がありますでしょうか?
214デフォルトの名無しさん:2007/04/07(土) 18:08:59
tabおかわり
215デフォルトの名無しさん:2007/04/07(土) 19:31:19
>212
そんなもんです。
forall 使うなら、 -fglasgow-exts つきでコンパイルしないとだめ(Hugsなら-98だっけ)

>213
明示的に {} を使うという方法はあるにはあるが。
do { putStrLn $ "Woud you like some coffee?(y/n)."
; hFlush stdout
; c <- getChar
; if c == 'y'
then putStrLn "Yes,please."
else putStrLn "No,thank you."
}
のようにすると綺麗にインデントできる。

まぁ私は手で空白を入れたり一行にしちゃったりする方が多いけれど。
216デフォルトの名無しさん:2007/04/08(日) 17:57:02
>>215
レスありがとうございます。
{}を使う方法か、手動でインデントをあわせる方法の2通りという事ですね。

他の方はどうやってインデントさせているのか疑問に思っていたのですが、
その疑問が解消されました。
217デフォルトの名無しさん:2007/04/08(日) 18:22:46
>>214は違うのか?
いや、俺はemacs使ってないからよくわからんが。
218デフォルトの名無しさん:2007/04/08(日) 19:29:17
>ひろたかは何のためにPythonを使おうと思ったの?

あん? 金儲けのためよ。
俺様がPyhonの本を書けば、Py厨が喜んで買うかなと思ったんだ。
が、市場調査の結果、お前らは金持ってなさそうだと判明したんで
撤退しというわけ。

世の中、ゼニだ。金持ちを相手にしないとな。

今度は関数型言語で名前を売ろうかななんて思るよ。
お舞には、無理だろうが
219デフォルトの名無しさん:2007/04/08(日) 20:09:19
本なんて儲からへんよ やめとき
220デフォルトの名無しさん:2007/04/09(月) 00:26:48
本で宣伝してコンサルで儲けるつうのが定番ですな。
221デフォルトの名無しさん:2007/04/09(月) 01:11:19
PythonよりHaskellの本が売れるなんて思っている時点で市場調査をやりなおした方がいいぞ。
222220-221の母:2007/04/09(月) 01:17:46
皆様お勉強中の所を、お騒がせしまして
誠に申し訳ございません、>>220-221の母でございます。

今夜、私がちょっと目を話した隙に、頭の弱い子が
この掲示板に何か書き込んでしまったようです。

取り急ぎ薬を飲ませて眠らせましたので、
もう悪戯をする事はないかと存じます。
本当にご迷惑をお掛けして申し訳ありませんでした。
223デフォルトの名無しさん:2007/04/09(月) 07:30:06
Haskellの限界を見た。何でこんなに長いのか。
http://www.joachim-breitner.de/various/bfi.hs
224223の祖母:2007/04/09(月) 07:32:48
孫がお騒がせしまして申し訳ございません、
>>223の祖母でございます。

この朝、私共がちょっと目を話した隙に、
また頭の弱い子が この掲示板に何か書き込んでいたようです。

さきほど拘束衣を付けて施設に送り出しましたので
もう悪戯をする事はないかと存じます。
本当にたびたびご迷惑をお掛けして申し訳ありませんですた。
225デフォルトの名無しさん:2007/04/09(月) 07:33:37
長いのか短いのか比較対象がないから何ともいえない。
ブレインファックの他の言語での実装も持ってきて。
226デフォルトの名無しさん:2007/04/09(月) 07:34:37
>>224
就職活動お疲れ様
227デフォルトの名無しさん:2007/04/09(月) 07:37:16
朝から構ってちゃんか
暇人だな似非コンサル人種は
228デフォルトの名無しさん:2007/04/09(月) 08:31:46
http://www.muppetlabs.com/~breadbox/bf/
もともと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による比較的短いインタプリタ。
229デフォルトの名無しさん:2007/04/09(月) 08:34:50
230デフォルトの名無しさん:2007/04/10(火) 20:44:08
Haskellってサーバ書ける?シンプルなCGIは書けるだろうけど、
イベント発生時のサーバ側からのプッシュとか、
リクエスト同士でのデータのオンメモリでのやりとりとか。
231デフォルトの名無しさん:2007/04/11(水) 21:22:07
http://research.microsoft.com/%7Esimonpj/papers/marktoberdorf/
Writing High-Performance Server Applications in Haskell, Case Study: A Haskell Web Server
232デフォルトの名無しさん:2007/04/15(日) 04:08:19
HaXmlがHuttonMeijerWallaceってパーサコンビネータを使ってるみたいなんだけど、
これって、Persecに比べて何がよいの?なんか随分古そうだけど。
233デフォルトの名無しさん:2007/04/18(水) 02:33:07

オス オラ素人ハスケラー
教科書見てプログラム書くだけじゃつまんねーぞぉ

30行くらいのサンプルプログラム晒してくれ
そんでその後に説明してくれ

どーせスレのびないんだし、頼んだぞぉ!

なんならこっちで
【数学者】Haskellはクソ言語【オナニー】
http://pc11.2ch.net/test/read.cgi/tech/1128011645/
234デフォルトの名無しさん:2007/04/20(金) 21:23:21
あの、本家のサイトにつながらないんですけど、皆さんつながってますか?
235デフォルトの名無しさん:2007/04/20(金) 21:24:21
つながらない。
236233:2007/04/20(金) 22:46:40

余裕でスルーかよw
 
237デフォルトの名無しさん:2007/04/20(金) 22:53:11
何か書いてほしいならお題くらい出せよ。
おもしろそうなら食いつく奴も居るんじゃね?
238233: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桁を入力すれば
ファイルの書き出しが行われるようにしてください。


面倒であれば完璧にこなさなくてもいいです。
細かな仕様は勝手につくってください。
 
 
239デフォルトの名無しさん:2007/04/20(金) 23:37:54
普通にコピペできるけど?
240デフォルトの名無しさん:2007/04/20(金) 23:52:23
>>238
おまえ真性の馬鹿だろ
241デフォルトの名無しさん: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
242デフォルトの名無しさん:2007/04/21(土) 01:37:30
-package network
243デフォルトの名無しさん:2007/04/21(土) 02:37:43

そりゃソースはコピペできるけど直接コピーできねーじゃん
さっさと作れよハゲ
 
244デフォルトの名無しさん:2007/04/21(土) 05:30:43
>>241
ghc --make でおk
245241:2007/04/21(土) 18:33:23
>>242,244
コンパイルできました。
ありがとうございます。
246デフォルトの名無しさん:2007/04/23(月) 17:38:57
それにしても、Haskellの世界は狭すぎるから、質問内容によっては素性がバレバレだな・・
247デフォルトの名無しさん:2007/04/23(月) 19:32:27
ガクガクガク、、、ブルブルブル。。。w

でも、
一度も公の場所に出てなくて
質問している人もいっぱいいるでしょ。
248デフォルトの名無しさん:2007/04/23(月) 21:44:26
ということにしたいのですね
249デフォルトの名無しさん:2007/04/23(月) 21:48:30
>>248
void はこのスレ的には いてはならない存在。
250デフォルトの名無しさん:2007/04/23(月) 23:44:41
   ヘ_ヘ  ____________________________
  ミ ・ ・  ミ   [email protected]
  (  ° )〜       改名しました
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
251デフォルトの名無しさん:2007/04/24(火) 00:17:04
他のバカの名前挙げても
おまぃのダメさ加減は誤魔化しようがない。
252デフォルトの名無しさん:2007/04/24(火) 11:53:08
Parsecなのですがパース失敗時のメッセージ
(line 1, column 1):
のcolumn が常に1になってしまいます。

例えば以下のような感じです。

*Parser> runParser (reserved "test") 0 "" "testss"
Left (line 1, column 1):
unexpected "s"
expecting end of "test"

考えられる原因ってなんでしょうか?
WinXP、GHC6.6です。
253デフォルトの名無しさん:2007/04/24(火) 17:32:52
reserved を使っているから。

その場合、識別子レベルでパースしているような感じになる。「test」という
予約語と「testss」というトークンを比較して違う、というエラーなので
column が 1 になるようにわざわざしている。

(string "test") にしてみたら変わるでしょ。
254デフォルトの名無しさん:2007/04/24(火) 18:27:01
>>253
おっしゃるとおり変りました。
回答ありがとうございました。

*Parser> runParser (do {reserved "test"; (string "test")}) 0 "" "test te11"
Left (line 1, column 6):
unexpected "1"
expecting "test"

255252:2007/04/24(火) 18:30:13
というか
*Parser> runParser (string "test") 0 "" "te11"
Left (line 1, column 1):
unexpected "1"
expecting "test"

stringでも先頭でしたね…
256デフォルトの名無しさん:2007/04/25(水) 22:19:08


Haskellってどういう処理につえーの?
どういうアプリケーションに向いてんの? 
 
257デフォルトの名無しさん:2007/04/25(水) 22:47:24
HaskellはHaskellコンパイラを書くのに最適
258デフォルトの名無しさん:2007/04/25(水) 22:57:56
ただし国際化対応は諦めろ
259デフォルトの名無しさん:2007/04/27(金) 08:02:47
GHC 6.6.1 あげ
260デフォルトの名無しさん:2007/04/27(金) 13:35:53
まだLinux版だけか・・・
261デフォルトの名無しさん:2007/04/27(金) 19:34:57
>>258
よくしらんのだが国際化対策を
しないっていう理由があるの?
262デフォルトの名無しさん:2007/04/27(金) 19:48:06
Windows環境って何でShift-JISなんだろ。
なんかむかついてきたぞー
263デフォルトの名無しさん:2007/04/27(金) 19:54:19
UNICODEで統一すりゃいいだろ
264デフォルトの名無しさん:2007/04/27(金) 20:37:18
Unicode と言っても符号化方式が色々あってだな。
265デフォルトの名無しさん:2007/04/27(金) 20:53:04
UNICODE と言ってるから UCS-4 なんじゃないの
266デフォルトの名無しさん:2007/04/27(金) 20:55:36
UCS-4 は Unicode じゃなくて ISO/IEC 16646 でだな。
267デフォルトの名無しさん:2007/04/27(金) 20:56:12
UTF-8でもBOMありとなしがあったり、なんか統一感ないよねー
268デフォルトの名無しさん:2007/04/27(金) 20:58:02
MS様に従っておけば間違いない。
269デフォルトの名無しさん:2007/04/27(金) 21:02:10
早くMS潰れねーかな、かな
270デフォルトの名無しさん:2007/04/27(金) 21:08:37
16646 じゃなくて 10646 だよ。typo った。
271デフォルトの名無しさん:2007/04/27(金) 23:05:24

タイポ タイポ ティンポー!!
 
272デフォルトの名無しさん:2007/04/28(土) 00:37:04
UTF-8はBOMなしが標準じゃなかったっけ。
273デフォルトの名無しさん:2007/04/28(土) 00:52:30
つーかエンディアン非依存なのがUTF-8の長所の一つじゃないのか
274デフォルトの名無しさん:2007/04/28(土) 01:39:55
>>273
UTF-8の場合、BOMはBOMとしてではなくUTF-8であることを示す為に利用される。
275デフォルトの名無しさん:2007/04/30(月) 15:06:46
メインのサイト死んでるじゃん
276デフォルトの名無しさん:2007/04/30(月) 15:15:07
>>275
http://www.haskell.org/index.html のこと?
うちからはつながったけど。
277デフォルトの名無しさん:2007/04/30(月) 15:20:00
復活してる
278デフォルトの名無しさん:2007/04/30(月) 15:47:42
Haskell死んでるじゃん
279デフォルトの名無しさん:2007/04/30(月) 16:15:01
> main :: IO ()

   ∩___∩     /゙ミヽ、,,___,,/゙ヽ
   | 丿     ヽ    i ノ       `ヽ'
  /  ○   ○ |    / `(○)  (○)´i、 
  | U  ( _●_)  ミ  彡,U ミ(__,▼_)彡ミ 
 彡、    |∪| ,,/   ,へ、,   |∪|  /゙
 /  ヽ  ヽノ  ヾ_,,..,,,,_ /  '  ヽノ `/´ ヽ
 |      ヽ  ./ ,' 3  `ヽーっ  /     |
│   ヾ    ヾl   ⊃ ⌒_つ ソ      │
│    \,,__`'ー-⊃⊂'''''"__,,,ノ   |

> arashi = "先生 Haskell が生きてるの"
> main = putStr "はいはいわろすわろす"

   〃∩ ∧_∧
   ⊂⌒(  ・ω・)  はいはいわろすわろす
     `ヽ_っ⌒/⌒c
        ⌒ ⌒
280デフォルトの名無しさん:2007/04/30(月) 17:57:49
Haskellのサイトってなんでこんなにすぐ落ちるんだ?
281デフォルトの名無しさん:2007/04/30(月) 18:04:07
          ∋oノノハヽ
            川o・∀・) o <終了後、スタッフ一同で美味しく頂きました
            (    づ_,..................,____
         _,,...!-‐'''" ̄          ̄~`''ー-.、_
       ,,r‐'"      ,r-ー、..,,,,r''""゙`ヽr-、,、_    ~`ー、
     ,r''"     r'~゙ヾ'"          "  ヽ,_      ゙ヽ,
    ,r"      ,r"~                  `'ヽ,、_    ゙:、
   ,i"     r'"                       ゙''j     ゙:,
  ,!     ,i'"   _,,,,,,,,_         _,,,.___,.,  __,、,   "ヽ,    l,
  |    ,r'.;:'"~:::"::::::::::::::~`''''ー―::::'''''"::::::::::::::::~~::::::::゙''"`ー:'''':、   |
  i,   ,r'::r:::::ヾ;::::::::::ヾ;;;;;ソ::、::ソ:::::(;;;;シ:::ヾ::::::,r':,r、:::::::::::::::::::::::::::゙i   ,!
   ゙i  !;:::::ヽ'''::::::::::::::::::::::::::::::::::::::シ:ヾシ:::::::::::::::〉::::::::'''''シ:::::::::::::::::ノ ,:'
   ゙i、 ゙i、:::::::::〈:::::::::ヾ:::::::::::::::::::::::`ー''"::::::::::::::::::::::::::::::::::::::::::::,r" ,r'
    ゙ヽ、゙ヾ::::::::::::::::::::::::::::::::::::::::::::::ーミ;;;:::::::::::::::::::::::::::::::::::,,r'" ,r'
      ゙ヽ、~゙ヾ;:::::::::::::::::::::く:::::::::::::::::::::::::::::::::::::::::::::::,,,r''",,r''"
         `ー-ニ_ー--、::::::::::::::::::::::::::::::::::::_,,,,,,r‐'二.:r''"
             ~゙`''''ー---゙二二二~--―''''"

          ハスケル・ブルックス・カリー
              [1900-1982]
282デフォルトの名無しさん:2007/05/01(火) 00:27:03
仮想化とは対象物を不完全ながらもその性質や姿を模倣し現出させることだ。
対して抽象化は、対象物のある特徴的な側面を抽出し概念化することだ。
仮想化で抽象化の技術が使われることはあるだろうが、その逆は考え難い。
コンピュータを使い、扇風機やコタツを抽象化することはできても、仮想化する
ことはできないのだ。少なくとも今の技術では無理だ。コンピュータがその姿形
を変えることはできないのだから。コンピュータが仮想化できるものは、コンピュー
タそのものが直接扱うものだけだ。例えば、仮想メモリ、仮想ネットワーク、仮想
マシン、仮想キーボードといったものだ。

抽象化した結果表現されるものは、設計者が想定した概念やイメージだ。しかし、
実在するものそのものではなく、人が考えたものであるために、このイメージは
非常に脆く、不安定だ。外部からの影響をもろに受け、形を変え易い。個々人が
持つイメージの些細な相違から認識のずれが生じ易い。扇風機の使い方は人に
よって異なることはないが、人がイメージしたものは、その生成から、破棄に至る
まで、非常に不安定な状態になり易い。それを防ぐには、イメージそのものをなる
べく強固なものにし、インターフェースに一貫性と整合性をもたせ、外因による影響
を受けに難くく、壊れ難くするための技術を見につけ、理解を深めておくしかない。
283デフォルトの名無しさん:2007/05/01(火) 11:30:03
チャーシュー麺食ってきた
284デフォルトの名無しさん:2007/05/01(火) 11:42:53
>>282
長すぎて読む気しない
285デフォルトの名無しさん:2007/05/01(火) 13:51:39
>>283
長すぎて読む気しない
286デフォルトの名無しさん:2007/05/01(火) 15:15:30
麺食らった.。
287デフォルトの名無しさん:2007/05/02(水) 06:39:55
>>282は確かに冗長な文章だが、
「長すぎて読む気しない」と書き込んでその反映を確認する時間より>>282を読む時間のほうが長いとか、
この程度のもの読むのに「労力」の存在を意識してしまうとか、そういう低学歴のたぐいは問題外。
288デフォルトの名無しさん:2007/05/02(水) 22:08:44
>>287
ここが2chだという自覚のない基地害
289デフォルトの名無しさん:2007/05/02(水) 23:55:21
>>287
長すぎて読む気しない
290デフォルトの名無しさん:2007/05/03(木) 00:14:50
>>288
唐突に関係ない概念を持ちだして逃げてはいけません :-)
291デフォルトの名無しさん:2007/05/03(木) 10:09:40
ということにしたいのですね?

   ヘ_ヘ  ____________________________
  ミ ・ ・  ミ   [email protected]
  (  ° )〜      
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
292デフォルトの名無しさん:2007/05/03(木) 12:33:15
マトリックスの中にあるコタツは仮想コタツなんじゃね?
293デフォルトの名無しさん:2007/05/03(木) 12:36:47
行列の中にコタツ?
294デフォルトの名無しさん:2007/05/03(木) 19:42:27
295デフォルトの名無しさん:2007/05/04(金) 20:09:43
すいません。
自分の$HOME以下にライブラリをインストールした際に、
そのパスをghcに見つけてもらうにはどうしたら良いでしょうか
296デフォルトの名無しさん:2007/05/04(金) 20:14:48
>>295
マニュアルを読んでそれに従う
297デフォルトの名無しさん:2007/05/04(金) 20:14:54
>>295
ghc-pkg -list
して、インストールしたはずのライブラリがのってる?
298デフォルトの名無しさん:2007/05/07(月) 00:07:16
モナドってどの位使うもの?
IOは別としても、Maybeやリストを単体じゃなくてdoや>>=でバリバリ繋いだり、
あるいは合成モナド作ったりとかって実際のプログラムでどの位やるもの?
299デフォルトの名無しさん:2007/05/07(月) 00:59:58
コードは残ってないから見せられないけど、 HTML テンプレートを XHTML で
書いて、置換用のデータを Map でもたせ、 Reader で処理するというプログ
ラムを書いたことがあるよ。
そのとき、一部のデータは IO で読まないといけなくなり(実行したときの
日付とかそういうやつな)、けっきょく ReaderT IO になった。

あと IO 処理で繰り返しっぽくなりそうなのを ListT にしたりすることはある。
300デフォルトの名無しさん:2007/05/07(月) 01:32:24
>>287
長すぎて読む気しない

>>300
Y
301デフォルトの名無しさん:2007/05/07(月) 01:33:16
どうもです。自分は理解だけであっぷあっぷの状態なので、
これを実践での広い応用範囲が想像できないけど、
使い慣れたら、バリバリ使って格段に楽になって保守性もぐんと上がるもんでしょうかね。

お勉強レベルのサンプルだと、結局3行のコードが2行になる、とかそんな程度だけど。
302デフォルトの名無しさん:2007/05/07(月) 07:36:50
>>298
ちょっと気になったので適当なコードで"do"をgrepしてみた。結果。

IO: 58
StateT Cont: 38
Maybe: 20
Parsec.GenParser: 19
Either: 17

IO以外も結構使ってる。
303デフォルトの名無しさん:2007/05/07(月) 17:07:06
>>300
Yコンビネータで再帰ですか?
304デフォルトの名無しさん:2007/05/08(火) 12:50:56
>>303
ワロタ
305デフォルトの名無しさん:2007/05/11(金) 00:14:52

1〜100までを出力するにはどうすりゃいいのよ 
 
306デフォルトの名無しさん:2007/05/11(金) 01:33:26
mapM_ print [1..100]
307デフォルトの名無しさん:2007/05/11(金) 04:02:44
print 1
print 2
print 3
...
print 100
308デフォルトの名無しさん:2007/05/12(土) 18:58:15
newtype P r a = P ((a -> r) -> a)

unP :: P r a -> (a -> r) -> a
unP (P x) = x

instance Monad (P r) where
  return x = P $ const x
  P f >>= g = P $ \k -> unP (g (f (\v -> k $ unP (g v) k))) k

こんなモナドを見つけたんですが、既に名前が付いていたりしますか?
ReaderとContを合わせたようなやつです。
309デフォルトの名無しさん:2007/05/12(土) 23:12:52
>>308
具体例は何?何を抽象化してモナドにしたの?
モナドが見つかったとしてもそれを適用してかつ使えるものじゃないと。
310デフォルトの名無しさん:2007/05/13(日) 09:27:00
>>309
モナド自体が珍しい訳じゃないのか。

>何を抽象化してモナドにしたの?
自然言語の、「普通のもの」とか「平均的なもの」という表現をHaskellでも使えないかな、と思った。
「普通のものを食べていれば大丈夫」という表現で、「普通のもの」の意味を決めるには
「食べる」という継続が必要、とか。

>具体例は何?
あまり役に立つものは作れそうにないけど、

withpc :: ((a -> r) -> P r a) -> P r a
withpc f = P $ \k -> unP (f k) k

runP :: P r r -> r
runP (P f) = f id

maxone, minone :: (Ord r) => [a] -> P r a
maxone es = withpc $ \f -> return $ maximumBy (\x y -> compare (f x) (f y)) es
minone es = withpc $ \f -> return $ maximumBy (\x y -> compare (f y) (f x)) es

test :: Int
test = runP $ do
  x <- maxone [1, 7, 9] -- 最終結果をなるべく大きくするように選ぶ
  y <- minone [2, 4, 9] -- こちらは小さくするように選ぶ
  return $ x^y `mod` 23

-- ふつうの継続モナドと違って、偽物の継続を渡すこともできる。
fork :: (a -> P r b) -> (a -> P r b) -> P r a -> P r b
fork real fake (P f) = P $ \k -> unP (real $ f (\v -> k $ unP (fake v) k)) k
311デフォルトの名無しさん:2007/05/14(月) 22:55:55
Enumのinstanceになる型を宣言する方法を教えていただけますでしょうか
範囲がIntに収まる場合はわかるのですが、それより大きい範囲を使いたい
場合はどのようにすればよいでしょう。

class Enum a where
toEnum :: Int -> a

となっていてIntに収まらないといけないのかとも思ったのですが、

instance Enum Integer

とあって、下のsuccも動くのでできるのかもと。

Prelude> succ 1000000000000000::Integer
1000000000000001

とんでもなくアホな事を聞いてたらすいませんです。

312デフォルトの名無しさん:2007/05/14(月) 23:06:57
>>311
Haskellレポートの6.3.4によると、fromEnumやtoEnumは変換できない場合には
実行時エラーを発生させて良いらしい。
その場合、succ,predなどについてデフォルトメソッドを使うわけにいかないから、
全て自分で定義を与えるしかない。
313デフォルトの名無しさん:2007/05/14(月) 23:19:00
素早いご回答ありがとうございます。

> 全て自分で定義を与えるしかない。
なるほど、こういう方法があるのですね。
挑戦してみます。
314デフォルトの名無しさん:2007/05/15(火) 00:06:19
>>310
考えてみる。いつになるかわからないけど。

>モナド自体が珍しい訳じゃないのか。
わからない。でも実際使えるモナドなら確実に珍しいはず。

それとMonadだけじゃなくてFunctorも定義しておかないとモナドにならない。
315デフォルトの名無しさん:2007/05/15(火) 00:11:22
「使える」は「実用的」の意。
316デフォルトの名無しさん:2007/05/15(火) 00:43:12
>それとMonadだけじゃなくてFunctorも定義しておかないとモナドにならない。
Monadを定義すればFunctorは決まりませんか。
fmap = liftM = (\f x -> x >>= return . f)
317デフォルトの名無しさん:2007/05/16(水) 05:29:18

次期Haskell(1.6?)って、いまメーリングリストでどんなやり取りしてんの?
日本語でおせーて
 
318デフォルトの名無しさん:2007/05/16(水) 13:16:09
Haskellバブルは完全にはじけてしまったな
319デフォルトの名無しさん:2007/05/16(水) 13:50:17
本だけじゃ結局モナドがよー分からんかった。
320デフォルトの名無しさん:2007/05/16(水) 14:16:16
>>319
普通のデータ型あんだろ?
data A = B Int | C String
みたいな。
データ型を用意して、return とか (>>=) とか (>>) とかの関数を用意すれば立派なモナドだよ。
321デフォルトの名無しさん:2007/05/17(木) 01:05:07

質問
Javaってプリミティブ型(char, int)とオブジェクト型(String)があるけど、
HaskellのCharやIntは、全部Object型みたいなもんなの?

もしそうなら、Javaに比べて必然的にメモリ使用量は多くなる?
 
 
322デフォルトの名無しさん:2007/05/17(木) 01:14:27
CharやIntはそう。前スレでは[Char]は一文字あたり20Byte使う、という話が出てた。
323デフォルトの名無しさん:2007/05/17(木) 01:14:37
>>321
Haskellにもプリミティブデータ型が存在します。
Char や Int などはプリミティブです。
String は Char のリストとして表現されますので、メモリ使用量は多くなります。
すべての場合において Java より Haskell の方がメモリ使用量が多いかどうかはしりません。
324デフォルトの名無しさん:2007/05/17(木) 06:55:15
>>321
CharやIntは、ユーザが同等の型を自分で定義することが非現実的、という点でプリミティブだけど、
他のあらゆるデータ型と対等に扱える(多相関数に渡せ、多相データ型に保持できる)ことと、
基本的に参照(ポインタ)を介して操作される、という点では明らかにオブジェクトに近い。
例えば、データ構造中にIntを一個保持するには、普通、ポインタ一個分と整数一個分の
領域が必要になる。

GHCでは、「真の」プリミティブ型としてInt#やChar#などが使える。(非ボックス化型、unboxed typeという)
これはJavaのプリミティブ型に相当するもので、多相関数に渡せない。これを使って、例えばIntは
data Int = I# Int#
と定義されている。(I#は単なるデータ構築子の名前)
325デフォルトの名無しさん:2007/05/18(金) 00:58:49
>>324
ベストアンサー賞を授ける
326デフォルトの名無しさん:2007/05/18(金) 19:21:57
data Hoge = Hoge { one::Int two::Int }
で必ずoneの方が小さい値になるようにしたい時とか

data Hoge = Hoge Int
でIntの値をある範囲におさめたい時とかどのようにすれば良いでしょうか。

宣言のしかたや、コンストラクタでなんとかできるものですか?
後者については最初はBoundedでなんとかできるかと思ったのですが
勘違いをしていたみたいですし。


327デフォルトの名無しさん:2007/05/18(金) 19:37:17
type Hoge' = { h in Hoge | (one h) < (two h)}
328デフォルトの名無しさん: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

ヒントか記載いただいた記法に関して説明されているところ
など教えていただいてもいいですか?
329デフォルトの名無しさん:2007/05/18(金) 22:41:15
>>326
直接の言語サポートがないので、そういうときは抽象データ型を使うのが普通。
不変条件を侵さないように注意深く操作を定義して、
モジュールからはそれらの操作だけをエクスポートし、データ構築子は隠しておく。
ユーザは公開された操作だけを使うから、不変条件は自動的に守られる。

>>327
それはどういう方言?実装ある?
330デフォルトの名無しさん:2007/05/19(土) 00:47:39
おお、ありがとうございます。

そういう方法が!
定石とかも全く知らないので大変助かりました。

memomemo
http://www.sampou.org/haskell/tutorial-j/modules.html
> 11.2 抽象データ型
331デフォルトの名無しさん:2007/05/19(土) 02:46:37
>>316
亀レスすまそ。
>Monadを定義すればFunctorは決まりませんか。
>fmap = liftM = (\f x -> x >>= return . f)

それは確かにそうなるのだけどそれは
自然変換が「自然」になっているからそうできるだけで
(注:あんまよくわかっていない)
わざわざそれで定義するのは変な気がする。

--けれどももしかしたらFunctorクラスで作られているのは普通の函手で
--fmap = (\f x -> x >>= return . f)
--これは自己函手と見るべきなのかも知れないとか思ったり。

332デフォルトの名無しさん:2007/05/19(土) 02:49:16
でもそれよりもなによりも、モナドつくる手順が逆なんだよ。
普通モナドを作るならまず函手と自然変換を考えなきゃ。
たぶんモナド作るなら(注:完全な私見)

自然変換(なんかやりたい操作)が思いつく
   |
なにを函手とすればいいのか思いつく。
   |
モナドにはならないけどとりあえず元々やりたかった操作が
実現できる。
   |
モナドになるように元々の考えを洗練。
   |
モナドになる or モナドにならない

という風になるんじゃないかと思いながら考えている。(全然知らんが)

多分、モナドになることを最初の目的として作っても
トリビアルな物しかできないんじゃないかなやっぱし。
最初からモナドを意識しなくても考えを突き詰めに突き詰めて
洗練に洗練を加えた構造が見出せれば勝手にモナドになっていると思うし。
333デフォルトの名無しさん:2007/05/19(土) 09:08:43
たとえばIOモナドだと、その各ステップは何に対応してるの?
334デフォルトの名無しさん:2007/05/19(土) 22:56:39
初心者向けの勉強会ないかお?
335デフォルトの名無しさん:2007/05/20(日) 13:01:37
ここの人たちはhaskellで何を作ってるんだろう
336デフォルトの名無しさん:2007/05/20(日) 13:03:18
ドモホルンリンクル
337デフォルトの名無しさん:2007/05/21(月) 22:48:28
ここしかHaskellの質問できそうなとこないから質問だけど
wxHaskellを解説してるサイトで、
>普通に圧縮したら6MB弱にしかならなかったのでこりゃ駄目だと
>思ったら余分なデータの削除なるオプションで500KB弱になった。
って記述があったんだけどなんてコマンドなの?


調べたらstripってのがあるらしいんだけど使えないしGHCのマニュアルにも載ってないし
338デフォルトの名無しさん:2007/05/21(月) 22:52:06
>>337
winならcygwin入れれば使えるよ
339デフォルトの名無しさん:2007/05/21(月) 23:21:14
happyの生成codeをghcでコンパイルすると、気が狂う程遅い。
メモリも2G近く消費するし。
O0でも遅い。
O-1とかないのだろうか。
340デフォルトの名無しさん:2007/05/21(月) 23:39:18
きっと最適化オプションを付けてコンパイルしたコンパイラを使えばいいんだよ。
341デフォルトの名無しさん:2007/05/22(火) 00:07:19
Haskell使える、と言えるというか実際使えるには、どの辺まで理解すればいい?
ふつうのHaskell読んだけど、どうもこれだけじゃ全然不足みたいで、
ファンクタだのArrowだのモナドの合成だの、どこまであるのか、やればいいのか見えない。
とりあえずココまで、みたいなのってある?
342デフォルトの名無しさん:2007/05/22(火) 01:28:49
>>333
未だに自然変換が理解できていないせいかなんともわからん。
「自然」ってどういうことなんだろう?
343デフォルトの名無しさん:2007/05/22(火) 01:31:34
>>341
とりあえずライブラリ読めば?
344デフォルトの名無しさん:2007/05/22(火) 05:53:37
>>341
自分の作りたい物が作れるまで。
作りたい物のない「勉強のための勉強」は苦痛でしかないから止めとけ。
345デフォルトの名無しさん:2007/05/22(火) 08:10:42
>>342
実際「役に立つ概念」ってのはそう多くなくて,自然に定義する限り
まともな概念はだいたいモナドになってくれるはず.
(ならないものはだいたい使い物にならない概念だと思う)
332 の流れに沿って IO の文字表示の部分を解釈すると:

1. まず「画面に何か表示する計算」を定義したいと思いつく.

2. 画面の状態を表す型を W で表すことにすると,函手は
  T X = (X, W),T f = (f, id) とするとよさそうな気がする.

3. 画面に何か表示する関数 f : X -> T X があったとき,
  その持ち上げ f*: T X -> T X は
   f* (x,u) = (y, w)
    where (y,v) = f x, w = (u と v を合成した状態)
  が自然な気がする.

4. 型 X の T X への読み替え j : X -> T X は
  j x = (x, w) where w = (何も表示されていない状態)
  が自然な気がする.

5. 上で定義した三つ組み (T, j, *) はモナドになっている.
346デフォルトの名無しさん:2007/05/23(水) 00:27:21
>>345
さすがです・・・。というかどこまでわかっているんですか・・・。

とりあえず保存しました。
いつか自然に理解できるようになりたいです。

にしても
> が自然な気がする.
表現から類推するだけですけど
本当に自然に自然かどうかわかるようになるんですね・・・。


やっぱり「自然」はかなり強力な概念なのか。
347デフォルトの名無しさん:2007/05/23(水) 01:38:10
# はじめに訂正:345 の 3 は f: X -> T X でなくて f: X -> T Y.

>>346
345での「自然」は、厳密な意味の自然変換というよりは
直感に整合する,というくらいの意味で使ってる.
(ただし,それは普通は自然変換になるんだけど)

実のところ,結構適当な関数を選んでも自然変換になっていて,
たとえば 4 の読み替えのところを次のようにしてやる:

 j : X -> T X を j(x) = (x, "Hello"と表示)

これでも j は自然変換になる.逆にどんなのが自然変換に
ならないかというと,読み替えが X に依存するとき,たとえば

 i : X -> T X を j(x) = (x, "これの型は X"と表示)

とすると自然変換にはなっていない.まあ一般の
「画面情報付きにする」関数が,型によって違う挙動をするのは
不自然(つけてるのが単なる画面情報じゃないはず)だよね.
348デフォルトの名無しさん:2007/05/23(水) 01:45:16
>>343
そうか。
標準ライブラリの範囲か。それはよさそう。

>>344
でも、せっかくの道具を知らずにゴリゴリはイヤだよ。
349デフォルトの名無しさん:2007/05/23(水) 01:45:55
続き.実はいま定義した i ってのは「画面に何か表示する」
というよりも「型情報を表示する」ような操作と考えるのが自然.
これは i に対して定義すべき函手が T ではなかったことを意味している.

そこで新しい函手 U を型について次のように定める.

 U X = (X, Xの型情報を表示している画面状態)

このとき関数 f: X -> Y に対する作用 U f : U X -> U Y は次が妥当:

 (U f)(x, "これの型はX") = (f(x), "これの型はY")

さらに,X から型情報付き Y への関数 f : X -> U Y があったとき
これの持ち上げ f*: U X -> U Y ってのは

 f*(x, "これの型はX") = (y, "これの型はY")

が意味的に普通.このとき (U, i, *) はまたモナドになっている.

#というわけで,そんなに自然変換にこだわらなくても適当に
#それっぽく定義をしておけば,勝手にモナドになってくれてるもんです.
350デフォルトの名無しさん:2007/05/23(水) 13:01:35
そうはいうがな、大佐。

そもそも"それっぽく定義"とやらができるようになるまで
かなりの訓練が必要かと思われるのですが。
351デフォルトの名無しさん:2007/05/23(水) 23:24:56

いえいえ、少佐。

それ以前に私にはあなた方の使用している文字列が
日本語と認識できないのです。
 
352デフォルトの名無しさん:2007/05/24(木) 01:13:52
>>347,349
>345での「自然」は、厳密な意味の自然変換というよりは
>直感に整合する,というくらいの意味で使ってる.
>(ただし,それは普通は自然変換になるんだけど)

それはなんかわかります。っていうかいままで言ってきた
それっぽいことはほぼそれを仮定しています。
それゆえに自然は理解したいんです。

>#というわけで,そんなに自然変換にこだわらなくても適当に
>#それっぽく定義をしておけば,勝手にモナドになってくれてるもんです.

というわけでこれも同意です。でも、当分自然変換にはこだわると思います。


IOモナド・・・なんだか自分にとってそのうち黒歴史に
なっていく予感がしますがやっぱり面白そうですね。
#ちなみに函手 T だとまずいから函手 U に変更って部分がわからないです。
#必要性はなんとなくわかりますが函手を変更しても、うまく整合して
#モナドになってくれるというところが見当もつきません。orz

>>350
>そもそも"それっぽく定義"とやらができるようになるまで
>かなりの訓練が必要かと思われるのですが。

確かに。うーん。でもとある方向性をもちながらHaskellやっていれば
なんとなく"それっぽく定義"がなんとなくわかるようになるような気もする。
というかHaskell作った人たちはそうなるように作っているような気がする。
353デフォルトの名無しさん:2007/05/24(木) 01:26:42
銭やったモナドった。
354デフォルトの名無しさん:2007/05/24(木) 01:57:55
      ,.イ´| ̄`ヽr<´ ̄  ̄`ヾ´ ̄ `ヽx''´ ̄「`丶、
     / _|ノ   ├〈,.-―     ;. _  ,ゞ--'、:\___lヽ
     ,':∨::\  /´ ̄  ̄`ヽ ヽ/´  `ヽ、-.、 \::::::::::',
      |、_;/ /  /´   ,.     、  、  \. \ \―|
      ’、  /  /  ,.  / / ,ハ ',.  ヽヽヽヽ  \ヾ/
      \_/:/:/:./ , / .,' / // | l | , l: | ', ',. ! l  :',!|
          |/:/::/:/:/:! l | { /|:!  l l } !ノ|::,!l | :| |::|:::::::|ノ
         |:/l/:/:::,|::|:{イ⌒lヾゝ ノノイ⌒lヽ|:::!::}:;!::l::::::/
        |::/|/l::/l';:{ヾlー''!     lー''!/リノノ/::/:l::/
          || |:/リ、|::l;ゞ ̄´´  ,.  ` ̄" ハ:lリノノノ'
          リ |' __,⊥!、 " " r===、 " " /ノノ  ||
        '/´\:: : \   ヽーノ  /`ーァ-、 ヾ、
       _ /     li : . ',.`ヽ、 _ ,.イ´ /.ノ::l|  ヽ \____
.    /'/       |l   ヽ `Y´ / './ . :l|   |、 /  /
      \l      |l,   \\_!_/ ‐ ´   、!|   | |\ ̄
        |      /; ´     ` ‐  ,     ヽヾ   ! \|
       |    /       ヽ::/      `ヽ |
      |     ,'        `         ', !  他のスレに貼り付けると
.       |   |::: ヾ             ヾ  .:| .|  おっぱいがポロリする
        |   '、:::.:.. .     ―       . .:.:::,' ! 不思議なギガバイ子コピペ。
       ',.     \_:::.: : :_二二二:_: : : : .:.:.:.:::/ ,'
       ':、   ト、 ̄ ´.:.:.::::::::::.:.:.:.` ―┬ '′ /
        \  |l ヽ            l|  /
.           `/,'  ヽ \         ',/
          ∧ヽ   \ \:.:.:..    ∧
355デフォルトの名無しさん:2007/05/24(木) 13:17:05
プロジェクト・モナドゥ
356デフォルトの名無しさん:2007/05/24(木) 21:25:01
モナドう無用!
357デフォルトの名無しさん:2007/05/25(金) 02:19:16

PowerShellのことだな?
 
358デフォルトの名無しさん:2007/05/25(金) 23:28:50
こんな関数定義をみたんだけど、
swap ~(x,y) = (y,x)
この~って何?
359デフォルトの名無しさん:2007/05/26(土) 00:08:03
ぐぐれ
360デフォルトの名無しさん:2007/05/26(土) 05:07:31
>>358
遅延パターンと言って、引数を評価せずに即座に照合が成功し、
導入された変数(その例ではxやy)の値が必要になって初めて評価が起こるようなパターン。例えば、
swap' (x, y) = (y, x)
と定義すると、
case swap' undefined of (_, _) -> 4
はundefinedだけど、
case swap undefined of (_, _) -> 4
は4になる。

>>359
それは無茶だw
361デフォルトの名無しさん:2007/05/26(土) 12:13:28
「やさしいHaskell入門」には書いてあったよね。
http://www.sampou.org/haskell/tutorial-j/patterns.html#tut-lazy-patterns
でもおれは使ったことないなあ……
362デフォルトの名無しさん:2007/05/26(土) 12:29:44
どうせだからすべてにチルダつけとけば?
363デフォルトの名無しさん:2007/05/26(土) 12:31:42
ITProのshelarcyさんの記事にも書いてあります。
(この人絶対このスレ見てる・・・)
http://itpro.nikkeibp.co.jp/article/COLUMN/20070305/263828/
364デフォルトの名無しさん:2007/05/26(土) 13:07:22
>>363
ヤツはそんなとこで記事書くようになったのか?
出世したもんだ。
365デフォルトの名無しさん:2007/05/29(火) 00:48:25
>>363
未だにshelarcyの読み方が分からないっす
366デフォルトの名無しさん:2007/05/29(火) 23:11:21
>>365
読みを探そうと思ってヤツのホムペ行ったら・・・なんだよこれw
367デフォルトの名無しさん:2007/05/30(水) 21:40:17
Haskellには再代入がないっつーけど、
いまだに理解できないオレ、へたれ♂

Javaでいうと常にfinalってことか?

ある関数に引数を渡すと、必ず同じ値が返ってくるとか言うけど、
引数に3を与えても、5を与えても同じ値が返ってくるのか?


我ながら根本的に理解してないようなんだが、
だれか助けて。
ちなみに「ふつける」は半分以上読みました
368デフォルトの名無しさん:2007/05/30(水) 21:42:03
ふつける半分以上読んでその理解力ならたぶん無理だろう
369デフォルトの名無しさん:2007/05/30(水) 21:48:01
haskellは自動で並列化してくれますか?
370デフォルトの名無しさん:2007/05/30(水) 22:01:10
>>367
>ある関数に引数を渡すと、必ず同じ値が返ってくるとか言うけど、
>引数に3を与えても、5を与えても同じ値が返ってくるのか?
違う。ただし、「同じ」引数を渡せば、必ず同じ値が返ってくる。

>>369
仕様では決まってないから処理系依存だと思う。
ただ、現在出回ってる処理系はどれも自動並列化はしないと思う。
371デフォルトの名無しさん:2007/05/30(水) 23:20:46
>>367
代入っつーかバインド
数字に記号あてはめてんの
372デフォルトの名無しさん:2007/05/30(水) 23:25:16
>>367
俺はお前に教えられるほど超人的な指導力は持ち合わせていない
373デフォルトの名無しさん:2007/05/30(水) 23:54:26
>>367

>Haskellには再代入がないっつーけど、いまだに理解できないオレ、へたれ♂
>Javaでいうと常にfinalってことか?

わかってんじゃんw

> ある関数に引数を渡すと、必ず同じ値が返ってくるとか言うけど、

「ある関数に『同じ』引数を渡すと…」に決まってるだろw

それに対して、
class A{    int a; int inc(){return a++;}} の inc()
は毎回違う。
変数が全てfinalだと、
class A{final int a; int inc(){return a++;}}
となるが、これはコンパイルエラー。だから
class A{final int a; int inc(final int 前の結果){return 前の結果+1;}}
とするしかない。これがHaskellの流儀。
それだけのこと。
374デフォルトの名無しさん:2007/05/31(木) 01:01:54
Arrowってどの位使うもの?っていうか、何が嬉しいの?
っていうか、Arrow以前にポイントフリースタイルって何が嬉しいの?
Arrowも単にスタイルだけの問題?
375デフォルトの名無しさん:2007/05/31(木) 01:13:15
>>374
> ポイントフリースタイルって何が嬉しいの?
変数書かなくていいからきれいすっきり。ただそれだけ。
376デフォルトの名無しさん:2007/05/31(木) 03:12:47

関数型言語ってGoFのデザインパターンをつかえんの?
ぜんぜん無理?
 
377デフォルトの名無しさん:2007/05/31(木) 04:20:21
>>376
haskell ではないが。
http://www.norvig.com/design-patterns/
378デフォルトの名無しさん:2007/05/31(木) 23:01:57

わかんないよ父ちゃん!
フィールドと再代入がないのに、
どうやってプログラミングすればいいんだよ


class MyInt {

  private int[ ] i;

  public void increase(int value) {
    i += 1;
  }

  public decrease(int value) {
    i -= 1;
  }

}
379デフォルトの名無しさん:2007/05/31(木) 23:09:53
父ちゃんも昔「gotoが無いのにどうやってループを書いたらいいんだ!」って言ったもんだ。
380デフォルトの名無しさん:2007/05/31(木) 23:29:58
>>378
だから、呼ぶ側で値を持ってて、引数で渡せよ。
そうすれば非finalなフィールドはいらんだろ。
つか、いろいろソース読んでソース書いてれば慣れる。
381デフォルトの名無しさん:2007/06/01(金) 01:54:23
>>378
これはひどい
382デフォルトの名無しさん:2007/06/01(金) 04:45:20
System.getArgsってコマンドライン引数から「文字列」を受け取るんだよね?
下のように2つの数値を受け取るように書くにはどう定義すりゃいいの

main 5 10
383デフォルトの名無しさん:2007/06/01(金) 07:33:59
>>382
受け取るのは「文字列のリスト」だから心配ない。
384デフォルトの名無しさん:2007/06/01(金) 08:45:52
いつだって383のことが心配だよ
385デフォルトの名無しさん:2007/06/01(金) 10:30:46
うあ、心配された。
例として、ふたつの引数の和を表示するなら、

main = do
  [a, b] <- getArgs
  print $ read a + read b

という感じで。
386デフォルトの名無しさん:2007/06/01(金) 22:29:05
にゃるほど よくわかったお 
ところで、こんなコンパイルエラーでたんだけど、どういう意味?

myIf.hs:4:16: parse error on input `='

特にダブルクォートとシングルクォーテーションの意味が知りたいのです
387デフォルトの名無しさん:2007/06/01(金) 22:58:37
「myIf.hsの4行目、16文字目に = が来るなんて予想外だお」
388デフォルトの名無しさん:2007/06/02(土) 02:09:03
fix f = let x = f x in x

これってどういうこと? x = f x って。
fがたとえば id ならまだいいけど、(+ 1)だったら?
っていうか言語的に、letの機能ってどうなってんの?
389デフォルトの名無しさん:2007/06/02(土) 02:38:41
せめてletについてくらいはマニュアルくらい読んだら?
390デフォルトの名無しさん:2007/06/02(土) 03:16:09
マニュアルって
http://haskell.org/onlinereport/exps.html#sect3.12
のこと?

定義のスコープがin の中と、そして定義の右辺、とあったけど、疑問が強まっただけ…。
fix f = let x = f x in x

fix f = let y = f x in y
と等価ってわけじゃないってことでしょ?
391デフォルトの名無しさん:2007/06/02(土) 03:43:54
>>388
やってみればわかるけど fix (+1) はループして値が定まらない。
392デフォルトの名無しさん:2007/06/02(土) 03:56:29
>>388
fix (\l -> 1:l)
とやると、[1, 1, 1, ...という無限リストができる。

fix (\l -> 1:1:(zipWith (+) l (tail l)))
とやると……。
393デフォルトの名無しさん:2007/06/02(土) 06:18:57
>>388
Haskellには遅延評価があるので、関数以外のものも再帰的に定義できる。
ones = 1 : ones
とすれば、onesは1が無限に続くリスト。
x = (1, fst x)
とすれば、xは(1, 1)。もちろん再帰的定義は常に有効な訳ではなく、
x = x
などと定義すればxを評価した瞬間に無限ループに陥るし、
x = x + 1
でも同様。

letに特有のことは何もない。モジュールのトップレベルでも同じ。
394デフォルトの名無しさん:2007/06/02(土) 13:49:10
ところでみんなHaskellで,どんなプログラム書いてるの?
仕事で使っている人とかいる?
395デフォルトの名無しさん: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でも無限ループだよね?
396デフォルトの名無しさん:2007/06/02(土) 18:04:28
このスレのレベルが急速に低下してるな……
397デフォルトの名無しさん:2007/06/02(土) 18:47:19
>>395
おk。
idでも無限ループ。

>一部だけは取り出せる
完全に取り出せることもある。fが(const 4)のときとか。
398デフォルトの名無しさん:2007/06/02(土) 23:43:50
>>396
レベルが低下しているというかそもそも高くなっていない。
本質的に何も言っていないも同然じゃないか?
(とは言いすぎか。少なくとも一般的に使えそうにないとは感じる。)
そりゃ評価もされんわ。
399デフォルトの名無しさん:2007/06/03(日) 00:23:02
>>398
コピペにマジレスかこわるい
400デフォルトの名無しさん:2007/06/03(日) 00:30:16
400ならコピペの主は休みの日にgoogleでデパート屋上を拡大してる姿をライブカメラに流す人。
401デフォルトの名無しさん:2007/06/03(日) 00:51:50
401ならコピペの主は一生現実世界でも誰にも相手されないかわいそうな人。
402デフォルトの名無しさん:2007/06/03(日) 01:35:22
402なら俺がコピペ主

part 1の頃はレベル高かったと思う。
403デフォルトの名無しさん:2007/06/03(日) 02:04:10
さえずらずただ黙って出せっ.....! 適切なレベルのネタをっ・・・・・・!
404デフォルトの名無しさん:2007/06/03(日) 12:10:06
>>399
コピペちゃうわ
405デフォルトの名無しさん:2007/06/03(日) 13:03:26
>>404
すまん
Lisp系のスレにコピペしたの俺
406デフォルトの名無しさん:2007/06/03(日) 14:48:48
>>405
俺はMLスレ。
ていうか、なんか他のスレにもコピペがしてあるんだけど。
他にもコピペしてる奴がいるのか。
407デフォルトの名無しさん:2007/06/03(日) 15:14:42
>>396で、スレのレベルが一気に最底辺に堕ちたな。
レベルが低いと嘆きつつ、こんな最底辺のネタになるとレスが増える不思議。
408デフォルトの名無しさん:2007/06/03(日) 17:12:39
>>407
みえみえの煽りをマジに受け取るなよ
厨房じゃあるまいし
409デフォルトの名無しさん:2007/06/03(日) 20:29:30
みんなHaskellで何つくってんの?

PerlならCGIとか仕事の補助ツールとか用途があるので
まだいじる動機が見つかるんだけど、Haskellはなんか
目的が定まんないんだよね。

これまでやってきた言語とちがうっぽいので、興味はある
からここ覗いたり解説サイトとか流し読みしてるんだけど、
あと一歩、手をつけるきっかけが無いんだわ。
410デフォルトの名無しさん:2007/06/03(日) 20:34:28
仕事の補助ツールを書いてみれば良いんじゃないか?
411デフォルトの名無しさん:2007/06/03(日) 21:32:55
>>410
今まで別の言語でやってた部分をリプレースするからには、
Haskell使うとよりハッピーになれるかが決め手だろうな。

C/C++:処理速度重視、アセンブラとのインターフェースが楽。
Perl:標準入出力で事足りる場合はこっち。
Java:特定の環境ではこれしか案件がない。
Haskell:……何に使える? 何が得意?
412デフォルトの名無しさん:2007/06/03(日) 21:44:03
正規表現だとめんどくさそうなのを
Parsecでパーサー書いて処理したりとか。
413デフォルトの名無しさん:2007/06/03(日) 22:07:48
XMLをいじったり、ちょっとした言語処理系を組んだり。

俺は趣味プログラマで、シェルスクリプトとHaskell以外はあまり書かないから、
大して参考にはならんかも。
414デフォルトの名無しさん:2007/06/03(日) 23:43:34
haskellの普及にあたって最大のネックはghcのコンパイルの遅さ。
ghcはMLで書き直した方がいいんじゃないか。
415デフォルトの名無しさん:2007/06/03(日) 23:52:21
つ-O0
416デフォルトの名無しさん:2007/06/04(月) 00:33:03
>>410
日本語がへなちょこなのにか?
417デフォルトの名無しさん:2007/06/04(月) 00:35:05
>>411
haskellは習得に時間が掛かりすぎる。
遅延評価で最適なコードを書くには頭使いすぎる。
418410:2007/06/04(月) 00:39:50
手を付けるきっかけがないって言ってるから、そんなネタでやってみたらって提案しただけだが。

日本語周りぐだぐだだし、他の言語のリプレースになるなんて思ってないよ。
419デフォルトの名無しさん:2007/06/04(月) 00:42:20
あらゆるライブラリというライブラリの作りがへなちょこ。
何なんだこの言語の開発者どもは。
誰も彼もやる気が感じられねーぜ。
420デフォルトの名無しさん:2007/06/04(月) 01:36:59
>>417
頭使わないで書いていいのが遅延評価のいいところじゃないのか?
421デフォルトの名無しさん:2007/06/04(月) 02:26:12
>>395の fix ってYコンビネータ?

fix f = let x = f x in x
と、
fix f = f $ fix f
ってどう違う?
422デフォルトの名無しさん:2007/06/04(月) 02:47:30
>>421
>>>395の fix ってYコンビネータ?
Yコンビネータと同じ関数。再帰を使って定義しておいてコンビネータと呼んで良いのかは知らない。

>どう違う?
結果は同じ。素朴な実装だと、前者ではfixの呼び出し一回につきfは
一回しか呼ばれないのに対し、後者では何回でも呼ばれ得る。例えば、
let xs = fix (1:) in xs !! (xs !! n)
は、前者ではO(1)、後者ではO(n)の空間を使うはず。
423デフォルトの名無しさん:2007/06/04(月) 04:39:46
コンパイルが終わりません^^;

main = print $ bad (Very bad)
data Silly = Very (Silly -> Int)
bad :: Silly -> Int
bad (Very f) = f (Very f)
424デフォルトの名無しさん:2007/06/04(月) 10:42:30
>>420
遅延評価を最大限に生かすには手続き型よりも頭使うよ
425デフォルトの名無しさん:2007/06/04(月) 13:24:25
>>424
遅延評価を最大限に生かす、ってどんなの?
426デフォルトの名無しさん:2007/06/04(月) 18:30:20
>>415
いやO0でも充分遅いから。
427デフォルトの名無しさん:2007/06/04(月) 22:11:12
↓の画像の○の部分に関する医学的な解説をよろ
http://vista.jeez.jp/img/vi8096131420.png
428デフォルトの名無しさん:2007/06/04(月) 22:13:59
>>427
萌えキャラ化したジャイアン?
429デフォルトの名無しさん:2007/06/07(木) 01:01:46
なんかHaskellって、Perlっぽいよね。
節操がないって言うか、ポリシーがないって言うか。
430デフォルトの名無しさん:2007/06/07(木) 01:16:13
Haskellは純粋な関数型言語をつらぬいてるっていうだけでも
結構ポリシーがあるほうだと思う。
節操がないという言葉に一番当てはまるのはDあたりだと思う
431デフォルトの名無しさん:2007/06/07(木) 01:30:54
Dは節操がないというよりならず者なだけだと思う。
432デフォルトの名無しさん:2007/06/07(木) 01:30:55
むしろHaskellは制限が多すぎる。
433デフォルトの名無しさん:2007/06/07(木) 01:54:51
型推論を見て、全てが動的型だとでも思ったのかな
434デフォルトの名無しさん:2007/06/07(木) 11:39:33
DよりもNemerleの方が節操がないよ
435デフォルトの名無しさん:2007/06/07(木) 11:46:55
C/C++で実装されているperl6は近年最強のベイパーウェアと化していたが、
Haskellで実装されたperl6は既に動いている。
よってHaskell>>>超えられない壁>>>C/C++
436デフォルトの名無しさん:2007/06/07(木) 12:23:51
>>433は馬鹿か?TMTOWTDIの事に決まってるだろ。
Perlはこれ自体がポリシーな訳だが。
437デフォルトの名無しさん:2007/06/07(木) 13:37:14
でもHaskellがそうかと言われたら物凄く違和感があるのだが
438デフォルトの名無しさん:2007/06/07(木) 15:58:39
>>436はバカですか
439デフォルトの名無しさん:2007/06/07(木) 22:51:36
文体からしてそんな感じがするね
いきなり馬鹿呼ばわりする人は大抵自分が…
440デフォルトの名無しさん:2007/06/07(木) 23:52:27
>>439
自演乙
441デフォルトの名無しさん:2007/06/08(金) 00:33:42
いきなり自演呼ばわりする人は大抵...

何でもないレスが自演に見えるのは妄想性の病気だと思うんだ。
442デフォルトの名無しさん:2007/06/08(金) 01:09:18
いきなり人を馬鹿呼ばわりしたのは当の>>433な訳だが。

それはともかく、Haskellでの正当な流儀ってどうなってんだ?

みんな(.)で繋ぐのか?でもそれだけではプログラムが書けない。
doで書くのか?でもモナドだけで書くのか?てか、ほとんど手続き型じゃん。
パターンマッチで書くのか?じゃあADTってなんだ?
誰かが論文書いた?また仕様追加するの?じゃあ今までの書き方は何だったの?
443デフォルトの名無しさん:2007/06/08(金) 01:12:11
>>442
まあもちつけ。
444デフォルトの名無しさん:2007/06/08(金) 01:17:16
それはともかく、Javaでの正当な流儀ってどうなってんだ?

みんな(.)で繋ぐのか?でもそれだけではプログラムが書けない。
forで書くのか?でもwhileだけで書くのか?てか、ほとんど関数型じゃん。
定数で書くのか?じゃあenumってなんだ?
誰かが論文書いた?また仕様追加するの?じゃあ今までの書き方は何だったの?
445デフォルトの名無しさん:2007/06/08(金) 01:36:26
>>444
ネタにマジレスすると、
>>442はスタイルの話をしているわけだが、
>>444は些末な文法要素の話でしかない。
7以降、スタイルへの影響も出てくるだろうけど、
Haskellでのスタイルの不定さにはまだまだ及ばない。
446デフォルトの名無しさん:2007/06/08(金) 01:39:02
確かに Haskell のソースって do で手続き的に書いているのがほとんどだなぁ
結局実行順も状態も必要って事なんだろうな
447デフォルトの名無しさん:2007/06/08(金) 06:56:13
スタイルが不定だと何かまずいの?
448デフォルトの名無しさん:2007/06/08(金) 07:11:27
forで書くかwhileで書くかはスタイルの話だろ
てかdoで書く場合とそうでない場合って結構明確に分かれてないか?
449デフォルトの名無しさん: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
450デフォルトの名無しさん:2007/06/08(金) 11:37:32
女25歳。結婚して主婦やってる。
こっちは大学中に無難そうな野球男みつけて、彼氏が入団直後に結婚OKして卒業後ほどなく主婦。
ほとんど金なんか稼いだことないけどw。
毎日午前中は友達と電話したりフジの番組ずっと6時から10時ぐらいまで見て
旦那は気の毒ねーみたいな話してる。男らしさによればこんな腐った私らみたいなんでも
何不自由なく生活できることが男にとっての甲斐性・男冥利らしいから
ほんと助かるわ。マゾかと思ってしまう・・・みたいな話。
午後は基本的にいいとも→ごきげんよう→ザワイド(3時まで)ははずせないかな〜。
そこから買い物でかけたりオバサン同士で話したりして、5時前に帰ってきて7時までスーパーニュースかなあ。
30分くらいで適当に晩飯作って自動で洗ってくれる風呂のボタン押して8時から11時ぐらいまではまたテレビw

同じ25歳でも、片やこっちは専業主婦と言う立派な職業で
職歴として堂々と語れて、しかも「女性として社会に活躍するのをあきらめて
旦那さんを一生支える決意したなんてすばらしい女性なんだ」と言われるw。
いや、単に楽だし安心だからなんだけどw。支えるなんてことほとんどしてないよw。
片や男の子は毎日父親から母親から「スネかじってる」だの「男のくせに」だの言われて
就職活動しないと人間否定されて、勇気出して遠出して受けに行ったのに結果出さなかったら
過程の努力は無視されてまた「男だろいつまでもウジウジしてんな」とか言われて。10個も20個も履歴書書くのなんて面倒で考えられないしw
決して養ってもらうと言う立場には一生なれなくて果てはホームレスか飢え死に、欝・凍死・自殺。
451デフォルトの名無しさん:2007/06/08(金) 11:43:48
>>450
太るなよ
452デフォルトの名無しさん:2007/06/08(金) 13:05:21
>>440
ちゃんとした書き方してるんだって言う満足感がないだろ

RubyならちゃんとRuby的に書くのが1人前のRubyユーザ。
言語はRubyでもJava的に書いてたらそれはRuby初心者。

いってみれば、Haskellはいつまで経っても我流の半人前。
453デフォルトの名無しさん:2007/06/08(金) 13:06:41
まちがえた。>>452>>447へ。
454デフォルトの名無しさん:2007/06/08(金) 13:34:41
不可解な話だな。
455デフォルトの名無しさん:2007/06/08(金) 14:11:16
Haskellってカタカナ読みでなんて読めばいい?
456デフォルトの名無しさん:2007/06/08(金) 14:15:17
>>455
ライスカレー
457デフォルトの名無しさん:2007/06/08(金) 19:46:48
>>452
君の言う「Ruby的」とやらだって一通りじゃないだろ
458デフォルトの名無しさん:2007/06/08(金) 22:48:39
dank○gaiのHaskell話ってなんか
どっかで聞いた話がいっぱい入ってね?
459デフォルトの名無しさん:2007/06/08(金) 23:34:02
>>455
ハスケル。アクセントはハのところで、あらいぐまのラスカルと似たイントネーション。
460デフォルトの名無しさん:2007/06/09(土) 00:28:48
口頭で言うとよくPascalと間違えられる。
461デフォルトの名無しさん:2007/06/09(土) 00:29:56
>>459
突然 Haskell がラブリーに見えてきた俺ガイル。
462デフォルトの名無しさん:2007/06/09(土) 00:46:58
Hidy Hidy Little Haskell ...
463デフォルトの名無しさん:2007/06/09(土) 01:13:40
464デフォルトの名無しさん:2007/06/10(日) 02:48:08

Haskellって固い印象だから、こういうキュートなデザインはいいと思う
http://haskell.org/hoogle/
 
465デフォルトの名無しさん:2007/06/11(月) 18:16:55
HaskellがCleanより遅い理由ってなんなんでしょう。
あと、性能で勝っているのにCleanのがマイナーな理由。

http://shootout.alioth.debian.org/gp4/benchmark.php?test=all&lang=ghc&lang2=clean
466デフォルトの名無しさん:2007/06/11(月) 18:55:00
メジャーかマイナーかなんて、営業の差でしかない
大人の事情ってやつ
467デフォルトの名無しさん:2007/06/11(月) 19:29:19
>>465
性能って何だ
468デフォルトの名無しさん:2007/06/11(月) 19:30:41
>>466
誰が営業してるんだ
誰がこれで金儲けてんだ
469デフォルトの名無しさん:2007/06/11(月) 21:11:31
>>465
あとコンパイル時間も比べてほしいな
GHCぼろ負けするだろうからさ
470デフォルトの名無しさん:2007/06/11(月) 21:22:10
Cleanは金儲けてるだろw
471デフォルトの名無しさん:2007/06/11(月) 21:39:03
金儲けてないHaskellに営業で負けてる訳か。
cleanの営業はいてもいなくてもいっしょだな
472デフォルトの名無しさん:2007/06/11(月) 21:43:10
>>468
Cleanも日本語の解説書が出れば一気に人気が出るよ。
473デフォルトの名無しさん:2007/06/11(月) 21:49:30
>>471
フリーソフトが金取ってるソフトにユーザー数で勝つのは
割りと一般的だと思うけど。
474デフォルトの名無しさん:2007/06/11(月) 21:50:23
まあ同じソフトなら無料の方が良いに決まってるしな
475デフォルトの名無しさん:2007/06/11(月) 22:20:43
>>472
解説書は出るのを待つんじゃなくて書くもんだよ。
476デフォルトの名無しさん:2007/06/11(月) 22:30:14
Haskell の検索結果 約 13,600,000 件中 1 - 50 件目 (0.09 秒)

"Concurrent Clean" の検索結果 約 80,200 件中 1 - 50 件目 (0.31 秒)
477デフォルトの名無しさん:2007/06/11(月) 22:37:36
そりゃ開発環境が無料じゃないなんて負けるに決まってる罠
C#みたいにMSとかってんなら話は別だが
478デフォルトの名無しさん:2007/06/11(月) 22:47:35
LGPL版も用意されてるけど公式サイトからダウンロードするのにいちいちユーザー登録しなきゃいけないのが嫌。
なので、ダウンロードすらしていない。
479デフォルトの名無しさん:2007/06/11(月) 23:00:16
企業がやってるということは、いつライセンス変更されて有料になるか解らないので不安
480デフォルトの名無しさん:2007/06/11(月) 23:26:23
・言語の正式名称は「clean」であって「concurrent clean」じゃない
・開発環境は無料
・登録しろって言ってくるけど、しなくてもダウンロードできる
・開発も公開も、企業じゃなくて大学がやっている

おまえらもうちょっと調べてから投稿しろよ。
481デフォルトの名無しさん:2007/06/12(火) 00:30:49
>>478
俺も最初はそう思ったけど、>>480 の通り、登録しなくてもダウンロード出来るよ
482デフォルトの名無しさん:2007/06/12(火) 00:32:22
>>480
邪魔
消えろ
483デフォルトの名無しさん:2007/06/12(火) 00:38:10
>>480
そんなことはみんな知ってるよ。
484デフォルトの名無しさん:2007/06/12(火) 01:23:49
>>483
無理すんなよ
485デフォルトの名無しさん:2007/06/13(水) 02:42:46
コンビネータで数の計算をやろうとして、以下のような関数を用意した。
ネタ元は http://users.bigpond.net.au/d.keenan/Lambda/index.htm

k x y = x
i x = x
t x y = y x
v x y z = z x y

inc = v (k i)
dec = t (k i)
isZero = t k

zero = i
one = inc zero
two = inc one

で、検算用に10進数に変換する関数numを作ろうとした。
しかし、型推論が邪魔して(?)以下の関数が定義できない。

num n = isZero n 0 (num (dec n) + 1)

こういうときってどうやって対処すればいいの?
486デフォルトの名無しさん:2007/06/13(水) 04:17:18
>>485
それって型なしλ計算でしょ?
haskellは型があるもん
487デフォルトの名無しさん:2007/06/13(水) 11:50:23
>>485
その数の定義で行くと、
たとえば、threeは
ペアを作る関数
pair m n = (\x -> x m n)
として、これをpair m n を (m, n) と書くとして、
(false, (false, (false, I)))
ってなっちゃうじゃん?
2番目の要素がペアなのかIなのか決まらないじゃん。
488デフォルトの名無しさん:2007/06/13(水) 11:59:15
あ、false = k i ね。
489デフォルトの名無しさん:2007/06/13(水) 23:21:11
関数に「状態をもたない」といったときの「状態」ってどういう意味でしょうか。
490デフォルトの名無しさん:2007/06/14(木) 00:41:57
>>485
schemeでやってみるか、データ型駆使するか?
491デフォルトの名無しさん:2007/06/14(木) 00:51:02
>>489
複数回の関数呼び出しにまたがって保持されるデータ
492デフォルトの名無しさん:2007/06/14(木) 00:55:29
>>489
ヒルベルト空間論というか量子力学で言うところの|ψ>じゃない?
つまり安直に状態とは可分なヒルベルト空間の元である〜。

でファンクタFを作用させるのはF|ψ>みたいに考えるといいのか。
(F 'join' F)|ψ> -> F|ψ>
てか?
exp(F) = 1 + 1/2! * F + 1/3! * F + 1/4! * F + ...
とかも考えたら面白そう。
493デフォルトの名無しさん:2007/06/14(木) 01:06:26
>>492
すこし頭を冷やして来い。
494デフォルトの名無しさん:2007/06/14(木) 01:16:25
昔の自分を見ているようで微笑ましいな
495デフォルトの名無しさん:2007/06/14(木) 01:29:13
なにがまずいん?
496デフォルトの名無しさん:2007/06/14(木) 01:37:19
>>495
一行目から最後まで。全て。
497デフォルトの名無しさん:2007/06/14(木) 01:47:12
どのようにまずいん?
498デフォルトの名無しさん:2007/06/14(木) 01:50:00
何か痛い流れになってるw
499デフォルトの名無しさん:2007/06/14(木) 02:14:09
>>492
何故“状態”の線形性を仮定してるの?
何故全ての関手が線形で、しかもドメインとコドメインが等しいことを仮定しているの?
何故各“状態”について内積が定義できることを仮定してるの?
joinのくだりは意味不明だからコメントを避けるが、
exp Fみたいな関数はhaskellではbotだし。


名前が似てるだけのものを混同してる。
500デフォルトの名無しさん:2007/06/14(木) 02:22:14
ネタぐらい華麗にスルーしろよ。
501デフォルトの名無しさん:2007/06/14(木) 08:04:01
誰だって、概念をもてあそんだ恥ずかしい過去を持っているはず。
厳しい追求は可哀想。
502デフォルトの名無しさん:2007/06/15(金) 03:19:56
>>490
データ型を駆使するやりかたをおぼえたいっす。

data X a = T (X a -> a)
fixpoint g = (\x -> g (x (T x))) (\(T x) -> g (x (T x)))

こういうのを見るんだけど、どこをxにしてどこを(T x)にするかとかの考え方がわからないんだよね。

>>487
そうか!
vはペアを作る関数として使ってたんだ。
isZeroでkを与えてcar部のfalseを取り出して非ゼロと判定してたのか。
503デフォルトの名無しさん:2007/06/16(土) 22:35:35
(iterate (* 2) 1) !! 1500
を評価すると452桁の多倍長整数がきちんと表示されるのに、
(map log10 (iterate (* 2) 1)) !! 1500
where log10 x = log x / log 10
あるいは、
log10 ((iterate (* 2) 1)) !! 1500)
where log10 x = log x / log 10
を評価するとInfinityになってしまいます。(オーバーフローではなくて)
なぜでしょうか?
ちなみに
(map log10 (iterate (*2) 1)
も値が308を越えるところから途中でInfinityになっています。
504デフォルトの名無しさん:2007/06/16(土) 23:10:08
logの引数がDoubleに変換されるからだと思う。

Prelude> 2^1023 :: Double
8.98846567431158e307

Prelude> 2^1024 :: Double
Infinity

Prelude> log(2^1023)/log 10
307.95368556425274

Prelude> log(2^1024)/log 10
Infinity
505デフォルトの名無しさん:2007/06/16(土) 23:16:48
>>503
型推論を終えた時点で数値の型が曖昧なときは、デフォルト化によって解決される。
どういう風にデフォルト化するかはdefault宣言で決めるんだが、宣言がないときは、
・できればInteger
・それがダメならDouble
・それがダメならエラー
という風になっている。最初の式の型は(Num a) => aだから、Integerが優先される。
log10の絡んだ式の型は(Floating a) => aで、Integerは適合しないから、第二候補のDouble
が使われる。Doubleには表現できる数に上限があるので、Infinityにもなる。
506デフォルトの名無しさん:2007/06/17(日) 00:02:25
>>504 >>505
ありがとうございます。駄目な理由は理解しました。
でも解決策がすぐに分からないような初心者なのでもう一回調べてみます。
どうもでした!
507506:2007/06/17(日) 00:18:48
インチキだけど
floorLog10 :: Integer->Int
floorLog10 x = length (show x)
でうまくいきました。
floorLog10 ((iterate (*2) 1) !! 100000)
=> 30103

508デフォルトの名無しさん:2007/06/17(日) 09:06:02
>>502の解説希望。
data X a = T (X a -> a)
のようにx = x -> x という型を作れれば,不動点が作れるというのは何となく分かるんだけど
例えば右辺がどうしてX a -> aでa -> X a や X a -> X aではないのかとか ???
509デフォルトの名無しさん:2007/06/17(日) 09:22:30
それ、GHC6.6だと固まるんだけど、なぜだろ

$ cat test.hs
data X a = T (X a -> a)
fixpoint g = (\x -> g (x (T x))) (\(T x) -> g (x (T x)))

main :: IO ()
main = print $ fixpoint (\f -> \x -> if x==0 then 1 else x*f(x-1)) 5

$ hugs test.hs

(ロゴ一部省略)
|| || Version: September 2006 _________________________________________

Haskell 98 mode: Restart with command line option -98 to enable extensions

Type :? for help
Main> main
120

Main> [Leaving Hugs]

$ ghc --version
The Glorious Glasgow Haskell Compilation System, version 6.6

$ ghc --make test.hs
[1 of 1] Compiling Main ( test.hs, test.o )
(固まる)
510デフォルトの名無しさん:2007/06/17(日) 19:50:03
>>509
12.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
511デフォルトの名無しさん:2007/06/20(水) 17:17:21
などるほ!
回避策ってないんですかね。-O0でもダメだし
512デフォルトの名無しさん:2007/06/22(金) 17:09:56
http://haskell.org/papers/NSWC/jfp.ps

比較する言語のマイナーさに驚いた
513デフォルトの名無しさん:2007/06/24(日) 03:20:40
このスレレベル高いでしょ!!
514デフォルトの名無しさん:2007/06/24(日) 17:40:03
無限リストの有用性がよくわからん
無限に続くとはいえ結局使うのは有限個の要素なんだし、それなら最初から有限リストとしてしまえばいいのでは?
もしそうならCとかの遅延評価がない言語でも十分実装できるようになる
誰か無限リストでないと困るような例を教えてくれ
515デフォルトの名無しさん:2007/06/24(日) 17:45:54
無限リストは、値を次々生成していく処理を
リストの形で扱えるようにしたもの、じゃないの?
516デフォルトの名無しさん:2007/06/24(日) 17:46:41
何処まで必要か分からん場合じゃない?
例えば素因数分解のための素数リストとか。
517デフォルトの名無しさん:2007/06/24(日) 19:43:57
>>514
それでないと実現できないってのじゃなくて、
そういう形に抽象化して考えるってのに意義があるんだよ。
518デフォルトの名無しさん:2007/06/24(日) 19:51:31
足し算があれば掛け算は無くても良いけど、あった方が良いよね みたいな?
519デフォルトの名無しさん:2007/06/24(日) 19:54:10
>>514
最初から有限個の要素にするってことは、「どこで打ち切るか」の判断を
リスト生成関数に埋め込むことになるが、無限リストを使えばこれが分離出来る。
例えば、「素数を小さい方から千個求める」という操作と「千以下の素数を全て求める」という
操作をループで書いた場合、この二つの操作の共通部分を括り出すのが難しい。
一方、素数を小さい方から並べた無限リストprimesを使えば、この二つは
take 1000 primesとtakeWhile (<=1000) primesになって、素数生成の
部分は容易に共用出来たことになる。
520デフォルトの名無しさん:2007/06/24(日) 19:59:45
>>517
だから、そういう形に抽象化したら何が楽になるんだ?
521デフォルトの名無しさん:2007/06/24(日) 20:10:48
引き算があれば割り算は要らないけど、あった方が良いよね みたいな
522デフォルトの名無しさん:2007/06/24(日) 20:13:24
人間様が、いちいちどれくらいの長さが必要かなんて指示するなんてあほらしい。
無限のリストをやるから、処理の方で必要な分だけ使え、ってほうが楽。
523デフォルトの名無しさん:2007/06/24(日) 20:19:50
でも、遅延評価が働かない場合は無限リストをすべて書き出してから処理をすることになって、オーバフローになってしまうけど、
遅延評価が働くかどうかっていうのをいつも意識の隅においてプログラミングしなきゃいけないなんて、
めんどくないか?
524デフォルトの名無しさん:2007/06/24(日) 20:25:57
遅延評価でない言語で、無限ループしないよう考えながら書くのと同じことですが
525デフォルトの名無しさん:2007/06/24(日) 20:37:43
どっちが難しいかってことだよ。
普通の人は遅延評価の方が難しいだろう。
526デフォルトの名無しさん:2007/06/24(日) 20:58:33
普通の人ってなんだよ。
そりゃ遅延評価に慣れない人には遅延評価の方が難しいだろう。
527デフォルトの名無しさん:2007/06/24(日) 21:00:16
それが慣れの問題じゃないんだな。
528デフォルトの名無しさん:2007/06/24(日) 21:04:57
Haskellは一般人向きじゃないってことだけははっきり言える。
そして、Haskellはもっと直観的な記法に取って代わられると予言してやろう。
529デフォルトの名無しさん:2007/06/24(日) 21:07:10
>>527
なぜそう思う?

というか何か主張するときは根拠も述べてくれ。
530デフォルトの名無しさん:2007/06/24(日) 21:34:30
>>529
根拠なんかないよ。
直観だ。
531デフォルトの名無しさん:2007/06/24(日) 21:35:16
>>528
同意
532デフォルトの名無しさん:2007/06/24(日) 23:07:50
いいんだよ。学問用の言語なんだからほっとけ。
533デフォルトの名無しさん:2007/06/25(月) 01:47:04
Haskellではちょっと込み入ったことしようとすると英語の論文読まなくちゃいけなくなるからいけない。
534デフォルトの名無しさん:2007/06/25(月) 02:23:29
>>533
んなことはない。込み入った機能をわざわざ使うにはそうだが、
ロジック自体はHaskell98の範囲で事足りる。
低レベル系のことを言ってるのなら、それは言語の問題ではなくライブラリの問題。
535デフォルトの名無しさん:2007/06/25(月) 05:06:53
むしろ、高レベルのことなんだが。
536デフォルトの名無しさん:2007/06/25(月) 05:07:53
アローとか日本語で解説してる記事があるなら紹介してほしい
537デフォルトの名無しさん:2007/06/25(月) 05:40:20
本が2冊出てるし
538デフォルトの名無しさん:2007/06/25(月) 05:45:12
それにしてもHaskellの啓蒙書はなぜこんなに少ないのかな。
Prolog50冊、Haskell2冊。一部言及された書物の数でも似た
ようなものだ。
出版物の意味が変わってしまった、というだろうか。
539デフォルトの名無しさん:2007/06/25(月) 05:48:57
>>537
アローの本か?
540538:2007/06/25(月) 05:52:27
あれ、「こと」がおちてる
541デフォルトの名無しさん:2007/06/25(月) 07:26:21
Haskellやれば金になるとはほとんど誰も思っていないから
542デフォルトの名無しさん:2007/06/25(月) 07:32:42
コンピュータサイエンスの海外版権を買いまくって、
という時代ではないんだね。
543デフォルトの名無しさん:2007/06/25(月) 16:17:59
アローの記事がないのなら、関数とモナドで書けばいいじゃない
544デフォルトの名無しさん:2007/06/25(月) 16:47:40
545デフォルトの名無しさん:2007/06/25(月) 21:46:27
>>544
そうなんですが。
1980-90年代にPrologが担おうとした役割を今人はHaskellに
求めているという事情がある。Prologの書籍の過半がAIに
言及し、そのコードの基礎を示していることなどを考えると
やはり、現在の日本のHaskell出版物の状況は寒い。
546デフォルトの名無しさん:2007/06/25(月) 21:51:03
>>545
>1980-90年代にPrologが担おうとした役割

って何?
Haskell って事は AI に特化した事じゃないんだよね?
547デフォルトの名無しさん:2007/06/25(月) 22:09:07
知識処理プログラミングのアセンブラということでしょ。
548デフォルトの名無しさん:2007/06/27(水) 09:39:14
Prologというか知識処理は社会へインパクトをもたらす技術目標があったけど、
Haskellというか関数型言語は蛸壺内の内輪ネタに終始しているな。
549デフォルトの名無しさん:2007/06/27(水) 21:12:44
Haskellのおかげで関数型言語に興味をもったエセプログラマーの数は計りしれねーぞ
俺もそのひとりだ
550デフォルトの名無しさん:2007/06/27(水) 21:16:36
これでプログラマではなくなり、計算機科学者になりました。
551デフォルトの名無しさん:2007/06/27(水) 23:01:06
数学者の前では卑屈になるが、理論に疎い一般プログラマは徹底的に見下す。
それが計算機科学者。
552デフォルトの名無しさん:2007/06/27(水) 23:13:18
これで計算機科学者でなくなり、数学者になりました。
553デフォルトの名無しさん:2007/06/27(水) 23:24:27
数学者は物理学者に負けるよ
554デフォルトの名無しさん:2007/06/27(水) 23:44:15
物理学者が数学者にぺこぺこするんです。
あたりまえでしょ?
数学者はn次元の公式を渡して、物理学者は3次元の公式をほしがるんだ。
555デフォルトの名無しさん:2007/06/27(水) 23:49:45
物理学者が憧れるのが詩人
556デフォルトの名無しさん:2007/06/28(木) 05:09:32
計算幾何学者の漏れが颯爽と登場
557デフォルトの名無しさん:2007/06/28(木) 06:24:34
LISPやPrologは言語の大雑把な目的を人工知能とかで認知させる事に成功したが、
Haskellじゃ何がメリットなのかも理解されず世間へのハッタリもかませない。
金儲けには全く向いてないな。

学者のみなさん、
Haskellだとどんな所がおいしいとか、俺に説明してみてください。
558デフォルトの名無しさん:2007/06/28(木) 06:43:30
理系全般だか情報システム帰れよ糞ども
559デフォルトの名無しさん:2007/06/28(木) 11:50:40
結局は遅延評価だけでしょ。<Haskell
560デフォルトの名無しさん:2007/06/28(木) 13:50:24
型安全性による品質の圧倒的な向上。
→ある種のバグはこれで撲滅できる。メンテナンス性もまずまず。

多相性による再利用性の向上。型推論による簡潔な記述。純粋関数的なreasoningの容易さ。
→より短期間でプログラムを開発できる。

工学的に申し分ない言語じゃないか。
Prologなど比較にならんわ。


あ、lazinessはうんこ。
561デフォルトの名無しさん:2007/06/28(木) 15:26:19
うんこは言い過ぎだろ…
遅延評価をやめるなら最低限遅延リストの代替が欲しい。
562デフォルトの名無しさん:2007/06/28(木) 15:27:10
遅延するようにもしないようにもできればいいだけじゃん。
563デフォルトの名無しさん:2007/06/28(木) 16:45:25
>>562
そんな八方美人はみんなから嫌われます
564デフォルトの名無しさん:2007/06/28(木) 16:59:49
そいう言語あるだろ。
565デフォルトの名無しさん:2007/06/28(木) 17:00:51
副作用も欲しいところだ
566デフォルトの名無しさん:2007/06/28(木) 17:04:13
>>562
それは現状でもできる。

>>565
イラネ
567デフォルトの名無しさん:2007/06/28(木) 17:09:58
>>564
そういう言語は人気ないだろ
568デフォルトの名無しさん:2007/06/28(木) 17:22:13
普通の言語にある副作用(IOモナド相当のみ)はあまり欲しくないけど、reflect/reifyくらいあってもよさそう。

main = print $ reflect( @[1, 2] + @[3, 4] )

で[4, 5, 5, 6]が表示されるとか、

main = reflect( @(writeFile (@getHomeDirectory ++ "/test.txt") @getContents) )

とか。
569デフォルトの名無しさん:2007/06/28(木) 17:24:24
>>567
Haskell の人気があるとでも?
570デフォルトの名無しさん:2007/06/28(木) 17:36:15
遅延評価がやりたいから、Haskell(やClean)は純粋関数的なのであって…
それを捨てたら意味ない気がする。
まあ確かにreasoningがしやすいという側面もあるんだろうけれど、
遅延評価を捨てた時点で、unsafeIOを使いまくるやつ続出な希ガス
571デフォルトの名無しさん:2007/06/28(木) 17:38:21
>>568
その構文は何?読めん。
reifyならtemplate haskellにあるけど
572デフォルトの名無しさん:2007/06/28(木) 17:58:33
>>569
Haskellは筋が通ってるから大衆人気はなくとも、この方面からは権威ある言語として認められている。
573デフォルトの名無しさん:2007/06/28(木) 18:17:29
>>571
reflectじゃなくてreifyだった。ごめん。

main = print $ reify( @[1, 2] + @[3, 4] )

reifyは予約語で、reify(<式>)でひとつの構文。これ自体はreturnみたいなもの。
@はreflectのつもりで、reifyの中でのみ使える。直感的にはモナドを「外す」関数m a -> a。
これで副作用っぽい書き方ができるけど、実際には全体でひとつの構文で、
reify( @[1, 2] + @[3, 4] )

[1,2] >>= \x -> [3, 4] >>= \y -> return (x + y)
の構文糖、みたいな意図。

Template Haskellのreifyはたぶん直接は関係ない。
574デフォルトの名無しさん:2007/06/28(木) 18:46:45
ttp://www.excite.co.jp/world/chinese/
以下文章を上記翻訳サイトにて中→日にせよ

スゲиシギゝ,ザァ,ユЮ.
θイ,ゎモモモモマいデ.
びデた,ゝС,さーモモモモデゝねг
575デフォルトの名無しさん:2007/06/28(木) 18:49:24
なるほど、そういう構文糖はあってもいいかもしれないね。liftMの逆というか。unlift?
do構文よりもさらに直観的かもしんない。

構文糖として実装する場合、liftMやらliftMnやらを色々と埋め込む実装になるんだろか。

reify( @[1, 2] + @[3, 4] )
は、
let x +? y =liftM2 (+) x y in [1,2] +? [3,4]

みたいな感じで。
liftMの埋め込みが決定可能かどうかは知らない。
576デフォルトの名無しさん:2007/06/28(木) 19:31:45
>>570
歴史的にはそうなんだろうが、今となっては遅延評価が足を引っ張ってるような。
でもHaskellが遅延評価を捨てることはないだろうから別言語ってことになるんだろうな。
unsafe IOは使いたい奴には使わせとけば良いんじゃないかと。
577デフォルトの名無しさん:2007/06/28(木) 19:35:01
なんだかhaskellのコードは俺言語オナニーの一種に思えてしかたがない
とても見やすいとは思えないな
578ヒゲメガネ:2007/06/28(木) 19:38:45
>>577
お前がHaskellに慣れてないだけ。こんなもん大学学部生でもすぐに読めるようになる。
表面的な構文なんぞに拘る人は一生JavaかPerlでも使っててください。
579デフォルトの名無しさん:2007/06/28(木) 19:51:52
>>577
知識の浅さが垣間見えて仕方がない。
580デフォルトの名無しさん:2007/06/28(木) 19:52:29
>>577
別に見にくいとは思わない。
ただ、個人的には読みやすさよりも書きやすさがHaskellの魅力だと思う。

>>578
表面的な構文は重要だろ…
中括弧とセミコロンが必須だったらここまで好きにはならなかった。
581デフォルトの名無しさん:2007/06/28(木) 19:53:15
>>580
俺はレイアウト構文をやめてほしいがな。
582デフォルトの名無しさん:2007/06/28(木) 19:56:39
>>581
なんで?明示的に区切るのでは駄目?
583デフォルトの名無しさん:2007/06/28(木) 20:02:47
区切り方に一貫性がない。
たとえば、do{・・・;・・・;}は許されるのに、case ・・・ of {・・・;・・・;}は許されない。
584デフォルトの名無しさん:2007/06/28(木) 20:03:43
中括弧だとかセミコロンの有無なんぞを議論するなんて、まるでC使いとPascal使いじゃないか。
あまりにも無益。
どちらかといえばDRY原則とかに拘るほうがまだ有益。

確かにfunction f x = などと定義するのはキモイような気もするが、それも慣れだ。
たとえば(functionよりはちと短いが)ML系ではいちいち関数の前にlet とかrecとかvalだとかを付けるわけだが、それに文句を言う奴など居ない。
585デフォルトの名無しさん:2007/06/28(木) 20:14:03
>>583
通ったけど。
Prelude> case 4 of {0 -> 2; 4 -> 4;}
4

>>584
>>578が重要でないと言ったからそれに反論しただけ。
別に構文の詳細について議論する気はない。
主観的には間違いなく重要な点なのでこれもどうしようもない。
586デフォルトの名無しさん:2007/06/28(木) 20:15:08
>>583
許されますが
ghci> case 1 of{0->0;1->1;x->x;}
1
587デフォルトの名無しさん:2007/06/28(木) 20:15:09
プログラムは目的が達成できる事と、実行スピードが出せてこそだと思うんだが、
haskellだと、どこチューニングすれば速くなるとかがよくわからん

「慣れてない」の一言で済ませるのは簡単でいいやね・・・
588デフォルトの名無しさん:2007/06/28(木) 20:19:44
いや、実行スピードをチューニングするのは慣れたHaskellプログラマでも難しいんでない?
だからプロファイラとかがあるわけで。
オーダーを改善することくらいなら何も考えずできるだろうけど。

つか、上の人は「読みやすさ云々は慣れの問題」と言っただけじゃねーの
589デフォルトの名無しさん:2007/06/28(木) 20:19:47
>>587
それも慣れればかなりできるようになる。
ただ、Haskellのチューニングは少し特殊で、通常の言語の扱いに
慣れただけではうまくできないことが多い。
http://www.haskell.org/haskellwiki/Performance
このへん参照。
590デフォルトの名無しさん:2007/06/28(木) 20:20:59
ケコーンしまくりうざい
591589:2007/06/28(木) 20:21:08
プロファイリングを使うことは前提のつもりで言った。
592デフォルトの名無しさん:2007/06/28(木) 20:25:27
つーか構文の歴史でいえばHaskell/Clean(Miranda系)もML系も結構古いんでは 20年くらい?
Cほどじゃないが、それなりに支持された書き方ではあるはず
593デフォルトの名無しさん:2007/06/28(木) 20:46:48
>>585
どのコンパイラだ
594デフォルトの名無しさん:2007/06/28(木) 20:50:19
>>593
ghci 6.4.2
595デフォルトの名無しさん:2007/06/28(木) 20:51:13
hugsでも通るね。
Hugs> case 1 of {1->1;x->x;}
1
つかHaskellの言語仕様でそ。コンパイラがどうのよりも
596デフォルトの名無しさん:2007/06/28(木) 21:06:32
>594-595
それなんてインタプリタ?
597デフォルトの名無しさん:2007/06/28(木) 21:08:52
GHCiは対話的バイトコードコンパイラです!
598デフォルトの名無しさん:2007/06/28(木) 21:12:46
揚げ足取りに興味はない。
599デフォルトの名無しさん:2007/06/28(木) 21:15:04
いや、ghc-6.4.2で普通に通るし。
それくらい試せよ。
600デフォルトの名無しさん:2007/06/28(木) 21:16:03
http://www.sampou.org/haskell/report-revised-j/syntax-iso.html#layout
> 意味に影響を与えるレイアウトは、そのレイアウトによって決定される場所にブレースとセミコロンを付け加えることによって、完全に記述することができる。
Haskell98 の仕様なんだが……
601デフォルトの名無しさん:2007/06/28(木) 21:23:35
レイアウト反対 レイアウト反対

こんなパイソンみたいな書き方キモすぎる。
どっちかに統一せえや。
602デフォルトの名無しさん:2007/06/28(木) 21:49:19
ぜんぶセミコロン使っちまえばいい
603デフォルトの名無しさん:2007/06/28(木) 22:06:24
全部セミコロンで書くと、haskell-modeでエラーが出ることがある。
604デフォルトの名無しさん:2007/06/28(木) 23:48:28
んなあほな欠陥は直してしまえばよろしい
605デフォルトの名無しさん:2007/06/29(金) 00:45:30
レイアウトええやん
わかりやすいし無駄がない

人間はアホだから、機械と違ってインデントしねーとコード嫁ねーし、
理にかなってるわ
606デフォルトの名無しさん:2007/06/29(金) 00:49:22

さて流れに逆らって低レベルな質問
(1)コマンドライン引数を2つ以上取得したいときはどうすんの?
   getArgsではできないの?

(2)main = do cs <- getContents
         Moge cs
   Moge :: Int -> String
   -- 以下略
こんなふーなプログラム書いてみたら、「csはStringじゃなきゃダメよ」って感じで
怒られたんだけど、StringをIntに変換する単純な関数ないの?
 
607デフォルトの名無しさん:2007/06/29(金) 00:50:30
俺も良いと思うよ。
608デフォルトの名無しさん:2007/06/29(金) 01:05:03
>>606
(1) getArgsでは引数の配列が得られる。

-- 引数を表示するプログラム
import System
main = getArgs >>= mapM_ putStrLn


(2) String -> Int ができる関数としては read がある。
例えば
hoge :: Int
hoge = read "1234"
とすればhogeは1234。
出力の型に変換できないような入力文字列だった場合はエラーが起きる。
609606:2007/06/29(金) 01:34:21

なるほろろ

どーりで、「toInt」とか「int」でホグってもでてこないわけだ
型を見ると、
Prelude. read :: Read a => String -> a

これはintじゃなくてもできるの?
read "True"
read 'c'
ってやってみると、「no parse」ってエラーになった
 
610デフォルトの名無しさん:2007/06/29(金) 02:12:45
>>609
hoogleで「String -> 」とかでふぐれ。
611デフォルトの名無しさん:2007/06/29(金) 05:17:30
>>609
Intじゃなくてもできる。例えば、
if read "True" then 1 else 0
なら、文脈からBoolが要求されているので、Boolとして読む。
要求する型を明示するには、
read "True" :: Bool
みたいに書く。
612デフォルトの名無しさん:2007/06/29(金) 22:01:07
いつも思うんだが、getContentsみたいな遅延IOってハックだよな。

main = do
  s <- getContents
  putStr $ map fst $ filter (uncurry (/=)) $ zip s (tail s)

と同じ感覚で

main = do
  input <- newStream stdin
  outputTo stdout $ smap fst $ sfilter (uncurry (/=)) $ szip input (stail input)

みたいに使えるnewStream, outputTo, smap, sfilter, szip, stailを副作用なしで書く方法ある?
613デフォルトの名無しさん:2007/06/30(土) 12:57:16
よくわからんけど、newStreamとoutputToとやらは、hGetContentsとhPutStrの事か?

せめてSystem.IOモジュールの一覧くらい眺めてみたらどうだ
614デフォルトの名無しさん:2007/06/30(土) 14:40:25
型によって処理を分岐させたいんだがうまくいかん。

import Data.HashTable
import Data.Typeable

hoge a = if typeOf a == typeOf "A"
then do hash <- new (==) hashString
hoge2 hash a
else do hash <- new (==) hashInt
hoge2 hash a
hoge2 hash' b = update hash' b "HOGE"

これだと、次のようなエラーが出る。

test.hs:8:28:
Couldn't match expected type `Int' against inferred type `String'
Expected type: Int
Inferred type: String
In the second argument of `hoge2', namely `a'
In the expression: hoge2 hash a

関数の中では、型変数の型は一つしかとれないということなのかな・・・?
こういう場合はどうしたらいいんだろう。
615デフォルトの名無しさん:2007/06/30(土) 14:47:49
>>614
型クラスつかえ
616デフォルトの名無しさん:2007/06/30(土) 17:09:33
>>613
わかってないなら、無理に返事しなくてもいいよ
617デフォルトの名無しさん:2007/06/30(土) 18:37:52
>>613
hGetContentsは副作用に頼って遅延IOを実現している訳だが、
リストの代わりに専用のデータ構造を使えば、似たようなスタイルを副作用なしで
実現できないだろうか、という話。
618デフォルトの名無しさん:2007/06/30(土) 19:09:20
>617
hGetContents が遅延 IO を実現しているのは、副作用うんぬんとは関係がな
い。というか、遅延しない IO にも副作用が必要なわけで、その書き方だと
「副作用に頼らずに IO を実現したい」と言っているように見える。

どうも unsafeInterleaveIO を探しているという話に思えるんだけど、どうですか。

もしくは Streams か SSC を見てみてもいいかも。 Streams にそういう操作が定義されていたかどうかは覚えていないが。
619デフォルトの名無しさん:2007/06/30(土) 19:09:59
>>614
型による分岐にはData.Typeable.castを使う。
ただ、動的に分岐するより、>>615の言う通り型クラスで静的に型を決める方が普通。
620デフォルトの名無しさん:2007/06/30(土) 19:21:43
>>618
俺が副作用と言ったのはまさにunsafeInterleaveIOのこと。
「副作用に頼らずに」のところは「unsafeInterleaveIOに頼らずに」と読み替えてくれ。

>遅延しない IO にも副作用が必要なわけで
ふつうの(遅延しない)IOモナド上の操作は参照透過で副作用はない、という立場で書いた。
621デフォルトの名無しさん:2007/06/30(土) 20:25:40
>>613
>わかってないなら、無理に返事しなくてもいいよ
少なくともここまでで意図が誰にも伝わってないと思うのだがどーよ。
へたれ仮想コードで解れという方が無理な話。

で、フタを開けてみれば…>>620みたいな馬鹿が出てきたのか。
622デフォルトの名無しさん:2007/06/30(土) 20:46:23
ごめん、今まとめてるからちょっと待ってくれ。
623デフォルトの名無しさん:2007/06/30(土) 21:42:01
>620
ああそういうことか。
出来るか出来ないかでいえば大して難しくないだろう。でも標準にはないね。
いまちょっと Streams を見てみたが Streams にもそういう仕組みはないようだ。
624デフォルトの名無しさん:2007/06/30(土) 21:54:55
                    \ │ /
                     r;;;;;ノヾ  / ̄ ̄ ̄ ̄ ̄
                   ─ ヒ‐=r=;'< ひざまずけ!
                     'ヽ二/  \______
                    / │ \
                         r;;;;;ノヾ
                  r;;;;;ノヾ ∩ ヒ‐=r=;'∩ / ̄ ̄ ̄ ̄ ̄ ̄
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄\ ∩ヒ‐=r=;'∩\'ヽ二/< 命乞いをしろ!
>>621から石を取り戻せ! > 'ヽ二/ / |    / \________
__________/ |    〈 |   |
                  / /\_」 / /\」
                   ̄     / /
                        ̄
625612:2007/06/30(土) 22:30:38
ttp://up.uppple.com/src/up4305.txt

まとめてたら効率の悪い実装を思いついたので、それも書いた。
626デフォルトの名無しさん:2007/06/30(土) 23:48:57
ふと思っただけなので外しているかもしれないが、 Arrow を使えば綺麗に書けるんじゃないかなぁ。
627デフォルトの名無しさん:2007/07/01(日) 00:01:45
アロー使い方わかんね。
易しく解説してください。
628621:2007/07/01(日) 01:04:44
馬鹿とか書いて悪かったよ。しかし…

newtype Stream a = Stream (IO (Maybe (a, Stream a)))

これって意味あるんか?
IOを別の型として再定義しただけでしょ?駆動するのに専用の関数が必要ならあんまり意味が無い希ガス
せめてmonadにしてみるとか。あ,そしたら単にIO monadの(ほぼ)再定義になるだけか。
629デフォルトの名無しさん:2007/07/01(日) 07:34:07
>>628
型の再帰が必要なのでその定義は必須。
後で抽象データ型として扱うために名前を付けておくという意味もある。
630デフォルトの名無しさん:2007/07/01(日) 08:10:53
>>536
>>627
ちょっと前にだけど書いてみた。
ttp://www.aya.or.jp/~takuo/arrow_for_2ch/arrow_for_2ch.pdf

Monadを少しは知ってる人向けのArrowの紹介。
今見てみると、もう少し具体例とか使い方とか書いたほうが良かったと思うけどせっかく書いたので。
631デフォルトの名無しさん:2007/07/01(日) 09:33:09
>>630
GJ!
Arrowは少しは知ってたけど、おかげでArrowApplyとMonadの関係が分かった。
632614:2007/07/01(日) 11:24:15
>>615
>>619
アリガトン。

型クラスを勉強し直して作り直してみた。
-fglasgow-extsをつけると動く。

import Data.HashTable
import Data.Int

instance Hoge Int where
getHashFunc = hashInt

instance Hoge String where
getHashFunc = hashString

class Hoge a where
getHashFunc :: (a -> Int32)
getHashFunc = ¥x -> 0


hoge :: (Eq a, Hoge a) => a -> IO Bool
hoge a = do hash <- new (==) getHashFunc
hoge2 hash a

hoge2 hash' b = update hash' b "HOGE"

つづく
633614:2007/07/01(日) 11:25:15
つづき。
String(または[Char])をHogeのインスタンスにするとき、-fglasgow-extsをつけないと次のエラーが出る。

test.hs:10:0:
Illegal instance declaration for `Hoge String'
(The instance type must be of form (T a b c)
where T is not a synonym, and a,b,c are distinct type variables)
In the instance declaration for `Hoge String'

もっと標準的なやり方があるのかな?
634デフォルトの名無しさん:2007/07/01(日) 11:53:47
>>633
それはどうしようもない。一応、例えば
instance Hoge Char
instance (Hoge a) => Hoge [a]
の二つを用意できれば、Haskell98の範囲で書けたことになるけど。
635614:2007/07/01(日) 16:55:46
>>633
なるほろ。ありがとう。
haskellって使いにくいなぁ、って思うことがよくあるんだけど、今回の件のように、俺がまだ使いこなせてないだけなんだろうなぁ。
もっと精進せねば。
636614:2007/07/01(日) 16:56:34
間違えた。
635は633へのレスじゃなくて634ね。
637デフォルトの名無しさん:2007/07/01(日) 17:02:42
>>635
いや、実際にHaskellは使いにくいと思う。
2年ぐらいHaskellを使っているが、いまだにHaskellがJavaとかcamlとかより使いやすいと感じたことはない。
638デフォルトの名無しさん:2007/07/01(日) 20:30:00
このスレにくると一発で頭痛くなる
639デフォルトの名無しさん:2007/07/01(日) 21:40:04
Monadもかなり悩むのにArrowとか言ってるやつとかいるし、おまいらなにげにすごいな
640デフォルトの名無しさん:2007/07/01(日) 22:21:22

arrowって圏論の射のことだろ?
 
641低級プログラマー(Java):2007/07/03(火) 00:23:50
import Char
import System

main = do cs <- getArgs
       putStrLn $ map toUpper cs


        __ , -------- 、__
      , - ':::::::::::::::::::::::::::::::::::::::::\
     / ;;;;;;;::::::::::::::::::::::::::::::::;;;;;;;;;;;;;;\
    /,,;,,,,,  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;  ,,,,,,,;:::丶
   / :::::::::;;,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,;:::::::::::::::ヽ
   i゙:::;:::::||::::::ii:::::::::::||::::::::::::::::::;:::::::::::::::::::::::::::゙i
  i゙::::|;;;;| |;;;;| |::::::::::| |:::::::::::::::::||:::::::::::::::::::::::::::::|
 . i゙::::::i     ''''''''''' '───' |;;;;;;;;;;::::::::::::::::::::|
  .|:::::::|,-====-´  ゙ヽ,,,,,,,,,,,,、    |:::::::::::::::::::|
  |;::::::::|,-----、    ~ニニ,,_`    |:::::::::::::::::::|
  `ヽ、i (、i´ノ     ´い,, ノ '    |;;;::::::::::::::/   なんで、エラーすぐ出るん?
  .   i ^~~~ー==--  ー'-+、     / ゙-、;;;;/
     {      ヽゝ          '-'~ノ
    λ   ''゙゙゙'''-''---、       /-'^
     ヽ,    ^~^         (
     /  `丶 、     , -   /^l
     |   /( ノ `''''''´~  __, - '  ゙i、
    {  / /| ̄ ̄ ̄ ̄   _,- '¨ }
    {/ /  ゙ー────'~   \|
    /               ヽ  \
642低級プログラマー(Java):2007/07/03(火) 00:26:34
それと、
print $ Char.ord '1'
ってやると49が帰ってくるんですが、どういう仕様ですか先生。
643デフォルトの名無しさん:2007/07/03(火) 00:34:50
>>641
getArgs は IO [String]

>>642
そういう仕様
644デフォルトの名無しさん:2007/07/03(火) 00:46:18
入門希望者です。日経とかでも取り挙げられてるのでちょっと勉強してみようかと思いました。
↓の記事を見つけたのですが、いきなりモナドとか知らん用語が連発でなんというか、全速力で置いていかれました。
http://itpro.nikkeibp.co.jp/article/COLUMN/20060801/244812/
もっとヘタレ向けの入門記事を…何かオヌヌメの記事はないでしょうか?
645デフォルトの名無しさん:2007/07/03(火) 19:59:04
オヌヌメwwwwwwwwwwww
646デフォルトの名無しさん:2007/07/03(火) 20:54:52
やっぱLISPのが楽しい^^
647デフォルトの名無しさん:2007/07/03(火) 20:55:35
LISPwwwwwwwwwwwww
648デフォルトの名無しさん:2007/07/03(火) 21:19:14
ハスケルはLISPから生まれたんだよ
649デフォルトの名無しさん:2007/07/03(火) 21:20:28
問題発言wwwwwwwwwwwwwwwwwwwwww
650デフォルトの名無しさん:2007/07/03(火) 22:29:23
>>644
|・ω・`)つ『ふつうのHaskellプログラミング』
651低級プログラマー(Java):2007/07/03(火) 23:47:45
何回やってもできないYO!
---

import System
main = do args <- getArgs
quad_from (10, 20 ,30, 40) $ read (head args) :: Int
quad_from (a1, a2, a3, a4) n = case n of
                1 -> a1
                2 -> a2
                3 -> a3
                4 -> a4
                _ -> "Nothing"
----Error内容----
caseoftest.hs:4:10:
  Couldn't match expected type `Int' against inferred type `[Char]'
  In the expression:
      (quad_from (10, 20, 30, 40)) $ (read (head args))
  In the expression:
      (quad_from (10, 20, 30, 40)) $ (read (head args)) :: Int
  In the expression:
    do args <- getArgs
      (quad_from (10, 20, 30, 40)) $ (read (head args)) :: Int
652デフォルトの名無しさん:2007/07/04(水) 00:06:46
>>651
そら "Nothing" は Int じゃないやろ。
653デフォルトの名無しさん:2007/07/04(水) 00:12:53
>>651
コンパイラの中の人は、多分こんな判断をしてる。
quad_fromの型を推論。Stringである"Nothing"が戻るルートがあるから、quad_fromの戻り値はString。
a1〜a4が戻り値になるルートがあるから、a1〜a4はString。
nは1と比較されているからNumのどれか。Intが優先。
よってquad_fromの型は Num a => (String,String,String,String)->a->String 。

quad_from (10, 20 ,30, 40) $ read (head args) :: Int の全体としての型を推論。
手がかりは
・IOモナドの中なので IO aの形。
・quad_fromが最も外側だから。String
・ユーザーはIntだと注釈を付けている。
さて、これを満たすような型は…

と探して見つからなかったからコンパイルエラーになってる。
654低級プログラマー(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
655デフォルトの名無しさん:2007/07/04(水) 01:28:34

     print $ quad_from (10, 20 ,30, 40) $ (read (head args) :: Int)
にすればOK(最後の括弧)。
656デフォルトの名無しさん:2007/07/04(水) 01:38:02
おおぅ できた
:: Int ってのがあれだと範囲ひろすぎちゃったのね
サンクス
657デフォルトの名無しさん:2007/07/04(水) 02:00:20
Lispは手続き型を許さないプライドが高い本当の無能が使う言語
C/C++系は遅延評価が無いことによる再帰記述への躊躇さを言い訳にした本当の低脳が使う言語
658デフォルトの名無しさん:2007/07/04(水) 03:40:41
>>657
ついでにPrologもお願いします。
659デフォルトの名無しさん:2007/07/04(水) 05:52:41
自分の処理系持てるという意味ではlispは最高だょ
haskellの処理系作ってる人あまりいないっしょ
660デフォルトの名無しさん:2007/07/04(水) 07:17:02
>>656
その例では「:: Int」の部分は要らない。
(quad_fromの第二引数になっている時点でIntだと分かるので)
念のため。
661デフォルトの名無しさん:2007/07/04(水) 12:20:59
>>630
こいつはいい。GJ
ところで、ArrowLoopについても解説願えないかな…?
あれ全然わかんない。
662デフォルトの名無しさん:2007/07/04(水) 12:53:04
>>630
ArrowApplyの図ってこんな感じで良いんじゃないかと思う。
内側にarrowが入るスロットがあって、第二引数はそのスロットの入力に繋がってる。

  ┌───┐
f─┼─┐ │
  │ ↓ │
  │┏━┓│
b─┼┨ ┠┼→
  │┗━┛│
  └───┘
663デフォルトの名無しさん:2007/07/04(水) 14:09:24
>>662
それだとappの中にarrowが静的にあるような感じになってしまっていまいち。
中のarrowを点線にするといいかもしれません。

でもやっぱり現時点ですと─|と→|はどちらもarrowに入力する、という意味なので統一できなそうです。
664デフォルトの名無しさん:2007/07/04(水) 14:17:01
eclipseが重すぎてよく落ちる@256MB winXP
665デフォルトの名無しさん:2007/07/04(水) 15:34:06
死ねよ貧乏人
666デフォルトの名無しさん:2007/07/04(水) 16:03:41
667デフォルトの名無しさん:2007/07/04(水) 17:13:37
外人 『Japanese! Japanese!』
俺 『うっせえよ毛唐、英語が世界の共通語とかナチュラルに思ってんじゃねえよ』
外人 『hmm…』
俺 『Fack you』
外人 『oh』
外人 『miss spell』
外人 『Fuck you』
俺 『Fuck you』
外人 『good!』

その後、一緒に冒険に出かけ、友人になった
668630:2007/07/04(水) 19:15:00
ArrowApply ≒ Monadって書いたけど、本当はArrowApply = Monadらしい。

つまり、KlisliArrow (ArrowMonad a) は a と等価であるらしい。

細かい証明は載ってないのでArrow則から証明しようと思ったら途中で力尽きた。
圏論に関する知識があるともっと簡単に証明できるんだろうか。

とりあえず後で修正しときます。
669デフォルトの名無しさん:2007/07/05(木) 01:49:52
>>668
訂正するならついでに MonadLoop も MonadFix に……
670デフォルトの名無しさん:2007/07/05(木) 02:08:50
>>630
フォント何つかってんの?
MacでHaskellしてんの?
671デフォルトの名無しさん:2007/07/05(木) 02:37:18
>>670
takuoはVista使い。PDFもAdobe製品で吐いてる。
672デフォルトの名無しさん:2007/07/05(木) 03:37:57
>>669
了解しました。

>>670
イラレ買ったら付いてくる小塚ゴシックです。
673低級プログラマ(Java):2007/07/06(金) 02:36:54
import Char
main = do cs <- getContents
putStrLn $ unlines $ map toUpper cs

ToUpper.hs:4:31:
  Couldn't match expected type `String' against inferred type `Char'
   Expected type: [String]
   Inferred type: [Char]
  In the second argument of `($)', namely `map toUpper cs'
  In the second argument of `($)', namely
    `unlines $ (map toUpper cs)'


      ./       ;ヽ
      l  _,,,,,,,,_,;;;;i  <おいおい ベイべー!
      l l''|~___;;、_y__ lミ;l  たったの三行でもコンパイルエラーだ!!
      ゙l;| | `'",;_,i`'"|;i |  どう足掻いたってコンパイルが通らねぇ!!
     ,r''i ヽ, '~rーj`c=/
   ,/  ヽ  ヽ`ー"/:: `ヽ
  /     ゙ヽ   ̄、:::::  ゙l, ホント 高卒にHaskellは地獄だぜ! フゥハハハーハァー
 |;/"⌒ヽ,  \  ヽ:   _l_        ri                   ri
 l l    ヽr‐─ヽ_|_⊂////;`ゞ--―─-r| |                   / |
 ゙l゙l,     l,|`゙゙゙''―ll___l,,l,|,iノ二二二二│`""""""""""""|二;;二二;;二二二i≡二三三l
 | ヽ     ヽ   _|_  _       "l ̄ ̄ ̄ ̄ ̄ ̄ |二;;二二;;二=''''''''''' ̄ノ
 /"ヽ     'j_/ヽヽ, ̄ ,,,/"''''''''''''⊃r‐l'二二二T ̄ ̄ ̄  [i゙''''''''''''''''"゙゙゙ ̄`"
/  ヽ    ー──''''''""(;;)   `゙,j"  |  | |
674デフォルトの名無しさん:2007/07/06(金) 02:43:28
Couldn't match expected type `String' against inferred type `Char'

ところで、この文章しょっちゅう見かけるんだけど、うまく翻訳できません。
「Char型が推論されたが不可で、String型が期待されたが、マッチできなかった。」

"美しい"日本語を見せてくれませんか。 
675デフォルトの名無しさん:2007/07/06(金) 02:43:53
>>673
unlinesいらないじゃん
676デフォルトの名無しさん:2007/07/06(金) 02:53:23
unlines :: [String] -> String
map   :: (a -> b) -> [a] -> [b]

な、なぜだ・・・
map 使うとリストが返ってくるから、 unlines しなきゃいけないんじゃないのか・・・

OTL
677デフォルトの名無しさん:2007/07/06(金) 02:56:20
toUpperの型をよぅく見るべし
678デフォルトの名無しさん:2007/07/06(金) 03:01:25
Haskell あんまよー知らんけど、
toUpper が Char -> Char で String が [Char] なんじゃないの?
679デフォルトの名無しさん:2007/07/06(金) 03:02:22
>>674
それで十分説明されてると思うけど。
680デフォルトの名無しさん:2007/07/06(金) 03:03:11
期待される型 String が推論された型 Char とマッチさせられませんでした?
681デフォルトの名無しさん:2007/07/06(金) 03:05:09
toUpper :: Char -> Char

■GHCiでいま実行してみた
Prelude> Char.toUpper "abc"
"ABC"

えーと、そうか・・・
map :: (a -> b) -> [a] -> [b]

これを見て、この場合は安易にStringのリストが帰ってくると思い込んでたのか・・・
Charのリスト(=String)が返ってくるのかこの野郎ぅ
682デフォルトの名無しさん:2007/07/06(金) 03:08:45
ぼくは、きょうは、とりあえずGHCiでかくにんしてみる
ということを、おぼえました
                      おやすみ
683デフォルトの名無しさん:2007/07/06(金) 03:13:39
良いことを学んだね。おやすみ。
684デフォルトの名無しさん:2007/07/06(金) 08:05:17
Visual Haskell どない?
http://www.haskell.org/visualhaskell/
685デフォルトの名無しさん:2007/07/06(金) 08:11:56
>>674
型Stringが期待されているが、推論されたのは型Charで、マッチできなかった。
686デフォルトの名無しさん:2007/07/06(金) 09:41:54
型推論を実装するための考え方を詳しく知りたいのですが、
日本語のお勧めの本てあるでしょうか?

>コンピュータサイエンス入門 アルゴリズムとプログラミング言語 (大堀 淳 他)

とりあえずこの本は持ってるんですが、
後半が難しいんで、長い間放置してました。
最近また気になりだして、下の本でλについて勉強やり直そうと思います。
>計算論 計算可能性とラムダ計算 (高橋 正子)

他に手に入る良い本があったら教えてください。
数式沢山出てくるとかより、実装寄りの本がありがたいです。
687デフォルトの名無しさん:2007/07/06(金) 13:58:18
高卒の方にこそHaskellを使ってほしい。
688デフォルトの名無しさん:2007/07/06(金) 14:42:36
ああ、やっぱHaskellってダメだ。
689デフォルトの名無しさん:2007/07/06(金) 14:50:41
質問

googleのツールのところにyoutubeが新しく入ってるんだけど、youtubeってgoogleのサービスだったの?
690デフォルトの名無しさん:2007/07/06(金) 15:04:29
ちょwww
691デフォルトの名無しさん:2007/07/06(金) 15:05:18
スルーしとけ
692デフォルトの名無しさん:2007/07/06(金) 15:25:40
>>681
mapが抜けてまつよ。

Prelude> map Char.toUpper "abc"
"ABC"
693デフォルトの名無しさん:2007/07/06(金) 18:27:25
googleがかなり前に買収しただろうが
694デフォルトの名無しさん:2007/07/06(金) 19:04:09
module Main where

strToInteger = (read :: String -> Integer)

main :: IO()
main = do
putStr "x = "
x <- getLine
putStr "y = "
y <- getLine
putStr ("x + y = " ++ show ( strToInteger x + strToInteger y ) )

あの・・・ x = とか y = とかが表示されない、
というか正確には getLine の前に確実に表示されるように
するにはどうすればいいでしょうか?
695デフォルトの名無しさん:2007/07/06(金) 19:20:39
>>694
stdoutをflushするんだ
696デフォルトの名無しさん:2007/07/06(金) 19:21:17
module Main where

import System.IO (stdout, hFlush)

strToInteger = (read :: String -> Integer)

main :: IO()
main = do
putStr "x = "
hFlush stdout
x <- getLine
putStr "y = "
hFlush stdout
y <- getLine
putStr ("x + y = " ++ show ( strToInteger x + strToInteger y ) )
697デフォルトの名無しさん:2007/07/06(金) 22:38:51
藻前ら詳しいんだから、haskellの解説本書いてクレヨン
698デフォルトの名無しさん:2007/07/06(金) 22:50:00
Haskellの長所については十分知ってるし、もう聞き飽きたので、
Haskellの弱点を取り上げた解説本が欲しいな。

「Haskellでうまくいかない1000の理由」とか。
699デフォルトの名無しさん:2007/07/06(金) 22:55:05
>>698
ちょっ、1000もあるのかよw
700デフォルトの名無しさん:2007/07/06(金) 23:25:47
むしろ少なすぎるだろう。
701デフォルトの名無しさん:2007/07/07(土) 06:50:07
Haskell.NET はどこ?
702デフォルトの名無しさん:2007/07/07(土) 06:57:13
H#: The Haskell.net Project
http://www.cin.ufpe.br/~haskell/haskelldotnet/
プロジェクトは止まってるっぽいけど。
703デフォルトの名無しさん:2007/07/07(土) 14:15:14
はじめてのH
704デフォルトの名無しさん:2007/07/07(土) 15:50:29
頭文字省略はHSP.NETと区別つかんから
やめてほしい
705デフォルトの名無しさん:2007/07/07(土) 19:06:58
HSP.NETて・・
706デフォルトの名無しさん:2007/07/07(土) 19:35:15

お嬢さん、ワシといっしょにH(askell)せんか?
 
707デフォルトの名無しさん:2007/07/07(土) 19:40:54
いいわよおじさん、でもアタシ、ドS(tatic)よ?
708デフォルトの名無しさん:2007/07/07(土) 19:52:57
性的なのか
709デフォルトの名無しさん:2007/07/07(土) 20:12:00
誰か俺にM(onado)を教えてください……orz
710デフォルトの名無しさん:2007/07/07(土) 20:31:36
愛は SKK
711デフォルトの名無しさん:2007/07/07(土) 20:36:18
Haskellの弱点か…

・根本的に実行効率が良くないのは弱点だろう。
・あとはかなり言われているけど、モジュールシステムが貧弱。
・型クラスとモナド、高階な型が合わさって複雑になりがちで初学者には敷居が高い。
(複雑になっても型付きのおかげでバグが混入することは少ないのだけど。)
・多バイト文字の扱いが非常に貧弱。
・純粋関数的でグローバル変数や状態が書きづらいのでモジュール性だとかメンテナンス性が低くなりがち。
 リファクタリングツールが充実すればある程度はなんとかなるのだけれど。
・データや「もの」を中心にしたプログラミング(オブジェクト指向のような)ではなく
 処理を中心にしたプログラミングなため、従来のプログラマの直観に合わない。
・Javaや、Rubyのような軽量言語と違い現実のプログラミングにすぐ適用できるフレームワークやライブラリがない。
 あっても型による技巧に走りがちで習得に時間がかかったりする。
・能力がそこそこなプログラマを多数雇うような開発形態には圧倒的に不向き。
 (モダンな関数型言語はすべからくそうなるだろうが)
712デフォルトの名無しさん:2007/07/07(土) 20:39:51
型クラスって、OCamlのようなモジュールシステムと違って使いどころが複雑になりがちという気がする。
モジュールシステムはトップダウンだが、型クラスは必要に応じて使うために必然的にボトムアップになり、大まかなコードの把握には向かないというか。
713デフォルトの名無しさん:2007/07/07(土) 21:18:35
・レコードが扱いにくい。フィールドラベルの名前空間がモジュール単位だったり。
・型レベルの計算が書きにくい。
・GHCの出力がLGPLのlibgmpに依存している。
714デフォルトの名無しさん:2007/07/07(土) 21:55:09
・純粋関数なのでprintfデバッグができない。
715デフォルトの名無しさん:2007/07/07(土) 21:57:41
>>714
Debug.Trace使え。
もしくはunsafePerformIO
716デフォルトの名無しさん:2007/07/07(土) 22:27:22
>>710
だれうま
717デフォルトの名無しさん:2007/07/07(土) 22:28:29
Haskellに向いてるアプリケーションって例えばどんなのよ
遅延評価が役にたつような
718デフォルトの名無しさん:2007/07/07(土) 22:35:57
>>717
賽の河原の石積み
719デフォルトの名無しさん:2007/07/07(土) 22:54:08
動的計画法を考えたまま使えるというのが利点か?
それでもHaskell自体に慣れる必要があるが
720デフォルトの名無しさん:2007/07/08(日) 09:12:10
>>718
最高の応用先だな
721デフォルトの名無しさん:2007/07/08(日) 15:41:48
このスレを見ている人はこんなスレも見ています。(ver 0.20)
SADでも必死に会社に行っている人 [メンタルヘルス]
圏論 / カテゴリー論 / Category Theory 3 [数学]

お前らも大変だな
722デフォルトの名無しさん:2007/07/08(日) 15:47:14
そういや、小飼弾氏もなんかの対談で、
アイドルマスターは、遅延評価がほにゃららみたいなことを言ってた
http://www.youtube.com/watch?v=IOKtbRNl1SM&mode=related&search=

要は、曲に合わせて、キャラクターが自動的に判断して踊ると。
723デフォルトの名無しさん:2007/07/08(日) 19:28:41
オタクきも
724デフォルトの名無しさん:2007/07/08(日) 21:24:50
まあそう言うなって
725デフォルトの名無しさん:2007/07/08(日) 21:26:25
>>713
>・型レベルの計算が書きにくい。

そんなのが書き易い言語ってこの世に存在するのか?CoqとかAgdaとか?
726デフォルトの名無しさん:2007/07/08(日) 21:46:59
>>725
念頭にあったのはC++。
727デフォルトの名無しさん:2007/07/09(月) 03:03:50
> ・純粋関数的でグローバル変数や状態が書きづらいのでモジュール性だとかメンテナンス性が低くなりがち。
素人なりにHaskellでいくつかプログラムを書いてみて
これはかなり不便に感じた。
あとになって参照したい設定項目が増えたときなんか
Haskellじゃなかったら修正楽だろうなって思うこと多々。
728デフォルトの名無しさん:2007/07/09(月) 03:43:08
研究者って、なんでHaskell支持してんだろ
モジュール性だとかメンテナンス性の向上を研究してるはずなのに
これ↓じゃ意味無いじゃん
> ・純粋関数的でグローバル変数や状態が書きづらいのでモジュール性だとかメンテナンス性が低くなりがち。
729デフォルトの名無しさん:2007/07/09(月) 03:54:30
それにとってかわるやり方があるんじゃねーの?
730デフォルトの名無しさん:2007/07/09(月) 04:12:00
>>729
あればいいなあ、という段階
731デフォルトの名無しさん:2007/07/09(月) 05:02:22
implicit parameterでは解決になってない?
型を書くのが面倒になるから俺は使ってないけど。
732デフォルトの名無しさん:2007/07/09(月) 08:56:03
>>711っす。

>・純粋関数的でグローバル変数や状態が書きづらいのでモジュール性だとかメンテナンス性が低くなりがち。
は、
>731とか、あとは適切な抽象データ型で隠蔽する(=他のプログラミング言語と同じで)、ってのが正解だと思って書きました。
たとえばある関数で別の場所にある変数が必要になった場合、implicit parameterで渡すってのはかなりやりやすいと思います。
もしくは、適切に定義した抽象データ型を使いまわしているならば、そのコンストラクタにフィールドを一つ追加すればOKになるはず。

純粋関数的な枠組みはメリットも多いのではないかな、…たとえばリファクタリングがゴリゴリできるとか(HaReとか

733続き:2007/07/09(月) 09:04:41
Haskellでは、アドホックなグローバル変数の追加ができないという制限のために、むしろ
Haskellプログラマは抽象データ型を使ってモジュール性を高く設計するようになるんじゃないかなーと思ってます。
『モジュラープログラミング養成ギプス』という感じで。
純粋関数的な枠組みに制限されているためにバグが減るのと似たような感じ。

もちろん、アドホックにグローバルな状態を追加できる他言語で開発したほうが、短期的には使い易くなると思うけれど。
734続き:2007/07/09(月) 09:15:32
あ、これだと「状態が書きづらい」は解決になってないかも。
たとえば純粋関数fに状態を入れる場合は、
純粋関数 (f :: ... -> X) の型を (f :: ... -> IO X) とか (f :: ... -> State s X) に修正する必要がある。
735デフォルトの名無しさん:2007/07/09(月) 18:53:52
一方ロシアはMLを使った。
736デフォルトの名無しさん:2007/07/09(月) 20:48:46
MoscowMLのことかー!
737デフォルトの名無しさん:2007/07/09(月) 22:03:31
一方そのころ中国では
738デフォルトの名無しさん:2007/07/09(月) 22:09:42
計算尺を使った人力アナログコンピュータが大流行
739デフォルトの名無しさん:2007/07/09(月) 22:25:56
人海戦術による超並列コンピューティング
740デフォルトの名無しさん:2007/07/09(月) 23:05:32
>>739
戦時のアメリカだな
741デフォルトの名無しさん:2007/07/10(火) 00:01:32
一斉ジャンプによる巨大地震兵器を開発
742デフォルトの名無しさん:2007/07/10(火) 00:06:23
そして地球は蹴の冬 or 蹴の夏へ
743デフォルトの名無しさん:2007/07/10(火) 09:44:05
ttp://www.willamette.edu/~fruehr/haskell/evolution.html
ついていけないオワタ\(^o^)/
744デフォルトの名無しさん:2007/07/10(火) 12:36:34
Pointlessワロタ
745デフォルトの名無しさん:2007/07/10(火) 12:43:27
>>743
俺は Another junior Haskell programmer か・・
746デフォルトの名無しさん:2007/07/10(火) 13:07:16
747デフォルトの名無しさん:2007/07/10(火) 19:19:41
haskellの無限リストはPythonのジェネレータなんかにとって
変わられるのでは。無限リストはメモリ馬鹿食いするからやってられない。

def fib():
a = b = 1
while True:
yield a
a,b = b, a+b
for n in fib(): print n # フィボナッチ数列

遅いし
ライブラリ少ないし
英語必須だし
デバッグしづらいし
デバッグしづらいし

まあ、haskell学習中の八つ当たりの書き込みですけど。
748デフォルトの名無しさん:2007/07/10(火) 19:33:26
無限リストのどこがメモリバカ食いすると?
それに速さを追求しながらPythonを使うというのもおかしな話。
749デフォルトの名無しさん:2007/07/10(火) 20:58:17
>>747
無知丸出しだな
750デフォルトの名無しさん:2007/07/10(火) 22:02:24
python は恐らくghciより遅いぞ。
試してないけど。
751デフォルトの名無しさん:2007/07/11(水) 03:30:05
>>747
あほか
遅延評価なめるな
752デフォルトの名無しさん:2007/07/11(水) 12:30:58
そうかもしれないですね。学習続けます。

ところで『ふつうのHaskellプログラミング』と『入門Haskell』
を読み終えたので次の学習対象を探していたところ、
『An Introduction to Functional Programming Systems Using Haskell』
を図書館で見つけたのですが、誰か読んだ経験のある人、
今の段階の学習レベルとしてこの本は適切だと思われますか?
753デフォルトの名無しさん:2007/07/11(水) 12:42:34
>>752
入門Haskell、ふつうのHaskell読んだならAn Intro...は内容が重複しているから読まなくてもよさそうな気がする。
それよりもライブラリの方をよく勉強した方がいい。
というのは、Haskellのライブラリの場合はCのライブラリとかと違って使いやすさとかそういうのよりも、
数理理論面の方が強いから、実装のしかたとかが独特で勉強になると思うよ。
754デフォルトの名無しさん:2007/07/11(水) 12:44:38
あとは、論文になっちゃうかな。
Scrap your boilerplateなどの論文も読んでみるといい。
Allows関連も勉強してみるといい。
755デフォルトの名無しさん:2007/07/11(水) 12:47:58
ありがとうございます。探してみます
756デフォルトの名無しさん:2007/07/11(水) 18:36:36
>754
Allows
Allows
Allows
Allows
757デフォルトの名無しさん:2007/07/11(水) 18:48:56
Arrows
758デフォルトの名無しさん:2007/07/11(水) 23:15:53
なんでこんなにArrowが盛り上がってるの?いや、>>756-757の話じゃなくて。
なんかあるの?
Haskell'でMonad廃止してArrowにする事になったとか?
759デフォルトの名無しさん:2007/07/11(水) 23:35:32
Haskellっていまだに10年前の仕様なんだろ?
いい加減時期バージョンの情報とかないのか
760デフォルトの名無しさん:2007/07/11(水) 23:54:10
761デフォルトの名無しさん:2007/07/12(木) 02:01:53
もう寝るから翻訳よろしく
762デフォルトの名無しさん:2007/07/13(金) 21:33:42
Arrowって、Monad経験がほとんど無い初級者でも使って嬉しい?
ふつける読んでGHCちょっといじって見た程度なんだけど。
難しいモナドは使ったことないし、liftも使ったことないし、合成なんて何それ状態。
763デフォルトの名無しさん:2007/07/13(金) 22:03:30
Haskell使ってる奴って何なの?
今時OCamlだろwウケるw
764デフォルトの名無しさん:2007/07/13(金) 22:07:11
一時の気の迷いでHaskellに手を出したら抜けられなくなりました。
765デフォルトの名無しさん:2007/07/13(金) 22:57:25
とりあえず遅延評価マスターになるまでは辞めるつもりないなー
あと2〜3年かかりそうだが
766デフォルトの名無しさん:2007/07/14(土) 02:17:42
遅延評価なんて、必要になったら勉強すれば良いじゃない
767デフォルトの名無しさん:2007/07/14(土) 02:36:59
俺みたいな趣味グラマには必要な時は来ないんだよ
自分の中でなんかスッキリした気持ちになった時が快感なんだ
768デフォルトの名無しさん:2007/07/14(土) 03:03:17
>>767
>766は遅延評価の勉強を遅延評価しろって言いたかっただけだと思われ
769デフォルトの名無しさん:2007/07/14(土) 03:09:08
>>767 は、遅延評価にしたら永遠に評価されないよって事でしょ。
770デフォルトの名無しさん:2007/07/14(土) 03:19:48
ボケにマジで返したらダメでしょ
771デフォルトの名無しさん:2007/07/14(土) 03:25:12
シュールな
772デフォルトの名無しさん:2007/07/14(土) 08:29:50
俺早漏だから、 Haskell がうらやましい。
773デフォルトの名無しさん:2007/07/14(土) 08:53:53
haskellを習って使ってから仕事でjavaに戻った。苦しいよ。後ろ手で縛られているみたい。mapとタプルはどこ?
774デフォルトの名無しさん:2007/07/14(土) 08:59:25
C++ 使う。
boost 使う。
775デフォルトの名無しさん:2007/07/14(土) 13:52:14
昔は、GHCに-jで、Java吐けたんでしょ?
今は動きないの?
776デフォルトの名無しさん:2007/07/15(日) 23:02:40
処理系の価値は「昔どうだったか」できまるもんじゃねぇ
「今現在どういうやつか」できまるもんよ
777デフォルトの名無しさん:2007/07/16(月) 03:07:09
犯罪者にとっては、haarp使ってスマトラ沖地震などを起こして
10〜20万人を殺すことも基本だからな。
778デフォルトの名無しさん:2007/07/18(水) 00:17:01
先生、なんでCやJavaにはタプルがないとですか?
779デフォルトの名無しさん:2007/07/18(水) 01:32:31
一昨日には沢山の地震が起きましたね。
サイバネティクスに詳しい人なら知っていますが、
犯罪者にとっては、マイクロチップをインプラントして
マインド・コントロールするのも常識ですね。

そんな、他の計算時間を奪ったり、
他の計算プログラムを破壊したり、
共有データを捏造したりする、
ヒューリスティクス計算法をユダヤソルバと言います。

二番煎じは中華ソルバですが。
780デフォルトの名無しさん:2007/07/21(土) 11:15:17
ハスケルっていう言葉の響きが好きだ
781デフォルトの名無しさん:2007/07/21(土) 12:33:43
ずっとハクセルだとおもってた
782デフォルトの名無しさん:2007/07/21(土) 18:48:40
純粋関数型言語セクロス
783デフォルトの名無しさん:2007/07/28(土) 13:16:28
誰かGHCのマニュアルを日本語に翻訳してくれ〜
784デフォルトの名無しさん:2007/07/28(土) 13:20:40
>>783
オマエモナー
785デフォルトの名無しさん:2007/07/28(土) 13:49:44
786783:2007/07/28(土) 17:03:47
>>785
thx
787デフォルトの名無しさん:2007/07/28(土) 21:20:36
今主にCかpythonを使ってるんですが関数型言語もやりたくなってきあsみた
788デフォルトの名無しさん:2007/07/28(土) 21:29:17
禿げるよ?
789名無しさん@そうだ選挙に行こう:2007/07/29(日) 01:42:14
もう毛根はかなりキているのでむしろ潔く禿げてしまいたいです。
こんな私ですがよろしくお願いします。
790名無しさん@そうだ選挙に行こう:2007/07/29(日) 02:01:24
マジメな話さ
彼女(彼氏)いないプログラマって、白髪めちゃめちゃ多くないか?

セックスって健康面でとても大事な行為なんだな
791名無しさん@そうだ選挙に行こう:2007/07/29(日) 13:21:54
SchemeとかHaskellに慣れるとCの関数ポインタの型の柔軟性の
無さにイライラするようになる。
Pythonで高階関数を頻繁に使うようになる。
792名無しさん@そうだ選挙に行こう:2007/07/29(日) 14:20:40
それがよいことかどうか
793名無しさん@そうだ選挙に行こう:2007/07/29(日) 14:26:24
Scheme や C は同一リスト中に様々な型のデータを混在させる事が
出来るけど Haskell は出来ないよね。
794名無しさん@そうだ選挙に行こう:2007/07/29(日) 14:28:50
>>793
データ型で実現可能
795名無しさん@そうだ選挙に行こう:2007/07/29(日) 14:38:23
>>793
混在させるだけならいくらでも。
import Data.Dynamic
list = [toDyn 4, toDyn "foo", toDyn sqrt]

やりたいことによってはもっと良い方法があるかも。
796デフォルトの名無しさん:2007/07/30(月) 06:36:22
関数プログラミングってのは、C++とemacs Lispのプログラマには無縁?
Lispユーザといっても簡単なマクロみたいな使い方だからなぁ
797デフォルトの名無しさん:2007/07/30(月) 06:54:22
「関数的なプログラミング」なら言語はあまり問わない場合もある。
純粋かどうかを気にする人には邪道だろうけど。
798デフォルトの名無しさん:2007/07/30(月) 21:40:33
elispはlispの中でもまた特殊なやつだし。
799デフォルトの名無しさん:2007/07/30(月) 23:35:21
C++ハゲとHasKellハゲはどちらがハゲなのか
800デフォルトの名無しさん:2007/08/01(水) 01:49:14
>SADでも必死に会社に行っている人
悪意のある低知能はこんなスレを関連させるな。
801デフォルトの名無しさん:2007/08/02(木) 00:09:12
329 :名無しさん@八周年:2007/08/01(水) 21:28:10 ID:ZHT1JrWe0
>>308
haskellがすでに大流行してる。本屋でもHaskell本だらけだし、
Javaから呼び出してJVM上で動かせるし。最近ではプログラム
始めたばかりの初心者でも普通にモナドを使いこなしてる。


Javaから呼び出して?VM上で?できたっけ???
802デフォルトの名無しさん:2007/08/02(木) 00:39:53
スレッドを>>1から読むんだ
803デフォルトの名無しさん:2007/08/02(木) 01:54:15
まさかjhaskellってオチじゃなかろうな・・・
でもそれだとjavaから呼び出すことにはならないし・・・
なんなんだろう?
804デフォルトの名無しさん:2007/08/08(水) 12:59:03
Haskel.NET だぜ。
805デフォルトの名無しさん:2007/08/08(水) 13:07:46
しかしIOモナドってひどいネーミングだな。
モナドであることはIOの性質の一つに過ぎないのに。
実際、IOを扱うためにはまずモナドを理解しなきゃならんと
勘違いしてる入門者は多いんじゃないだろうか。
806デフォルトの名無しさん:2007/08/08(水) 14:10:12
>>805
それ、俺。
C/C++/Java しか使ったことがないので
面白そうだなと思って入門的なウェブページ
眺めてみたけど、「モナド」とかわけわかめな用語が出てきて挫折。
「俺は、俺は、Hello World とかしたい程度なのに」と絶叫、死亡。
代数学で出てきたような気もするが、全然意味が違う気もする。
というより、なんかゴルゴ13に狙撃されそうな名前だしさ。
807デフォルトの名無しさん:2007/08/08(水) 23:23:52
>>806
もさ……もさもさ
808デフォルトの名無しさん:2007/08/09(木) 02:34:13
>>805
モナドの定義より先にHaskellでのモナドの実装をみる方がHaskellでモナドプログラミングするためには良いと思う。
809デフォルトの名無しさん:2007/08/09(木) 22:57:00
>>806-807 ハゲシクワロタ
810デフォルトの名無しさん:2007/08/10(金) 00:31:17
What is monad?
That is what when you lose one gonad.
811デフォルトの名無しさん:2007/08/10(金) 17:52:50
Fランク大の落ちこぼれが
東大学部生の教養プログラミングに
物申す展開か
812デフォルトの名無しさん:2007/08/11(土) 11:19:39
やべーな、arrow流行らせちまった・・・2chでもblogでも日本で最初にarrowのこと書いたの俺だ・・・
813デフォルトの名無しさん:2007/08/11(土) 16:59:13
自慢かよ
814デフォルトの名無しさん:2007/08/11(土) 20:22:01
>>812
なんかサンプルコードキボンヌ
815デフォルトの名無しさん:2007/08/12(日) 02:22:50
俺の真理: 英語が苦手なやつほどながったらしい関数名をつける
816デフォルトの名無しさん:2007/08/12(日) 12:26:33
じゃあ俺の真理: 真理とかもう逝っちゃってる奴らだな
817デフォルトの名無しさん:2007/08/12(日) 19:55:12
俺の真理のことを悪く言うな!!
818デフォルトの名無しさん:2007/08/13(月) 14:24:17
でも、Haskell'には、Arrowは入らないらしいが。-<の事だと思うけど。
819デフォルトの名無しさん: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ではどう書いたらよいですか。

820デフォルトの名無しさん:2007/08/17(金) 23:52:32
>>819
T型の値を変更する関数を書く代わりに、T型の値を受け取ってT型の値を返す関数を書くのが定石。
俺ならこんな感じで書く。

getRen :: IgoBoard -> Point -> Stone -> Set Point
getRen board point stone = augmentRen point empty
  where
    augmentRen :: Point -> Set Point -> Set Point
    augmentRen (Point x y) ren
      | stone == boardGetStone board && not (member point ren)
        = augmentRen (Point x (y-1)) $
          augmentRen (Point x (y+1)) $
          augmentRen (Point (x-1) y) $
          augmentRen (Point (x+1) y) $
            insert point ren
      | otherwise = ren
821820:2007/08/18(土) 00:28:29
ひどいバグを仕込んでた。
(Point x y)のところはpoint@(Point x y)で。
822819:2007/08/18(土) 11:03:32
>>820
ありがとうございます。
augmentRenを直列に並べるのは思いつかなかったです。
なぜか並列に並べなければいけないという思い込みがありました。
823819:2007/08/24(金) 23:54:16
819です。
囲碁のルールをhaskellで実装してみました。
(純碁なので上げハマを数える機能は実装してない。パスも未実装)

http://www.uploda.net/cgi/uploader4/index.php?file_id=0000018533.udn

ここはこう書くと処理が速くなるとか、
こうしたほうがエレガントだとかありましたら教えてください。
宜しくお願いします。
824デフォルトの名無しさん:2007/08/26(日) 03:13:50
ドキュメントを眺めていて、instance Monad ((->) r) というのを見つけました。
「rから何かへの関数」がモナドになっているみたい。実装は Control.Monad.Instances 内。

モナドだというからにはdoで連ねることができるんだろうけど、どういう挙動になるんだろう。
825デフォルトの名無しさん:2007/08/26(日) 04:28:52
>>824
Hugsのファイルを見てみたら
instance Monad ((->) r) where
return = const
f >>= k = \ r -> k (f r) r
ってなってたので、いくつか試してみた。

f = succ >>= (*)
f 5
=> (\ r -> (*) (succ r) r) 5
=> (succ 5) * 5
=> 30

p = id >>= (,)
p 5
=> (5,5)
826デフォルトの名無しさん:2007/08/26(日) 06:23:42
>>824
Readerモナドと同じ。関数をReaderにラップする手間が省けるだけ。
827デフォルトの名無しさん:2007/08/26(日) 11:05:36
>>826
Control.Monad.Readerに instance MonadReader r ((->) r) ってのがあるね。
828819:2007/08/26(日) 15:34:26
すいません。また教えてください。
haskellは演算子を定義できるそうですが、Pointに+を定義しようとしたらコンパイルエラーになりました。
どうも、数値の+とかぶっているから駄目ぽいのですが回避する方法はあるでしょうか。
なお演算子を+++にしたら動きましたが、見た目がダサいので何とか+を使いたいです。


============ソース===========
data Point = Point_new { x :: Int , y :: Int }
  deriving ( Show )

(+) :: Point -> Point -> Point
a + b = Point_new ((x a)+(x b)) ((y a)+(y b))

main = putStrLn $ show $ ((Point_new 3 4 ) + (Point_new 5 7))

=============コンパイルエラー==================

test.hs:5:24:
Ambiguous occurrence `+'
It could refer to either `+', defined at test.hs:5:2
or `+', imported from Prelude

test.hs:5:38:
Ambiguous occurrence `+'
It could refer to either `+', defined at test.hs:5:2
or `+', imported from Prelude

test.hs:7:43:
Ambiguous occurrence `+'
It could refer to either `+', defined at test.hs:5:2
or `+', imported from Prelude
829デフォルトの名無しさん:2007/08/26(日) 16:24:38
(+) :: Num a => a -> a -> a
だからPointでも(+)を使いたいならPointをNumクラスのインスタンスにしないとダメ。

まずNumクラスのインスタンスであるためにはEq, Showクラスのインスタンスである必要があるから
data Point = Point_new { x :: Int , y :: Int } deriving ( Eq, Show )

Numクラスのインスタンスにするためには(+),(*),abs,signum,fromIntegerを定義しないとダメ。
ただ今回の場合(+)さえ使えればいいってことだろうから、(+)以外はダミー定義にしてしまう。
instance Num Point where
  Point_new x1 y1 + Point_new x2 y2 = Point_new (x1+x2) (y1+y2)
  (*) = undefined
  abs = undefined
  signum = undefined
  fromInteger = undefined

これでPoint_new 1 2 + Point_new 2 3が出来るようになる。
830デフォルトの名無しさん:2007/08/26(日) 16:32:59
>>828
そのソースなら、+の代わりにMain.+やPrelude.+と書いて
曖昧性を除けば良い。面倒だけど。
自分で+を定義せずにPrelude.+を拡張するなら>>829の通りだけど、
乗算が定義されていない型をNumのインスタンスと宣言しないといけない。
Haskellの弱点の一つだな。
831819:2007/08/26(日) 19:58:45
>>829 >> 830
どちらの方法でもいけることを確認しました。
829の方法を採用させていただきたいと思います。
クラスについても勉強したいと思います。
ありがとうございました。
832デフォルトの名無しさん:2007/09/03(月) 14:55:42
HaskellでScheme処理系を実装するチュートリアル「Write Yourself a Scheme in 48 Hours」
http://halogen.note.amherst.edu/%7Ejdtang/scheme_in_48/tutorial/overview.html
833デフォルトの名無しさん:2007/09/03(月) 19:20:24
それ単に Scheme を解釈出来るプログラムが作成出来るだけで、
マルチコアでスケールする Scheme とか、リアルタイム性能を持った
Scheme とか、大量のメモリを効率良く使える Scheme が書ける訳じゃ
ないんだよね。ただ、世間に出回っている Scheme 処理系を 1 つ
増やしたいだけなのであれば C で充分。
834char:2007/09/03(月) 19:28:41
   |
   >>833
   |
   J


835デフォルトの名無しさん:2007/09/03(月) 20:48:50
>>833
そうですよねー
836デフォルトの名無しさん:2007/09/03(月) 21:25:25
チュートリアルなんだから書くことに意義があるんだろ。
それにCで十分てのも意味不明。CでできるからってCを使う理由にはならないだろ。
837デフォルトの名無しさん:2007/09/03(月) 22:54:43
Haskell が産声をあげた頃、r4rs の表示的意味論を Haskell でコーディングしてみたことがあった
call/cc とかもちゃんと動いてちょっと感動した記憶がある
プログラム意味論の面白さを始めて実感した瞬間だったな
838デフォルトの名無しさん:2007/09/04(火) 00:49:16
Lisp で Prolog 書いたり、Haskell で Perl 6 書いたり、SML で ECMAScript 書いたりするのは
楽しいんだろうけど、動いたらおしまいなんだよね? 常用出来る様な処理系を書こうとしたら C や
C++ で書き直す事になるでしょ。何かむなしいのう…
839デフォルトの名無しさん:2007/09/04(火) 02:31:40
>>838
Prologくらいの変り種になると,それを何かの言語で実装したものは(toy実装であっても)
例えば「ユニフィケーションライブラリ」とでも呼ぶべき存在になるので
けっこう実用性があると思うけど.
On LispというLispの本ではデータベースのインタフェイス(普通ならSQLが来る位置?)
としてPrologを実装してた.
840デフォルトの名無しさん:2007/09/04(火) 02:48:12
>>838
hsをCにコンパイルすれば問題ない
841デフォルトの名無しさん:2007/09/04(火) 02:50:36
>楽しいんだろうけど
それが大事なんじゃないの?
842デフォルトの名無しさん:2007/09/04(火) 11:05:43
>>838
HaskellでPerl6、SMLでECMAScriptってのは
そもそもその時点で動作する処理系自体が存在しなかったから
実用性よりもまずきちんと動くことが重要。
843デフォルトの名無しさん:2007/09/04(火) 11:14:11
Pugs知らないんだけど、Parrot経由でも実用にならないの?
844デフォルトの名無しさん:2007/09/04(火) 20:13:46
ParrotでなかなかPerl6が作れないうちに、HaskellでPerl6(仮)が書けちゃったってのがPugs。
実用云々を言う以前に、Perl6の仕様は固まりきっていないんだけどね。
845デフォルトの名無しさん:2007/09/04(火) 21:46:39
>>844
>>843 が『Parrot 経由』と言ってるのは、Pugs に Parrot 用のアセンブラを吐かせて
Parrot VM で実行するという事じゃないかな。Parrot が実用になった暁には、そういう
アプローチはありだと思う。ただし、Parrot が実用になるのは…

>>832 のチュートリアルを一通り読んだら、自分でインタープリタを改造して JavaVM /
MS CLR / Mono VM / Parrot VM / LLVM 用のコンパイラを作れば良いんだよね。
と、>>832 の中身を読まずにカキコ。
846デフォルトの名無しさん:2007/09/05(水) 00:40:27
SML の ECMAScript の実装も Tamarin 向けのコンパイラだったら良かったなあ。
847デフォルトの名無しさん:2007/09/06(木) 18:10:20
なんか生息しているProlog使いが涙目になる一連のLtUエントリ:

Escape 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。
後者はしらん
848デフォルトの名無しさん:2007/09/07(金) 18:58:30
849デフォルトの名無しさん:2007/09/07(金) 19:12:05
Tamarinが悪いのっ!
850デフォルトの名無しさん:2007/09/08(土) 19:09:21
すみません、関数型初心者なんですけど、勉強するならHaskellがいいんでしょうか。
Ocamlとかありますが、こちらは関数型としてはルーズな仕様と聞きました。

関数型の特徴を一通り体験できる、典型的な言語って何でしょうか。
851デフォルトの名無しさん:2007/09/08(土) 19:22:29
Haskell
852デフォルトの名無しさん:2007/09/08(土) 19:30:43
>>850
関数型の重要な特徴はどっちにもあるから好きに選べば良い。
むしろ、HaskellとOcamlの両方にあるのでなければ「典型的な」特徴と言いにくい気がする。
片方を知ればもう片方を学ぶのも比較的簡単なので、気に入らなければやり直せば良いし。
853850:2007/09/08(土) 19:55:57
HaskellとOcamlとの違いは、厳格かルーズか、でしょうか?Ocamlはちょっと調べて
みたんですけど、とっつきやすい感じがしました。

あと、ドキュメント、ライブラリが充実しているのはどちらなんでしょうか。
854デフォルトの名無しさん:2007/09/08(土) 19:59:52
25歳。
去年まで金無し君だったけど、Haskellで
二年で350万貯めた。一度やってみなよ。
初回のみだけど、参照透明性を捨てれば副作用(4000円くらい)が貰える。
もらうだけもらってプレイせずに換金することもできるし、遅延評価を
思い切って止めてしまえば50パーセントで二倍速になる。
金なきゃMLスレで布教活動すればいいだけ。暇つぶしになる。
\とか$とか色々あるのでマジでお勧め。
855デフォルトの名無しさん:2007/09/08(土) 22:50:41
>>854 にさりげなく吹いてしまったんだが、
このコピペの元ネタを教えてはもらえまいか?
856デフォルトの名無しさん:2007/09/08(土) 23:01:06
857855:2007/09/11(火) 03:09:22
>>856
遅くなったがありがトン
858デフォルトの名無しさん:2007/09/11(火) 04:22:35
OCamlのほうが厳格(strict) だろ。

859デフォルトの名無しさん:2007/09/11(火) 11:35:14
>>858
【審議拒否】
      ∧,,∧  ∧,,∧
 ∧∧ (・`  ) (  ´・) ∧∧
(ω・` ) U  )  (  Uノ( ´・ω)
| U   u-u   u-u (U  ノ
 u-u ∧,,∧  ∧,,∧  u-u
    (・ω・`) (´・ω・)
    (l  U)  (U  ノ
    `u-u'.  `u-u'
860デフォルトの名無しさん:2007/09/11(火) 12:46:43
haskellでターン制ストラテジーゲームとか作れますか?
861デフォルトの名無しさん:2007/09/11(火) 13:04:36
作れる。
ただし、ライブラリが腐ってたときに、自分で回避策を書いたり
パッチを送ったりする気になる程度にHaskellを愛していないと、
やってられなくなるかも。
862デフォルトの名無しさん:2007/09/11(火) 13:20:14
C++以上の茨の道になりそうですね…
入門書のサンプル弄ったり、C用のアルゴリズム辞典のアルゴリズムを移植して満足しているレベルの俺には
ほぼ絶望的ってことはわかりました
863デフォルトの名無しさん:2007/09/11(火) 14:56:09
GHCでコンパイルすると起動したときDOS窓が出るけど、出さないようにするオプションは無いの?
864デフォルトの名無しさん:2007/09/11(火) 15:19:46
>>863
-optl-mwindowsをつけてコンパイル
865デフォルトの名無しさん:2007/09/13(木) 01:48:17
haskellを勉強したいんですけど、入力補完してくれるツールってありますか?
866デフォルトの名無しさん:2007/09/13(木) 02:21:35
emacs
867デフォルトの名無しさん:2007/09/14(金) 09:14:18
emacsかぁ。自分は慣れてないからなぁ。

とりあえず、eclipseのプラグインとか、Visual Haskelとか入れてみたんですけど
入力支援とかうまくできないみたい。

emacsですか、そうですか。
868デフォルトの名無しさん:2007/09/16(日) 19:09:01
Haskellって(ADTはあるにはあるけど)、
リストとかalistとかのデータ構造を直接操作するのが多くて、
そのせいでスケーラブルじゃないプログラムが量産されてる気がする
869デフォルトの名無しさん:2007/09/16(日) 19:54:44
気がするといえば、Haskellで書いたコードはモジュール性はかなり高くなるけど
再利用性が低い気がする
870デフォルトの名無しさん:2007/09/16(日) 20:05:19
もうHaskellもうんこでいいよ…
あとうんこじゃない言語を知ってる人は俺に教えてくれ。

>>869
俺はむしろ逆の印象を受ける。
再利用に強いが変更に弱い。
871デフォルトの名無しさん:2007/09/16(日) 20:21:05
>>868
Lispを筆頭に関数系は大抵そうじゃないかと思ったが、
それ以前に、スケールするかどうかは、テータ構造を直接触ってるかどうかと関係ないのではないか。
872デフォルトの名無しさん:2007/09/16(日) 22:08:57
ここで言ってるスケールってどういう事?
問題の規模に応じたスケール?
873デフォルトの名無しさん:2007/09/16(日) 22:32:24
>>870
C#
874デフォルトの名無しさん:2007/09/17(月) 07:20:59
>>873
Dと比べるとC#なんてうんこ
875デフォルトの名無しさん:2007/09/17(月) 08:23:15
Dってまだ生きてたの?
876デフォルトの名無しさん:2007/09/17(月) 11:58:23
>>874
Dはないw
コンパイラもライブラリもボロボロ
あれで何か作るって無謀すぎる
まだ形になってるC#の方がまし
877デフォルトの名無しさん:2007/09/17(月) 12:30:48
>>875
D自体は相変わらず突っ走ってるよ。
バグ取りもそこそこに、言語機能をどんどん追加していってる。
実装予定してる機能も多数ある。
それに対して、取り巻きの方は死んでる。
どのプロジェクトも、ライブラリを最新版のコンパイラで動かすのをあきらめてる状態。
もうみんなやる気ないみたい。
878デフォルトの名無しさん:2007/09/17(月) 20:30:25
Dはちょっとやろうかなという気にさせる魅力はあるが、
付き合いたくはないね。
879デフォルトの名無しさん:2007/09/20(木) 21:44:57
http://www.flightless-wing.com/index.php?%A5%D7%A5%ED%A5%B0%A5%E9%A5%DF%A5%F3%A5%B0%2FHaskell%2F%C6%FE%CC%E7
を見ながら勉強しています。
ここに出てくる
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を使っています。
880デフォルトの名無しさん:2007/09/20(木) 21:54:40
>>879
そんな構文はない。
data ABC = A | B | C
とか
data Blood = A | B | O | AB
となら書けるけど。
この場合、AとかABとかは文字でも文字列でもない新しい値。
881デフォルトの名無しさん:2007/09/20(木) 22:42:51
http://web.yl.is.s.u-tokyo.ac.jp/~ganat/memo/aboutHaskell.html
にある
qsort [] = []
qsort (x:xs) = qsort elts_lt_x ++ [x] ++ qsort elts_greq_x
  where
    elts_lt_x = [y | y <- xs, y < x]
    elts_greq_x = [y | y <- xs, y >= x]
というクイックソートですが、これのメモリ消費量は、リストの長さをnとしたとき、O(n^2)になるような気がするのですが、どうでしょうか。
またCやJavaで配列を使うと、配列そのものを書き換えることで、メモリ消費量は増えませんが、Haskellでも同じようなことができますか。
882デフォルトの名無しさん:2007/09/20(木) 22:51:38
>>879
ありがとうございます。
いわゆる列挙型を定義しようとしていたのですが、列挙型の値に文字、文字列、数値は指定できないということでしょうか。

あと、
data Rank = A | B | C
data Blood = A | B | O | AB
としたいのですが
Multiple declarations for data constructor "A"
といわれます。列挙型の値の名前空間というかスコープは、グローバルということでしょうか。
883デフォルトの名無しさん:2007/09/20(木) 23:06:56
>>881
O(n)だと思う。参照されなくなったリストはGCによって回収されるので。
Haskellのリストは書き換えられない。破壊的に更新したいなら専用のデータ構造が要る、例えば
http://www.haskell.org/ghc/docs/latest/html/libraries/base/Data-Array-IO.html

>>882
列挙型の値を指定するというのが良く分からん。列挙値はそれ自体で値じゃないか?
Cのenum { a = 3};みたいな指定がしたいということなら、それは不可能。
必要なら整数と相互変換する関数を書けば良い。

>列挙型の値の名前空間というかスコープは、グローバルということでしょうか。
そう。正確にはモジュールレベル。
884デフォルトの名無しさん:2007/09/21(金) 09:51:28
>>883
O(n)にはならないように思うのですが。
整列が完了したら、参照されなくなったリストはGCされますが、整列中の間は参照されているわけですからGCされませんよね?
再帰呼び出しごとに新しいリストが作られ、それらは呼び出しから戻らないとGCされませんが、呼び出しから戻る前に別の再帰呼び出しが発生するわけだから、やはりメモリ消費量はO(n)ではないと思います。
また再帰呼び出しの深さは最大n-1になるので、やはりO(n^2)ではないでしょうか。実際には、呼び出しの深さは平均でlog(n)でしょうから、 O(n*log(n))が正解かもしれませんが。
詳しい人、お願いします。
885デフォルトの名無しさん:2007/09/21(金) 12:10:42
>>884
確かにそうだ。最悪O(n^2)になるな。
でも、中間リストを作ることが直接の原因ではない。
実際、正確評価ならelts_lt_xとelts_greq_xを作り終えた時点で引数のxsはGCできる。
遅延評価だとこれが上手くいかなくて、逆順にソートされたリストが渡される最悪のケースでO(n^2)になる。
時間的には同じ最悪のケースでも、入力が正順にソートされていた場合はO(n)なんだが。

汚い方法だけど、seqを使って評価順を入れ替えることでO(n)になる。
qsort [] = []
qsort (x:xs) = length elts_lt_x `seq` length elts_greq_x `seq`
  qsort elts_lt_x ++ [x] ++ qsort elts_greq_x
  where
    elts_lt_x = [y | y <- xs, y < x]
    elts_greq_x = [y | y <- xs, y >= x]
886デフォルトの名無しさん:2007/09/21(金) 12:47:02
プロファイル取って調べてみた。数字はtotal allocにqsortの%allocをかけたもの。左の数字は要素数。

>>881とランダム要素のリスト
800 : 380003.544
1600: 873076.32
2400: 1296538.048
3200: 1816425.728
4000: 2399276.16

>>885とランダム要素のリスト
800 : 400965.324
1600: 1040519.448
2400: 1389810.24
3200: 1846377.12
4000: 2776879.088

>>881と整列リスト([1..n])
800 : 8985561.144
1600: 35887143.13
2400: 80695069.14
3200: 143405095.9
4000: 224106868.3

>>885と整列リスト([1..n])
800 : 8995036.344
1600: 35906208.73
2400: 80723725.14
3200: 143443342.3
4000: 224154724.3

最悪ケースだとO(n^2)になるっぽい
887886:2007/09/21(金) 13:00:44
ちなみにコードはこんな感じ
import System.Random

main = print . qsort =<< lst 800

lst n = fmap (take n . randomRs (1, 1000000)) newStdGen

lst2 n = return [1 .. n]

qsort [] = []
qsort (x:xs) = qsort elts_lt_x ++ [x] ++ qsort elts_greq_x
  where
    elts_lt_x = [y | y <- xs, y < x]
    elts_greq_x = [y | y <- xs, y >= x]

qsort2 [] = []
qsort2 (x:xs) = length elts_lt_x `seq` length elts_greq_x `seq`
qsort2 elts_lt_x ++ [x] ++ qsort2 elts_greq_x
where
elts_lt_x = [y | y <- xs, y < x]
elts_greq_x = [y | y <- xs, y >= x]

main関数のqsortとlstと800の部分を変化させながら計測していった。
888デフォルトの名無しさん:2007/09/21(金) 13:12:52
>>886
total allocは確保したメモリの総量だから、空間効率を計るのには使えない。
+RTS -sstderrをつけてmaximum residencyを見ればO(n)になってるのが分かると思う。
889デフォルトの名無しさん:2007/09/21(金) 13:13:52
O(n)で可能であると思われます。
ttp://kukuli.jp/haskell/qsort.zip
890デフォルトの名無しさん:2007/09/21(金) 13:18:28
>>888
>total allocは確保したメモリの総量だから
補足。確保->回収->確保で多重に計上されるってことね。
maximum residencyは瞬間的な使用中のデータ量の最大値(を実測で近似したもの)。
891886:2007/09/21(金) 14:04:46
>>888
>>890
なるほど。
HaskellのGCって、いらなくなった瞬間に動くものだったんだな。
もっとメモリが足りなくなってから動くものだと思ってた。
(そういう扱いをする部分(世代?)もあると思うけど)

というかそれ以前に、885で
>逆順にソートされたリストが渡される最悪のケースでO(n^2)になる。
って書いてあるのになにも分かってなかった。

あと885は
qsort [] = []
qsort (x:xs) =
let !elts_lt_x = [y | y <- xs, y < x] in
let !elts_greq_x = [y | y <- xs, y >= x] in
qsort elts_lt_x ++ [x] ++ qsort elts_greq_x
と書くといいかなと思ったり。
892デフォルトの名無しさん:2007/09/21(金) 18:05:39
>>891
>HaskellのGCって、いらなくなった瞬間に動くものだったんだな。
デフォルトだと確保エリアの大きさは256kらしいから、第0世代のGCは頻繁に起こるんだろう。

>と書くといいかなと思ったり。
それだとリストの先頭しかeagerに評価されないから、
[99, 100, 97, 98, 95, 96, ..., 4, 1]
みたいなリストが入力だとO(n^2)になる。
リストを最後まで評価させるために>>885ではlengthを使ってる。
893デフォルトの名無しさん:2007/09/21(金) 18:33:36
先生! はすける君がごみ拾いばかりして、ちっとも仕事してません!


実行時間の3割がGCとか、普通ですよね
894デフォルトの名無しさん:2007/09/21(金) 18:41:45
ちょっとしたループを書くにもconsを大量に使い捨てるスタイルが一般的だからな。
まあ、メモリ確保は馬鹿みたいに速いんだから許してやろうぜ。
895デフォルトの名無しさん:2007/09/21(金) 20:23:16
>>885
このコードが理解できない初心者のために、教えてください。
seqは遅延評価をしないための関数のようですが、lengthは何のためにあるのでしょうか。
あとseqは2項演算子として使うのが普通なのですか。
qsort [] = []
qsort (x:xs) = seq (length elts_lt_x) (seq (length elts_greq_x) (qsort elts_lt_x ++ [x] ++ qsort elts_greq_x))
 where
  elts_lt_x = [y | y <- xs, y < x]
  elts_greq_x = [y | y <- xs, y >= x]
と買いても間違いではない?

>>886
>数字はtotal allocにqsortの%allocをかけたもの
total alloc と %alloc が何か分からないので、それらをかけて何が求まるのか分かりません。
total alloc は全体のメモリ消費量で単位はバイトでしょうか。
896デフォルトの名無しさん:2007/09/21(金) 20:50:31
>>889
見てみました。わざわざありがとう。
で、この絵では再帰呼び出しのときには古いリストがGCされているようだけど、これはHaskellの言語仕様として決まってるんでしょうか。

つまり、
(a)引数で渡されたリスト
(b)etls_lt_x と elts_greq_x
(c)qsort elts_lt_x ++ [x] ++ qsort elts_greq_x でできるリスト
があって、他の言語だとリストへの参照がある限りGC対象とはならないので、(a)より(b)のほうが先に(または同時に)GC対象となります。そのため、>>884で書いたようにO(n^2) になります。
しかし>>889の説明では、(b)より(a)のほうが先にGCされています。
これだと確かにO(n)になりますが、このように動作するためには、再帰呼び出しをするまえに(a)がGC対象とならないといけないわけですが、本当にこのように動作するのでしょうか。
またそれは言語仕様で保証されているのでしょうか。

Haskellをよくわかってないので勘違いしてるかもしれませんが、お願いします。

897デフォルトの名無しさん:2007/09/21(金) 21:07:44
>>895
それで合ってる。seqを中置で使うのは良く見かける気がする。

seqを使っているのは再帰に入る前にelts_lt_xとelts_greq_xを完全に評価するため。
未評価のelts_greq_xのサンクはxsを参照しているけど、
完全に評価してしまえばただのリストなので、xsへの参照がなくなって、
GCがxsを回収できるようになる。

seq A Bの値はBと同じだけど、この式を評価する時はまずAを評価して、
その結果を捨て、改めてBを評価する。
length elts_lt_x `seq` 本体
を評価するときは、まずelts_lt_xの長さを求めることになるが、
リストの長さを求めるにはリスト全体を評価する必要がある。
結局、本体が評価される前にelts_lt_xが完全に評価される。

lengthが必要な理由には、seqの仕様が関わってくる。
seq A Bが評価されるとき、Aは弱冠頭正規形(weak head normal form, WHNF)まで簡約される。
WHNFというのは、最も外側のデータ構築子が確定した形。
例えば1+2や[1,2]++[3,4]はWHNFじゃないけど、3や1:([2]++[3,4])はWHNF。
だから、lengthを使わずに
elts_lt_x `seq` 本体
のように定義すると、例えば
elts_lt_x = [y | y <- [1, 2, 3, 4], y < 5]
のとき、これを
elts_lt_x = 1 : [y | y <- [2, 3, 4], y < 5]
と簡約したら、この段階でWHNFに達したことになり、評価が終わってしまう。
これだと、xs(ここでは[2, 3, 4])への参照が残っていて、GCがxsを回収できない。
898デフォルトの名無しさん:2007/09/21(金) 21:37:36
ところで、空間計算量を議論する時に、GCを考慮するのは普通なん?
899デフォルトの名無しさん:2007/09/21(金) 21:49:14
>>898
GCがある環境なら考慮していいと思う。じゃないと、机上の空論となるから。
GCがなければO(n^2)になるのが、逐次GCがかかることでO(n)になるなら、そっちを議論しないとあんまり意味なくね?
900デフォルトの名無しさん:2007/09/21(金) 21:49:56
もちろん前提条件として明示する必要はあるよ?
901デフォルトの名無しさん:2007/09/21(金) 22:02:09
>>897
力作ありがとうございます。
seqは完全に遅延評価を回避できるわけではないんですね。なんというか、オブジェクト指向言語でよく出てくるshallow copyとdeep copyの違いみたいな感じでしょうか(つまりseqはshallow copyに似ている)。
しかし完全に評価するためにlengthを使うのって、bad know howですよね。
このためにlengthを使うのは、lengthの本来の用途ではないのだから、完全に評価するための専用の関数が標準で用意されるべきたと思いました。たとえその実体がlengthであったとしても。
902デフォルトの名無しさん:2007/09/21(金) 22:16:34
Control.Parallel.Strategies.force :: (NFData a) => a -> a
を使うのかな。
これはこれで目的外使用な気もするが。
903デフォルトの名無しさん:2007/09/21(金) 23:04:59
>>899
処理系がタコなせいで遅いのなら、そっちを直すべきじゃね?
904886:2007/09/21(金) 23:41:03
>>895
-prof付きでコンパイルしてから+RTS -p付きで実行するとプロファイルがとれて、
Fri Sep 21 23:19 2007 Time and Allocation Profiling Report (Final)

main.exe +RTS -p -RTS

total time = 0.05 secs (1 ticks @ 50 ms)
total alloc = 9,079,028 bytes (excludes profiling overheads)

COST CENTRE MODULE %time %alloc

main Main 100.0 0.3
qsort Main 0.0 99.1
というようなログが出力される。
total allocとか%allocはこれのこと。
total allocはアロケートされたメモリの累計で、%allocは各関数ごとの割合。

とまあそういうことなんだけど、ここでの議論は、GCでメモリが再利用されて
O(n)になるという話なので、無意味と言うか、的外れと言うか、
>>886-887は無かったことにしてください。
メモリ使用量を正しく知る方法は>>888
905デフォルトの名無しさん:2007/09/24(月) 10:50:26
> qsort Main 0.0 99.1

消費時間0%…遅延評価のマジックですなあ
906デフォルトの名無しさん:2007/09/24(月) 11:13:33
>>905
いや、プロファイラの精度の問題だろw

>total time = 0.05 secs (1 ticks @ 50 ms)
一個しか標本を取ってないんだから、片方が100%になるのは必然。
907デフォルトの名無しさん:2007/10/01(月) 22:33:18
concatの反対で "AAA BBB CCC" を ["AAA", "BBB", "CCC"] にするにはどうしたらいいの?
parsecというものをimportしてParserを作らないといけないのでしょうか?
908デフォルトの名無しさん:2007/10/01(月) 22:41:57
wordsのことかな。
909907:2007/10/02(火) 16:59:39
ありがとう。それだ。
ふつうのHaskellプログラミングに乗ってないんだ
910デフォルトの名無しさん:2007/10/02(火) 17:11:53
それらしい所を漁るといろいろ出てくるね
ghc/libraries/base/Data/ByteString/Char8
911デフォルトの名無しさん:2007/10/02(火) 20:21:40
>>909
ざんねん載っているぞ
912デフォルトの名無しさん:2007/10/02(火) 21:07:05
>>909
Hoogleで欲しい関数の型を検索してみると割とヒットするよ。
今回はString->[String]。
913デフォルトの名無しさん:2007/10/07(日) 00:59:40
Monads 1
http://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
914デフォルトの名無しさん:2007/10/07(日) 17:09:38
>>913
こんなマニアックなものがあるのか・・・
915デフォルトの名無しさん:2007/10/07(日) 17:59:08
eclipseで書いてるんだけどもHaskellパースペクティブが使いにくくてしょうがないYO
モジュール名を’M’から始めないとinvalid_nameとかいわれるのはなぜなんだぜ?
916デフォルトの名無しさん:2007/10/10(水) 09:37:48
>>915
Haskellプラグインをどこが作ってるのかは知らないが、
オープンソースなんだろうし、開発を手伝ってきたら?
917907:2007/10/15(月) 22:15:18
できたー
ありがとう
918デフォルトの名無しさん:2007/10/17(水) 06:53:13
919デフォルトの名無しさん:2007/10/20(土) 02:31:07
920デフォルトの名無しさん:2007/10/20(土) 13:24:39
HaskellでRubyやLispのrestパラメータのように
複数の引数をまとめてリストにしたい場合はどうするのでしょうか?
921デフォルトの名無しさん:2007/10/20(土) 13:53:09
可変個の引数をとる関数は定義できない。
型クラスを使って真似する方法はあるけど。
922デフォルトの名無しさん:2007/10/20(土) 20:58:00
>>921
> 定義できない
> 方法はある

どっちなんだ
923デフォルトの名無しさん:2007/10/20(土) 21:06:12
>>922
できない。似たようなことをする方法はある。
924デフォルトの名無しさん:2007/10/20(土) 21:24:31
やりたいことにもよるんだけど、直接リストにして受け渡すようにすれば良いんじゃない?
hoge :: 任意個のa -> b ではなくて hoge :: [a] -> b
引数の型が違う時は
data Param = PInt Int | PString String
hoge :: [Param] -> b
みたいな感じ。
925デフォルトの名無しさん:2007/10/21(日) 22:36:34
今Programming in Haskellを読んでいます。
List comprehensionという語の日本語訳が難しいのですが
普通はどう訳されているのでしょうか?
926デフォルトの名無しさん:2007/10/21(日) 22:40:02
>>925
リスト内包表現

っていうかぐぐれよ
927デフォルトの名無しさん:2007/10/21(日) 22:40:33
>>925
リストの内包表記
928デフォルトの名無しさん:2007/10/21(日) 23:26:09
GHCタッグリーグ戦にあのチームが緊急参戦?
929デフォルトの名無しさん:2007/10/21(日) 23:54:26
包茎珍宝のリスト
930デフォルトの名無しさん:2007/10/22(月) 22:53:32

なぁなぁ
まえにPDFうpしてくれた人の作品じゃないか?
背景がまったく同じだ

http://www.nicovideo.jp/watch/sm1324200
 
931デフォルトの名無しさん:2007/10/22(月) 22:58:15
同じプレゼンソフトを使ってるだけじゃないか?
932デフォルトの名無しさん:2007/10/23(火) 00:59:43
xmonadがニュースになってるw
http://japan.zdnet.com/oss/story/0,3800075264,20359294,00.htm
933デフォルトの名無しさん:2007/10/23(火) 20:35:09
>>922
Text.Printfを見てみるといい。(単に可変個の引数の話だけど)
934デフォルトの名無しさん:2007/10/23(火) 22:05:14
どこで見れる?
935デフォルトの名無しさん:2007/10/23(火) 22:23:26
936デフォルトの名無しさん:2007/10/23(火) 22:47:15
昨日ふつける読み始めた俺に誰か教えてくれ
Cと連携したりできんの?
CからHaskellの関数呼んだりHaskellからCの関数呼んだり
937デフォルトの名無しさん:2007/10/23(火) 22:49:55
>>934
ソースのことだと思われ
938デフォルトの名無しさん:2007/10/23(火) 23:03:34
>>936
できるよ。
939デフォルトの名無しさん:2007/10/23(火) 23:04:54
>>938
どーやって?
CとHaskellって型とかだいぶ違う気がするけどそこらへんどーすんの?
940デフォルトの名無しさん:2007/10/23(火) 23:15:16
>>939
haskell ffiでググレ
941デフォルトの名無しさん:2007/10/23(火) 23:17:30
>>940
あまりの優しさにチンコ取れた
ありがとー読んでくる
942デフォルトの名無しさん:2007/10/24(水) 20:47:28
http://www.mitsuki.no-ip.com/~seagull/software-archives/hs-clearsilver/

Clearsilverのバインディングなんてあったんだな
943デフォルトの名無しさん:2007/10/26(金) 19:43:35
誰かHaskellの文法一覧みたいな便利なものがあるサイト知らない?
944デフォルトの名無しさん:2007/10/26(金) 19:56:21
945デフォルトの名無しさん:2007/10/26(金) 21:09:02
>>944
思慮が足りないな。
仮にもhaskellに興味を持つような人間がそのサイトを知らないわけないだろ。
>>943が言いたいのはそのサイトが不便だってことなんだろうよ。
946デフォルトの名無しさん:2007/10/26(金) 21:26:01
>>944
流石にそれは見たことあるわ

>>945
そうそう
もっと適当にまとまってるとこねぇかな
ふつける読み返したり>>944見たりするのはめんどくさい…
947デフォルトの名無しさん:2007/10/26(金) 22:19:25
>>946
言い出しっぺの法則。というわけで、wikiでも建てて作ってくれ。
948デフォルトの名無しさん:2007/10/26(金) 22:31:51
949デフォルトの名無しさん:2007/10/26(金) 23:28:10
case x of { "a" -> 1; "b" -> 2}

はうまくいくのに

str1 = "a"
str2 = "b"
case x of { str1 -> 1; str2 -> 2}

は、str1,str2がwildcardとみなされ、意図通りに動きません。
caseのpatternに変数を使う方法はないでしょうか?

ちなみに意図しているのは、以下と等価な動作です。

if x == str1 then 1 else if x == str2 then 2 else error ""
950デフォルトの名無しさん:2007/10/27(土) 02:37:03
CやJavaのswitch文でcaseに変数使えたっけ?
951デフォルトの名無しさん: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}
952デフォルトの名無しさん:2007/10/27(土) 08:43:40
なんで調べもせずに言い出しっぺとか言ってるんだよ
Tour of the Haskell Syntax
ttp://cs.anu.edu.au/Student/comp1100/haskell/tourofsyntax.html
953デフォルトの名無しさん:2007/10/27(土) 08:57:52
>>951
[| "a" |]の型はQ ExpであってQ Patじゃない。
そもそもパターンにspliceを書くことはできないはず。
954デフォルトの名無しさん:2007/10/28(日) 02:29:01
>>949 の意図と違うとは思うけど

table = [(str1,1),(str2,2)]
fromMaybe (errror "") $ lookup x table
955デフォルトの名無しさん:2007/10/28(日) 12:22:05
関数型初体験してみたが、
ふたつの引数 m n をとって
m * (m+1) * .... * (n-1) * n を返す関数を
再帰的定義を用いて書け

なんて問題を解くのに30分もかかった…
普段とぜんぜん違う思考法を要求されて面白いねこれ
956デフォルトの名無しさん:2007/10/28(日) 12:23:17
>>955
Haskellやると頭がよくなった気がする。あくまで気がするだけだけど・・・。
957デフォルトの名無しさん:2007/10/28(日) 13:41:46
とりあえず、ふつうのHaskellは読んで文法とか何となく理解したのですが、
次のステップってどんなのがいいんでしょうか。

自分はWebアプリを実装してみようとか思ったんですけど、基本部品(Http
リクエスト解析とか、DB処理など)使ったものやるよりも、「Write Yourself a
Scheme in 48 Hours」みたいなのを勉強する方がよいのかな?と思ってます。

おすすめのHaskell学習資料なんかがあったら教えてください。
958デフォルトの名無しさん:2007/10/28(日) 14:05:07
>>957
まだHaskellであまりコードを書いてないなら、とにかくたくさん書いて慣れるのが重要だろう。
インタプリタ書くのは良い訓練だけど、やりたいことがあるならそっちをやった方が
モチベーションが上がりやすくて良いと思う。
959デフォルトの名無しさん:2007/10/28(日) 14:05:15
>>957
散々過去に同じ質問が出ているわけだが。

論文読め。
960デフォルトの名無しさん:2007/10/28(日) 14:28:02
>>957
2に書いてある入門Haskellがおすすめ。
あとは、下記のやさしいHaskell入門かな。

http://www.sampou.org/haskell/tutorial-j/

そろそろもう一段階上の本を出してほしいなぁ > 著者さん達
961デフォルトの名無しさん:2007/10/28(日) 14:41:02
皆さん、ありがとうございます。

自分の経験から、あまり文法一覧を基本にした学習ではなくて、実際の
アプリ実装ベースでの学習をしたいと思ってます。目標はWebアプリの
雛形作ることなんですけど、既存コードの寄せ集めになってしまいそう
なので、Haskellのくせというか、定石みたいなの知った上でやりたいなと。

Write Yourself a Scheme in 48 Hoursみたいなのがいいんですけど、
似たようなの他にもあるかなぁと思って質問しました。
962デフォルトの名無しさん:2007/10/28(日) 14:45:46
haskellはやめておけ。
プログラミング手法が確立されていないから、
研究目的以外でやるなら別の言語を使え。
963デフォルトの名無しさん: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
が参考になるかも
964デフォルトの名無しさん:2007/10/28(日) 20:00:05
のぶすんすんすん
965デフォルトの名無しさん:2007/10/28(日) 20:00:51
のぶすんのおなにーさいと
966デフォルトの名無しさん:2007/10/28(日) 20:22:00
>>963
nobsun乙wwwww
967デフォルトの名無しさん:2007/10/28(日) 20:34:31
>>966
>>963はただのNAIST生ですよ
968デフォルトの名無しさん:2007/10/28(日) 20:37:08
>>955
お前頭いいな。
(m+1) * .... * (n-1)
俺には、この省略されたところで何があったのか見当もつかん。
m+1<n ってことか?
969デフォルトの名無しさん:2007/10/28(日) 20:44:44
>>968
俺が察するに、m<nとして m, m+1, m+2, m+3, .. , n-3, n-2, n-1, n の乗積を求めたいんだろう。
970デフォルトの名無しさん:2007/10/28(日) 21:16:07
>>967
意味分からん
971デフォルトの名無しさん:2007/10/28(日) 22:08:01
>>955
その例は、手続き型でも大差ないだろう。

int f(int m, int n)
{
 return m <= n? m * f(m+1,n) : 1;
}
972デフォルトの名無しさん:2007/10/28(日) 22:10:55
>>971
手続き型ならforでまわせよ、この豚
973デフォルトの名無しさん:2007/10/28(日) 22:12:04
求めるのが「mからnまでの積」ではなく「mからnまでのlist」だと、
CやFortranでは一気に面倒になるね。
974デフォルトの名無しさん:2007/10/28(日) 22:37:35
非再帰の方が楽だな。
f m n = foldl (*) 1 [m..n]
975デフォルトの名無しさん:2007/10/28(日) 23:34:32
そのfoldlはhaskellでどう定義するのかね。
ああ、foldlはCで書かれてるなんて言わないでね。
976デフォルトの名無しさん:2007/10/28(日) 23:39:37
>>975
ghc落として見るが良い
977デフォルトの名無しさん:2007/10/28(日) 23:47:15

fl :: (a -> b -> a) -> a -> [b] -> a
fl _ x [] = x
fl fn init (el:la) = fl fn (fn init el) la
978デフォルトの名無しさん:2007/10/28(日) 23:48:19
>>975
wwww
アホがいる
979デフォルトの名無しさん:2007/10/28(日) 23:49:22
foldlはライブラリにあるんだから実装はどうでもいいだろ
手で再帰を書かなくて済むことが重要
980デフォルトの名無しさん:2007/10/28(日) 23:50:54
foldrをゴリ押ししてみた
fr :: (a -> b -> b) -> b -> [a] -> b
fr _ x [] = x
fr fn init (el:la) = fr fn (fn el init) la
981デフォルトの名無しさん:2007/10/29(月) 00:01:07
今darcs中
darcs遅せぇ
982デフォルトの名無しさん:2007/10/29(月) 00:02:06
>>980
それはfoldrじゃなくてfoldl . flipじゃないか
983デフォルトの名無しさん:2007/10/29(月) 01:02:57
>>979
ところが実装を気にするんだよな〜
なにしろ、再帰かどうかが大問題なんだから。
984デフォルトの名無しさん:2007/10/29(月) 01:13:13
じゃ自分で作ってみてベンチ両方取ってくらべりゃいいじゃねぇか
985979:2007/10/29(月) 01:19:29
>>983
大問題って、foldl再帰で実装されているかどうかを初めに問題にしたのは>>975だろ?
foldlが再帰的に定義されていたとしても>>974のfの定義自体は非再帰的なわけで、
>>974はそれをもって「非再帰の方が楽」という言い方をしたんだと俺は理解したんだが
986デフォルトの名無しさん:2007/10/29(月) 01:49:30
すみません、私が間違ってました
987デフォルトの名無しさん:2007/10/29(月) 02:13:05
いや、俺も間違ってたよ
988デフォルトの名無しさん:2007/10/29(月) 20:37:43
そろそろじすれのきせつ!
989デフォルトの名無しさん:2007/10/29(月) 21:02:25
なんで
main = do cs <- getContents
    putStrLn cs
はOKなのに
main = do cs <- getContents
<TAB><TAB>putStrLn cs
はダメなの?
990デフォルトの名無しさん:2007/10/29(月) 21:21:37
>>989
上もダメじゃないか?
csが(0から数えて)10桁目から始まるから、
二行目のputStrLnも10桁目にないといけない
タブ幅は8と決まってるから、タブ二つでインデントするとputStrLnが16桁目から始まることになる
991デフォルトの名無しさん:2007/10/29(月) 21:23:15
そんなゆーづーがきかないのか…
992デフォルトの名無しさん:2007/10/29(月) 21:33:54
doの後で必ず改行するようにすれば悩まなくて済むよ
993デフォルトの名無しさん:2007/10/29(月) 22:10:17
>>989
main = do { cs <- getContents;
<TAB><TAB>putStrLn cs}
にすればいいじゃない
994デフォルトの名無しさん:2007/10/29(月) 22:15:49
>>992
愛してる

>>993
何が悲しくて{}なんぞ使わにゃならんのよ…
995デフォルトの名無しさん:2007/10/30(火) 02:15:02
悲しみを { } で包むためさ
996デフォルトの名無しさん:2007/10/30(火) 07:32:03
>>995
だれがうまい(ry
997デフォルトの名無しさん:2007/10/30(火) 14:56:36
>>990
ふつけるにも書いてなかったんだが、それずっと疑問だった。
Haskellってタブはスペース8個に決め打ちしてるのか?

そもそも等幅フォントじゃなかったらどうすんだとか、エディタ
選ぶ言語なの?
998デフォルトの名無しさん:2007/10/30(火) 15:03:50
>>997
等幅フォントでないと正しく見えない。
pythonのレイアウトも同じ。
999デフォルトの名無しさん:2007/10/30(火) 15:08:47
 
1000デフォルトの名無しさん:2007/10/30(火) 16:13:06
>>997
決め打ちしてる。
>そもそも等幅フォントじゃなかったらどうすんだ
例えば
・do、where、let、ofの後に必ず改行を入れる
・タブを使わない
の二点を守ればどんなフォントでも大丈夫。
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。