トップページtech
981コメント300KB

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

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2008/05/17(土) 16:41:29
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/
Part7 http://pc11.2ch.net/test/read.cgi/tech/1174211797/
Part8 http://pc11.2ch.net/test/read.cgi/tech/1193743693/
・2chの仕様により、行頭の半角スペースは表示されません。
 コードをインデントしたいときは、代わりに または全角スペースを使うことができます。
0685デフォルトの名無しさん2008/09/04(木) 12:00:02
このスレって〜

ってレス多いよな。
0686デフォルトの名無しさん2008/09/04(木) 15:00:58
そういえば、大学入試のときに大学ランクとタバコの関係に気づかされたなぁ・・・
東大 誰も吸っていない
京大 誰も吸っていない
同志社大 ちらほら
関西大 校舎内で吸っているやつがいる(!!!)

ありえないです、低ランク大・・・
やっぱりランクの低い大学出身のやつは信用できない・・・
0687デフォルトの名無しさん2008/09/04(木) 15:19:00
そして増える意味不明なレス
0688デフォルトの名無しさん2008/09/04(木) 15:20:04
>>684
素人なのでどの変がうそなのか教えてください
0689デフォルトの名無しさん2008/09/04(木) 15:45:52
686みたいな奴がhaskellを使うとはとても思えんのだが、
何しに来てるのかね?
0690デフォルトの名無しさん2008/09/04(木) 15:50:35
>>689
Haskellがどういうものだと思っているんですか?
0691デフォルトの名無しさん2008/09/04(木) 17:36:25
>>686は今マルチされてるコピペ、スルー推奨です。
0692デフォルトの名無しさん2008/09/04(木) 19:33:03
>>690
全角数字を見るといらっとくる人が使う言語
0693デフォルトの名無しさん2008/09/04(木) 19:35:16
確かにイラっときた
0694デフォルトの名無しさん2008/09/04(木) 21:21:38
>>693
それはカルシウム不足
0695デフォルトの名無しさん2008/09/06(土) 23:15:53
Haskellで良いコード綺麗なコードというのはどんなコードですかね。

出来るだけ変数使わない方がいいとか、何が何でもポイントフリーにするとか、
あるいはそれ以外でも、何でも。
0696デフォルトの名無しさん2008/09/06(土) 23:55:28
>>695
y f = f (y f)
0697デフォルトの名無しさん2008/09/07(日) 00:05:33
>>695
haskellでは数学的にきれいなコードが「きれいなコード」と呼ばれます。
0698デフォルトの名無しさん2008/09/07(日) 00:12:32
良いコード:
意味のあるところでControl.*を使う
悪いコード:
ポイントフリーのためにControl.ApplicativeやControl.Arrowをimport
0699デフォルトの名無しさん2008/09/07(日) 00:15:18
っていうか、ポイントフリーってなにがいいの?せっかくパターンマッチがあるのに。

>>687
ライブラリはそうだろうけど、普通のアプリを書くときは?
0700デフォルトの名無しさん2008/09/07(日) 00:33:20
単純な場合には無駄に変数が増えず、シンプルに分かりやすくなるから良い。
複雑な場合には無理をしても分かりにくくなるだけだから悪い。
パターンマッチとは使いどころが違う。
0701デフォルトの名無しさん2008/09/07(日) 00:34:19
>>699
圧倒的に短く書けるからだよ。
それにポイントフリーだと関数の入出力の流れみたいなのがまっすぐ表せるから、処理の全貌が見通しやすい
0702デフォルトの名無しさん2008/09/07(日) 00:41:52
まっすぐだけど、流れが逆じゃん。
というわけで>>>使うのはやっぱダメ?逆なのに脳味噌合わせるべきなの?
0703デフォルトの名無しさん2008/09/07(日) 00:46:48
GUIアプリを書くときはどういうのが綺麗なんだ?
0704デフォルトの名無しさん2008/09/07(日) 00:59:26
>>702
逆なの? y = f x より x f = y が脳味噌に合ってるの?
0705デフォルトの名無しさん2008/09/07(日) 01:11:04
>>704
なんでやねん。
unlines . take 10 . filter (> 10) . map read . lines
より、
lines >>> map read >>> filter (> 10) >>> take 10 >>> unlines
の方が、少なくとも俺は脳に優しく感じる。

で、こう書くと、map read と filter (> 10) を分けてるのが冗長でダサい気もするが、
(filter (> 10).read)みたいにした方が良いのか、かえってこっちの方がダサいのか、
あるいは、(filter (\x -> 10 > read x)) みたいにラムダにすべきなのか、綺麗の勘所が判らんのです。
0706デフォルトの名無しさん2008/09/07(日) 01:12:53
>>705
あ、前半がStringに戻してないのはご愛敬と言う事で、よろしく。
0707デフォルトの名無しさん2008/09/07(日) 01:32:55
>>705
String に戻さないといけないなら
filter ((10 <) . read) だろう。ラムダでもいいけど。
まあ、その辺はこだわるとこでもないかと。

> なんでやねん。
f (g x) と (f . g) x の向きは関係あるんですよ。
数学でも向き的事情から x^f という記法を使うこともある。
0708デフォルトの名無しさん2008/09/07(日) 02:23:43
>>702
左から右だろうが右から左だろうがどっちでも一緒だろ。
俺には違いが分からん。
0709デフォルトの名無しさん2008/09/07(日) 02:27:05
>>702
こういう反抗したい年頃のやつが言語を汚くしていくんだろうな。
なんでもないものを指差して「使いにくい」などと言ったり、まるでガキ。
0710デフォルトの名無しさん2008/09/07(日) 03:31:39
現代日本では横書き文字は左から右だから、
その方が自然に感じるのは当然と思います。

また、bind演算子が(>>=)で左結合である事を考えても
Haskellを設計した人もその方が自然と感じたのではないでしょうか?

慣れの問題かもしれませんが、
そんなにおかしな意見とは思えません。
0711デフォルトの名無しさん2008/09/07(日) 07:34:52
まあ関数合成の向きが右から左なのは>>707の説明の通りだし、Haskellに限らず数学でも同じルールだからな。数学でも気持ち悪いって云う人は結構居るしまあそんなに変わった意見でもあるまい。
0712デフォルトの名無しさん2008/09/07(日) 21:48:37
社内コーディング規約でここにスペースを入れろとかそういうのよりは高尚が感じがするかもしれないけれど
所詮バイクシェッド
乱用すれば読みにくいし、パズルみたいにポイントフリーするのは間違ってる
数学的に綺麗綺麗とか、圏論的に自然とかというけれど、誰でも圏論がわかるわけじゃないし。

しかし、いかにポイントフリーで書くか、という事を考えると確かにおもろいよ
0713デフォルトの名無しさん2008/09/07(日) 21:56:43
亀だが

>>36
>FPGAとかのHDL記述とかに応用したりしてる人いないの?

Lavaがあるよ。並列性とか関係ないし、回路をそのまま関数で書くだけなんだけど。そしてVerilogより使いやすい、なんてこたーない。HDLよりましだが、副作用を書くのがまわりくどい

http://www.cs.chalmers.se/Cs/Grundutb/Kurser/svh/tools.html

0714デフォルトの名無しさん2008/09/07(日) 22:31:52
s/HDL/VHDL/
0715デフォルトの名無しさん2008/09/08(月) 21:55:12
>>713
ArrowっぽいHDL作りたいな
0716デフォルトの名無しさん2008/09/09(火) 18:48:21
Real World Haskell
November 15, 2008

待ち遠しい。
0717デフォルトの名無しさん2008/09/12(金) 22:50:22
過度の並列化で複雑化するゲーム開発
コスト削減の鍵は純粋関数型言語らしい
http://www.watch.impress.co.jp/game/docs/20080911/epic.htm
071836 ◆K0BqlCB3.k 2008/09/12(金) 22:54:50
>>717
そうだろうね。
俺はずううっと前からそう論文に書いてたけど。
だんだんpi-calculusの人気が出てきたね。
0719デフォルトの名無しさん2008/09/12(金) 23:58:55
> Sweeney氏は純粋関数型言語のもつ並列処理安全性に着目しており、
>将来的にゲームプログラミングはそういった処理系に移行していくべきだとした。
>Sweeney氏はそのひな形として言語“Haskel”を挙げているが、
>ゲーム開発のメインストリームたり得る言語はまだ登場しておらず、将来に期待しているという。

なんでHaskellは駄目なんだろう。
ライブラリ含めた開発環境の問題か処理系の最適化の問題か
それとも言語仕様レベルで本質的に向いていないのか。
0720デフォルトの名無しさん2008/09/13(土) 00:06:19
前者じゃない?
0721デフォルトの名無しさん2008/09/13(土) 00:09:07
こんなことでもないと注目せんのだな
0722デフォルトの名無しさん2008/09/13(土) 00:48:51
遅延評価に漬かりまくりで、ダメなのでは?
遅延評価って言ってみれば、後ろからの逐次でそ?
無限リスト使えないHaskellってHaskell?
0723デフォルトの名無しさん2008/09/13(土) 07:07:42
LazyがいやならSMLやOCAML使えばいいだけ。何が不足よ?
0724デフォルトの名無しさん2008/09/13(土) 08:23:12
>>723
前方参照,where構文
0725デフォルトの名無しさん2008/09/13(土) 09:32:44
>>724
LETで何が不足よ?
0726デフォルトの名無しさん2008/09/13(土) 10:42:16
>>717,>>719からのコンテキストを読んでくれよ。
0727デフォルトの名無しさん2008/09/15(月) 18:14:08
質問です

たとえばJavaなどではクラスのインスタンスをオブジェクトと呼びますが、
Haskellの代数的データ型に格納されたデータのことをなんと呼べば良いですか?
0728デフォルトの名無しさん2008/09/15(月) 18:21:45
>>727
関数
0729デフォルトの名無しさん2008/09/15(月) 19:00:09
>>727
「オブジェクト」に対応する用語は普通は「値」でいいんじゃないか

>Haskellの代数的データ型に格納されたデータ
これどういう意味?
型が代数的データ型であるような値のことならそのまま「代数的データ型の値」
代数的データ型の構築子に渡した値のことなら「フィールドの値」くらいか?

data Point = Pt Int Int

x = Pt 0 3
-- xはPoint型の値
-- xのフィールドの値は0と3
0730デフォルトの名無しさん2008/09/15(月) 20:26:27
Haskellのプログラミングスタイルのことはなんて呼べばいいですか?
ストリーム指向?
0731デフォルトの名無しさん2008/09/15(月) 20:30:20
関数指向
0732デフォルトの名無しさん2008/09/16(火) 23:55:40
Haskell系のShellでオススメってある?
073336 ◆K0BqlCB3.k 2008/09/17(水) 00:00:30
>>732
シェルって何のこと?
言語とは関係ないと思うけど。
シェルスクリプトのことを言っているの?
0734デフォルトの名無しさん2008/09/17(水) 00:07:44
>>733
HSHみたいなやつ

探してみた奴だとどれも開発止まってて…
0735デフォルトの名無しさん2008/09/17(水) 00:09:07
Haskell風構文のシェルっていくつかあるんだな、ググって初めて知ったわ
0736デフォルトの名無しさん2008/09/17(水) 00:15:11
Haskell系の自然言語でオススメってある?
0737デフォルトの名無しさん2008/09/17(水) 00:22:13
lojbanとか?
自然言語じゃないけど
0738デフォルトの名無しさん2008/09/17(水) 15:52:29
Yiとか使ってる人いるの?
0739デフォルトの名無しさん2008/09/17(水) 17:56:30
Yi って 彝 ?
0740デフォルトの名無しさん2008/09/17(水) 18:20:56
ぅぃ?
0741デフォルトの名無しさん2008/09/17(水) 18:31:27
http://haskell.org/haskellwiki/Yi
使ったこと無いなぁ。
0742デフォルトの名無しさん2008/09/19(金) 17:29:49
ひょんなことからerlangを勉強し始めたが、構文はともかく、思想としては面白いな。
並行指向プログラミングというのかな?
このパラダイムはオブジェクト指向よりも現実志向のパラダイムのように思う。
Haskellでも並列化がうまくいけばerlangみたいな仕組みを実装できるかもしれない。

# erlangの構文は糞 糞 糞 糞杉
0743デフォルトの名無しさん2008/09/19(金) 18:18:31
ぅぃゅ
0744デフォルトの名無しさん2008/09/19(金) 20:28:25
コンカレントハスケル?
0745デフォルトの名無しさん2008/09/19(金) 20:34:40
ああ、コンカレントは並行だったか・・・
0746デフォルトの名無しさん2008/09/20(土) 11:00:42
>>743
私はProlog屋なので、erlangの構文のクソ部分に敏感でない。
お手数かけて恐縮だが、糞の部分を列挙していただけると有難いのだが。
0747a36 ◆K0BqlCB3.k 2008/09/20(土) 12:04:07
>>742
たぶん、その思想というのはpi-calculusのことかな。
0748デフォルトの名無しさん2008/09/20(土) 13:08:03
ここのみんなからするとgtk2hsって綺麗なの?
0749デフォルトの名無しさん2008/09/20(土) 13:29:19
Erlangってpi-calculusベースなのか
0750デフォルトの名無しさん2008/09/20(土) 13:56:48
>>746
743ではないけど、
receive...endとか、カリー化できないとかではないですか?
0751デフォルトの名無しさん2008/09/20(土) 14:52:33
>>723
元記事ではSTMが挙げられてるけど、OCamlだと無くね?

>>749
綺麗って何が?Gtk2Hsを使ったコード?
それならあまり綺麗じゃないんじゃない。
GUIを綺麗に書くためのハイレベルなライブラリは
いろいろあるけど、どれも決定打にはなってないような。
0752デフォルトの名無しさん2008/09/20(土) 15:23:34
>>751 >>749 じゃなくて >>748 ?
0753デフォルトの名無しさん2008/09/20(土) 15:27:39
>>752
>>748な俺からでもそれはわかる。
0754デフォルトの名無しさん2008/09/21(日) 00:46:57
gtk2hsと言えば、
gtk_rc_parse_string相当の関数や、
gtk_widget_modify_cursor(これは新しいからか)相当の関数が見付からなくて諦めたことがあります。。
いや私の検索能力が低いだけだと思うんですが、かなり頑張ってもどうしても見つかりませんでした。。。
皆さんgtkやpango、gdkの関数を捜すときってやっぱり根性ですか?
大抵はキャメルケースにすれば大丈夫ですがそうでない時はかなり困りますよねー。。
0755デフォルトの名無しさん2008/09/21(日) 12:17:25
いや、検索能力の問題じゃなくて、実際に無いんじゃない?
Gtk2Hsのソースgrepしてみて無かったら無いような。
0756デフォルトの名無しさん2008/09/22(月) 08:20:06
webで読んでるけどreal world haskell凄いヴォリュームだな
一週間やってもまだ終わらん
製本版はもう鈍器レベルだな
0757デフォルトの名無しさん2008/09/22(月) 09:55:41
なにか面白いこと書いてあった?
0758a36 ◆K0BqlCB3.k 2008/09/22(月) 15:02:13
これでしょ
http://book.realworldhaskell.org/read/
0759デフォルトの名無しさん2008/09/22(月) 16:29:27
url知らないって意味じゃなくて、自分では読む気が無いってことだよ。
0760a36 ◆K0BqlCB3.k 2008/09/22(月) 16:37:06
ぱっと見た感じでは、名前の通り実際にHaskellで開発する時に「背中に手が届く」本になってる感じ。
たとえばデータベースと通信する方法とか、
GUIを作るときのライブラリとかツールとかの紹介とか、
どちらかというと「Haskell逆引きクイックリファレンス」
みたいな感じだね。
目新しいことは何もないけど、逆引きリファレンスとしてはいろんなライブラリとか紹介されていて便利かな。
0761a36 ◆K0BqlCB3.k 2008/09/22(月) 16:39:11
いろいろサンプルコードも載ってるからわかりやすい。
文章の良よりコードの両方の方が多いから英語が苦手な人でもわかると思う。
0762a36 ◆K0BqlCB3.k 2008/09/22(月) 16:39:49
良 → 量
コードの両方 → コードの量
0763デフォルトの名無しさん2008/09/24(水) 11:57:39
Parsec.Tokenをロードすると
ERROR file:{Hugs}\packages\parsec\Text\ParserCombinators\Parsec\Token.hs:64 - Syntax error in data type declaration (unexpected `.')
とでて読み込めないのですがどうしたらいいのでしょうか
0764デフォルトの名無しさん2008/09/24(水) 12:09:05
>>763
Hugsを標準モードじゃなくて拡張モードで起動すればいい
hugs -98
0765デフォルトの名無しさん2008/09/24(水) 12:51:18
>>764
無事読み込めました。ありがとうございます
0766デフォルトの名無しさん2008/09/24(水) 15:23:46
do構文で、変数の使用が強制されるのはなんとかならんの?
.とか$とかの気の利いたバージョンない?
0767デフォルトの名無しさん2008/09/24(水) 15:27:56
何を言ってるのかよく分からんが >>= とか?
0768デフォルトの名無しさん2008/09/24(水) 15:36:59
>>=だけですっきりいけるならdo構文使わないでしょ(ってこともないか?少なくとも俺は)。
do構文でモナドを「外す」ためだけに一時変数がやたら必要になるのがイヤって話。
つまるところ>>=になっちまいそうな気もするけど、
便利な演算子なり特殊なカッコなりで、無駄な変数使わずに何とかならんかなぁ、と。
0769デフォルトの名無しさん2008/09/24(水) 16:11:24
なにか具体例見せてくれ
0770デフォルトの名無しさん2008/09/24(水) 16:18:02
do式の中で、
  a <- v
  b <- f a
は、aを使わずに
  b <- v >>= f
と書ける

同様に、
  a <- v
  let b = f a
は、
  b <- liftM f v
と書ける

こういう話?
>>=は普通にdo構文の内部で使えるよ
俺はこの場合=<<を使う方が好きだけど
0771デフォルトの名無しさん2008/09/24(水) 16:26:30
何を言ってるのか俺もよく分からん。
do ...; a <- m; f a; ...

do ...; f =<< m; ... -- m >>= f でも同じだけど...
とか
do ...; a <- m; let b = f a; ...; g b; ...; h b; ...

do ...; b <- liftM f m; ...; g b; ...; h b; ...
とかすればいいって話じゃなくて?

って書き込もうとしたんだけどその前に新着レス見たら>>770被りすぎ。
0772デフォルトの名無しさん2008/09/24(水) 16:44:57
n <- m
a <- n

a <- join m
にするパターンもあるかも。

n <- m
o <- n
a <- o

a <- join (join m)
とか。
0773デフォルトの名無しさん2008/09/24(水) 16:48:50
ぱっといい例は書けないけど、例えば単純な例で
do args <- getArgs
cnt <- getContents
now <- getClockTime
return someFunc args cnt now
を、
do return soumeFunc #getArgs #getContents #getClockTime
とかこんな感じに書けないかと。(#が架空のモナド外し演算子とか)
0774デフォルトの名無しさん2008/09/24(水) 16:53:15
>>770,771,772
ありがとう。特にjoinは使った事なかった。
俺がアホでした。
0775デフォルトの名無しさん2008/09/24(水) 16:56:54
あれ?やっぱ違うや。求めてるのとjoin。いや、それはそれで勉強になったけど。
0776デフォルトの名無しさん2008/09/24(水) 17:01:37
というか、liftM3ですね。とりあえず釣って来ます。
0777デフォルトの名無しさん2008/09/24(水) 17:21:21
ちなみに、
do args <- getArgs
   cnt <- getContents
   return otherFunc args True cnt
だったら?
0778デフォルトの名無しさん2008/09/24(水) 17:27:31
>>773みたいな構文は俺も欲しい
このスレで前に同じことを書いた記憶がある
Template Haskellを使えばなんとかなるかな

>>777
liftM3 otherFunc getArgs (return True) getContents
不恰好だけど
0779デフォルトの名無しさん2008/09/24(水) 18:03:09
>>773 は Control.Applicative を使って
soumeFunc <$> getArgs <*> getContents <*> getClockTime

return sumFunc <*> getArgs <*> getContents <*> getClockTime
って書ける。infixl 4 # ; (#)=(<*>) とすればあのままいける。
っていうのは
(return soumeFunc) #getArgs #getContents #getClockTime
じゃなくて
return (soumeFunc #getArgs #getContents #getClockTime)
のつもりだろうから嘘だけど。

ただ、IO は Applicative のインスタンスになってるけど、
一般のモナドは WrappedMonad って型が用意されてるだけなので、ちょっと面倒。
でも Control.Monad に <*> と同じ意味の ap ってのがあってこれはどのモナドにも使える。
<$> とかの Control.Applicative にあるいろいろな関数がないけど。

あと Control.Applicative には f (a -> b) -> a -> f b な関数が無いけど
それを f *$ x = f <*> pure x とか定義すれば
liftM3 otherFunc getArgs (return True) getContents は
otherFunc <$> getArgs *$ True <*> getContents と書ける。さすがにキモイ。
0780デフォルトの名無しさん2008/09/24(水) 18:18:11
おおっ、あるのね。
俺の見る程度の範囲じゃ<*>とかはあんま見ないけど、そういえばapは見るな。
まあ、>>698とか見ると、>>778の書き方が普通は落とし所って所かも知れんけど、調べてみます。
0781デフォルトの名無しさん2008/09/24(水) 23:29:43
windows環境でunix 2.3.0.0のインストールに成功した方っていらっしゃいますか?
私の環境では以下のエラーを吐いてbuildに失敗します。

compiling dist\build\System\Posix\DynamicLinker\Module_hsc_make.c failed
command was: C:\ghc\ghc-6.8.3\bin\ghc.exe -c -package base-3.0.2.0 -package directory-1.0.0.1 -Iinclude dist\b
uild\System\Posix\DynamicLinker\Module_hsc_make.c -o dist\build\System\Posix\DynamicLinker\Module_hsc_make.o

どなたか知恵をお貸しください

--unix.cabal
>The package is not supported under Windows (except under Cygwin).
Windowsは基本的に非サポート、
Cygwin環境下はOKという意味だと思ったんですが違いますか?
0782デフォルトの名無しさん2008/09/24(水) 23:58:13
長くて貼れなかった部分(すみません)のログを見てみると
cygwinのフォルダにあるheaderファイルの発見に失敗しているようでした。

終電の時間が近いので、検索パスの追加をした所で今日は帰ります
0783デフォルトの名無しさん2008/09/25(木) 00:01:22
仕事でハスケル使ってんの?
0784デフォルトの名無しさん2008/09/25(木) 01:25:45
言語設計学者の悲願の言語だけど、開発環境はまだ全然整備されていないから、ほぼ0
■ このスレッドは過去ログ倉庫に格納されています