トップページtech
1001コメント283KB

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

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2012/10/17(水) 08:08:28.97
haskell.org
ttp://www.haskell.org/

日本語サイト
ttp://www.sampou.org/cgi-bin/haskell.cgi
ttp://www.shido.info/hs/

過去ログ
関数型プログラミング言語Haskell
Part1 ttp://pc.2ch.net/tech/kako/996/996131288.html
Part2 ttp://pc2.2ch.net/test/read.cgi/tech/1013846140/
Part3 ttp://pc8.2ch.net/test/read.cgi/tech/1076418993/
Part4 ttp://pc8.2ch.net/test/read.cgi/tech/1140717775/
Part5 ttp://pc8.2ch.net/test/read.cgi/tech/1149263630/
Part6 ttp://pc11.2ch.net/test/read.cgi/tech/1162902266/
Part7 ttp://pc11.2ch.net/test/read.cgi/tech/1174211797/
Part8 ttp://pc11.2ch.net/test/read.cgi/tech/1193743693/
Part9 ttp://pc11.2ch.net/test/read.cgi/tech/1211010089/
Part10 ttp://pc12.2ch.net/test/read.cgi/tech/1231861873/
Part11 ttp://pc12.2ch.net/test/read.cgi/tech/1252382593/
Part12 ttp://hibari.2ch.net/test/read.cgi/tech/1272536128/
Part13 ttp://hibari.2ch.net/test/read.cgi/tech/1286706874/
Part14 ttp://hibari.2ch.net/test/read.cgi/tech/1299385928/
Part15 ttp://hibari.2ch.net/test/read.cgi/tech/1310199414/
Part16 ttp://toro.2ch.net/test/read.cgi/tech/1317958045/
Part17 ttp://toro.2ch.net/test/read.cgi/tech/1325510368/
Part18 ttp://toro.2ch.net/test/read.cgi/tech/1331902463/
Part19 ttp://toro.2ch.net/test/read.cgi/tech/1340760070/
0331デフォルトの名無しさん2012/11/09(金) 19:22:04.75
-threaded付けてるならアイドル時にもやる
0332デフォルトの名無しさん2012/11/09(金) 19:22:21.31
>>330
今入力待ちで暇だなー……
あ、もう要らない領域あんじゃん
スカベンジスカベンジ……

こうはならないの?
0333デフォルトの名無しさん2012/11/09(金) 19:23:42.68
>>331
あり^^
0334デフォルトの名無しさん2012/11/09(金) 21:15:13.21
今日 -XTransformListComp なるものの存在を知ったんだけど
これって需要あるの?


{-# LANGUAGE TransformListComp #-}
import GHC.Exts (groupWith)

xs = [1,3,4,5,7,9,10,11,13]
ys = [x | (x,y) <- zip xs [1..], then group by x-y using groupWith]
0335デフォルトの名無しさん2012/11/11(日) 15:48:20.65
conduit-0.5.2.7 を使っています。

ライブラリドキュメントの Data.Conduit にチュートリアルがありますが、
sourceList [1..10] $$ fold (+) 0 これの結果がどうなるか調べる方法を探しています。

チュートリアルでは、恐らく ghci 上で上記の式を評価して、
55 という数字が標準出力に出力されている様子が描かれていると思いますが、
私は Windows で GHC 7.6.1 を使っているため、ghci で conduit が使えません。

試しに次のようにしてみても、コンパイルエラーが出ます。

a :: GSink Int IO Int
a = sourceList [1..10] $$ fold (+) 0

main :: IO ()
main = print a

--------------------------------
No instance for (Show (Pipe l0 Int o0 u0 IO Int))
arising from a use of `print'
--------------------------------

どうすればチュートリアルのように
sourceList [1..10] $$ fold (+) 0 の評価結果を数値または数字で得る、
あるいは標準出力へ出力することができるでしょうか。
03363552012/11/11(日) 16:02:03.19
>>355
これでできました。

a :: GSink () IO Int
a = sourceList [1..10] $$ fold (+) 0

main :: IO ()
main = do
 a <- runPipe a
 print a

なんか不親切なチュートリアルですね。
最初の sourceFile の例ではちゃんと runResourceT があるのに。
03373352012/11/11(日) 16:02:48.97
すいません、レス番間違っていました。

>>335 です。
0338デフォルトの名無しさん2012/11/11(日) 18:20:04.17
皆さんの思うハスケルの他の言語に対する優位性はなんですか?
0339デフォルトの名無しさん2012/11/11(日) 18:25:43.15
conduit-0.5.4ならsourceList [1..10] $$ fold (+) 0で大丈夫だった
それよりWindowsのghc7.6.1ではghci上でconduitが使えないというのが気になる
0340デフォルトの名無しさん2012/11/11(日) 18:53:17.01
>>339

>>289 >>290 >>293 辺り
0341デフォルトの名無しさん2012/11/11(日) 19:02:24.58
>>339
7日に 0.5.4 が公開されていたんですね(その前日にDLしてました)

今 0.5.4.1 にアップデートして、
sourceList [1..10] $$ fold (+) 0 の値を print してみましたが、
コンパイルエラーでした。

大丈夫だったというのは、どのようにやったのでしょうか。
0342デフォルトの名無しさん2012/11/11(日) 19:07:49.53
>>338 普段感じる利点はこのあたり
大域的な型推論
直和型が簡単に表現できる(CのunionやOOPLのsubtypeと比べて)
パターンマッチ(網羅性チェック、分岐と値の取り出しを同時に行える、など)
副作用のある箇所が型により分離される
(LLとかよりは)実行速度が速い
0343デフォルトの名無しさん2012/11/11(日) 19:10:49.18
ほむほむ。
03443412012/11/11(日) 19:11:52.88
>>339
あぁ、分かりました。

(sourceList [1..10] $$ fold (+) 0) >> print
こういう事ですね。
これならできました。

もしかして、これならアップデートしなくてもできていたかも知れません。


ところで、conduit を 0.5.2.7 から 0.5.4.1 へ
"cabal install conduit" でアップデートしたのですが、
ライブラリドキュメントの方はこれでは更新されないのでしょうか。
(デフォルトなら ・・・/AppData/Roaming/cabal/doc/index.html
にインストールされるものです)

ドキュメントの表記の方は 0.5.2.7 のままなんです。
03453412012/11/11(日) 19:18:31.91
>>344
誤 (sourceList [1..10] $$ fold (+) 0) >> print

正 (sourceList [1..10] $$ fold (+) 0) >>= print


ライブラリドキュメントの方はトップの目次のところだけでなく、
内容も、例えば Data.Conduit のページの上部にも
"conduit-0.5.2.7: Streaming data processing library."
と書かれていて、更新されていません。

こういうものなのでしょうか。

Cabal のパッケージのバージョンは、
(規則に従うなら)4つ目の番号の変更は、
互換性は保っているがAPIが変更されている事になるので、
ドキュメントも変更しないとまずいような気がするのですが・・・
0346デフォルトの名無しさん2012/11/11(日) 20:02:42.53
ghciで
λ> sourceList [1..10] $$ fold (+) 0
って入力しただけだけど 省略 >>= printと同じ事か

ドキュメンテーションが更新されないのは多分haddockのバージョンとghcのバージョンが違うから生成に失敗してるとかが考えられる
03473412012/11/11(日) 20:46:24.73
>>346
> 省略 >>= printと同じ事か
なるほど、たしかに。


> 多分haddockのバージョンとghcのバージョンが違うから

haddock.exe は ghc 7.6.1 に元々入っているのですが、
これが違うという事でしょうか。

ちなみに、ghc の bin ディレクトリには haddock.exe とは別に、
haddock-7.6.1 という名前の謎のファイルもあります。
(バイナリエディタで見てみると、形は実行ファイルの様ですが)

どうも、ghc 7.6.1 は謎の挙動かちらほらとありますね・・・
0348デフォルトの名無しさん2012/11/11(日) 22:43:59.93
インストールした直後にcabalでconduit入れた時になんかhaddockのバージョンがおかしいって警告出たから
cabal install haddockで入れなおしたらconduitのドキュメント作ってくれるようになった
これはcabal/binにhaddockがあるからそっちが優先されるのが原因だけど
0349デフォルトの名無しさん2012/11/12(月) 02:11:31.23
>>342
Javaのような言語で書かれた業務アプリ、ドカタの世界にもこれから進出してきたりしますかね
0350デフォルトの名無しさん2012/11/12(月) 06:17:52.78
>>349
早くて20年後ぐらいじゃね?
0351デフォルトの名無しさん2012/11/12(月) 20:15:17.94
Javaで書かれた商用ソフト見たことがない
ハードについてるドライバは何度かある
0352デフォルトの名無しさん2012/11/12(月) 20:22:24.00
>>351
俺はひとつだけ知ってる
astah*

Haskell で書かれた商用ソフトってあるんかな
うちは社内ツールではあるけど
0353デフォルトの名無しさん2012/11/12(月) 20:29:59.56
そういえばperlやjavascriptで書かれた商用ソフトも見たこと無いな。
0354デフォルトの名無しさん2012/11/12(月) 20:33:15.19
コンパイルできない言語ってソースをそのまま売ることになると思うけど、それって商売になるのだろうか
0355デフォルトの名無しさん2012/11/12(月) 20:37:06.13
ソースを売れっていうのは普通にあるでしょ
0356デフォルトの名無しさん2012/11/12(月) 20:43:17.14
Android 用有料アプリは Java で書かれた商用ソフトである
という認識でいいのか?
03573412012/11/12(月) 22:44:21.87
>>348
Haddock を cabal install で入れてから、
cabal install --reinstall Conduit してもダメでした。
(ghc\bin ディレクトリより cabal\bin ディレクトリの方が
優先的に検索されるように設定しましたが・・・)

cabal\bin の Haddock.exe を ghc\bin へコピーしてみましたがダメでした。

よく見たら、cabal\doc 内には conduit-0.5.2.7 と conduit-0.5.4.1 があったので、
conduit-0.5.2.7 の方を適当にリネームして、index.html もリネームし、
この状態で cabal install --reinstall Conduit してみたら、
ドキュメントの目次やコンテンツの Conduit のバージョンが
ちゃんと 0.5.2.7 に更新されました。

Haddock の更新は必要条件だったのかよく分かりませんが、
とりかくドキュメントが正しく更新できて良かったです。

お騒がせしました。
0358デフォルトの名無しさん2012/11/13(火) 20:32:21.56
>>351
Minecraft
0359デフォルトの名無しさん2012/11/14(水) 13:53:30.81
何だよ
type family Mutable v :: * -> * -> *
Mutable v s a is the mutable version of the pure vector type v a with the state token s
って
リワハじゃ習わなかったぞ
0360デフォルトの名無しさん2012/11/14(水) 15:21:27.75
トップレベルの関数の型宣言で
Unbox a => ……としたとして
letやwhereと続けた内部関数にも型宣言をつけるとします

このとき、その宣言でもトップレベルの a と同じ型を指定する為にはどうしますか?
0361デフォルトの名無しさん2012/11/14(水) 18:30:25.04
関数を生成する関数 :: Unbox a => 内部関数の型 -> トップレベル関数の型
トップレベル関数 = 関数を生成する関数 内部関数 where 内部関数 = …
0362デフォルトの名無しさん2012/11/14(水) 19:30:01.00
>>360
Lexically scoped type variables の事かな
0363デフォルトの名無しさん2012/11/19(月) 07:06:57.78
関数内使わないほうが読みやすく感じる
whereって必要ですか?
0364デフォルトの名無しさん2012/11/19(月) 07:07:41.13
s/関数内/関数内の関数定義/
0365デフォルトの名無しさん2012/11/19(月) 07:37:36.32
さすがに一時束縛なしはハードモードでないの? letのほうが読みやすいということもあまりないでしょう
0366デフォルトの名無しさん2012/11/19(月) 08:06:27.68
関数内関数は自由変数が多くて理解するのが難しいです
トップレベルの関数に持ち上げてしまって、モジュールの機能で外部からは隠して、
自由変数になっていたところは明示的に引数として渡すほうが良いのではないかと
0367デフォルトの名無しさん2012/11/19(月) 08:09:12.81
ケースバイケースなんで
whereが要る要らないの話にはならないと思う
0368デフォルトの名無しさん2012/11/19(月) 08:13:31.56
それはね、長い関数が読み難いだけなんだよ
0369デフォルトの名無しさん2012/11/19(月) 18:06:19.91
自由変数の追いにくさと引数渡しの煩雑さを天秤に掛けた結果、
多くの人はwhereを大量に使うことを選択している
何を読み難いと感じるかは個人差が大きいから、
多数派と違う感性を持ってると生きづらいね

という結論が嫌なら、「読みやすく感じる」よりも客観的な論拠を挙げてください
0370デフォルトの名無しさん2012/11/20(火) 00:03:10.08
プログラムは書くことより読むことのほうが難しいし読むことの方が多い
whereはプログラムを書きやすくできるが読みにくくする
whereを使うのは甘え
0371デフォルトの名無しさん2012/11/20(火) 06:58:26.14
>>366
関数内のスコープに限定するより
モジュール内スコープに広げた方が読みやすい?
頭大丈夫?
0372デフォルトの名無しさん2012/11/20(火) 07:07:32.45
>>370
頭の中で、読みにくいコードを読みやすいコードに書きかえればいいだろ
それができる人は読むことより書くことが多い
0373デフォルトの名無しさん2012/11/20(火) 07:38:40.46
>>363
末尾再帰覚えてない人かな?
where使わず書いたら、引数の数が違うだけで同じ機能の関数が沢山出来上がってしまう

sum ns = sum' ns 0
where
sum' [] v = v
sum' (n:ns) v = sum' ns (n + v)

whereが無ければsum関数とsum'関数の両方が関数を使う側に公開されるか、末尾再帰関数作る度にモジュール書き換えが必要になる
0374デフォルトの名無しさん2012/11/20(火) 08:10:24.50
sum ns = let sum' [] v = v
sum' (n:ns) v = sum' ns (n + v)
in sum' ns 0
0375デフォルトの名無しさん2012/11/20(火) 09:16:11.00
>>372
君、仕事でプログラム書いたことないでしょ?
0376デフォルトの名無しさん2012/11/20(火) 09:29:43.91
どっちも同じだと思えば両方読めるようになるのに、ノイズが気になって読めない
ノイズが少ない方が優れているといってノイズばかり見ている

雑音を無視したら優劣の概念がなくなってしまう
優劣を気にするとデジタルが読めなくなる
0377デフォルトの名無しさん2012/11/20(火) 09:57:34.35
仕事でHaskell使った事ないわーw
0378デフォルトの名無しさん2012/11/20(火) 14:25:22.30
そもそも、お前がいう「仕事」って、受注開発(の賃金労働)のことだろ?
自分で作ったサービスで始める仕事(ビジネス)だったら、言語はなんだっていいんだよ。
ドヤ顔で「仕事でhaskell使ったことないわ」とか恥ずかしすぎるわw
0379デフォルトの名無しさん2012/11/20(火) 14:26:08.12
会社に小遣いもらってる分際が偉そうに、と思うね。
0380デフォルトの名無しさん2012/11/20(火) 14:45:50.00
仕事で戦車使ったことないわ
0381デフォルトの名無しさん2012/11/20(火) 15:35:16.08
ああ、Haskellerってこういうのばっかなのね
0382デフォルトの名無しさん2012/11/20(火) 16:26:57.23
まだ平和な方のスレですよ
0383デフォルトの名無しさん2012/11/20(火) 18:16:34.72
>>366
トップレベルにリフトすれば自由変数が減るかのような錯覚はどこからきた?
0384デフォルトの名無しさん2012/11/20(火) 18:21:28.91
さすがに>>378-379は引くわ
0385デフォルトの名無しさん2012/11/20(火) 18:30:03.16
関西型プログラミング言語
0386デフォルトの名無しさん2012/11/20(火) 18:49:25.20
なんでやねん
0387デフォルトの名無しさん2012/11/20(火) 22:50:08.77
Haskell使う案件ってどこに行けばあるんだろうな。
0388デフォルトの名無しさん2012/11/20(火) 23:02:02.53
Haskell を使う事案が発生しました
0389デフォルトの名無しさん2012/11/21(水) 01:14:53.06
>>387
大学
0390デフォルトの名無しさん2012/11/21(水) 07:23:50.52
>>387
実際にどのような仕事があるか知らんが、
君には "haskell commercial OR industry" でググる知恵はないのか
0391デフォルトの名無しさん2012/11/21(水) 09:17:06.66
ちえをくれ
0392デフォルトの名無しさん2012/11/22(木) 02:43:01.30
おいおい、haskell使った仕事が貰えないなら、
自分で始めればいいだけだろ。
仕事を作るのも仕事のうち。
0393デフォルトの名無しさん2012/11/22(木) 06:04:12.01
ま、自分が知らないからって無いで押し切るのは
一つの生き方ではあるわな
0394デフォルトの名無しさん2012/11/22(木) 07:38:46.45
>>392
いや、維持保守を引き継ぐ人たちがHaskell使えないのに
Haskellのソースを残すわけには行かないだろ。
0395デフォルトの名無しさん2012/11/22(木) 09:54:55.62
Cに変換して納品
0396デフォルトの名無しさん2012/11/22(木) 13:58:22.73
>>393
本当に知らなくていい事なのかを考えもしない手合いは厄介だけどな。
0397デフォルトの名無しさん2012/11/22(木) 13:59:26.23
>>395
いやそこはPHPで。
0398デフォルトの名無しさん2012/11/22(木) 14:55:22.06
>>393は誰に向かって書いてるんだ?
0399デフォルトの名無しさん2012/11/22(木) 16:17:40.42
>>394
仕事にHaskellを使う事の利点を、アピール出来なけれぱそうなるな。
0400デフォルトの名無しさん2012/11/22(木) 17:23:28.24
>>387
あるよ。金融系で実稼働している。
0401デフォルトの名無しさん2012/11/22(木) 17:29:09.33
データマイニングでHaskell使ってる人なら知ってるけど零細だからなー…
0402デフォルトの名無しさん2012/11/22(木) 21:09:50.14
仕事があるかとかどうでもいいわ
そんなに仕事がしたけりゃJavaでも書いてればいいじゃん
0403デフォルトの名無しさん2012/11/22(木) 21:32:01.16
黒板言語未満がここに立証されました
0404デフォルトの名無しさん2012/11/22(木) 21:35:32.48
すどーさいえんてぃふぃっくめそっど
0405デフォルトの名無しさん2012/11/22(木) 21:49:49.04
今 Haskell でデータベースを操作するプログラムを書くのに
最も洗練されているライブラリは何でしょう?

やはり今も昔も haskelldb が一歩先を行く感じでしょうか。
0406デフォルトの名無しさん2012/11/22(木) 23:28:04.06
Data.List.partition :: (a -> Bool) -> [a] -> ([a], [a])

これを次のいずれかのような型にしたい

f : (Monad m) => (a -> m Bool) -> [a] -> m ([a], [a])
f : (Monad m) => (a -> m Bool) -> m [a] -> m ([a], [a])

どちらでもいいのですが、スクラッチビルドすることなく、
どうにか元の partition を使って f を作れないでしょうか。

[FilePath] を System.Directory.doesDirectoryExist と partition を使って
ディレクトリとそれ以外のものに分けたい、というのが動機です。

ちなみに、Control.Monad.liftM2 partition だと、
Monad m => m (a -> Bool) -> m [a] -> m ([a], [a]) という型になって、
これでは目的を果たせませんでした。
0407デフォルトの名無しさん2012/11/23(金) 00:12:37.96
無理やりっぽいやり方だけど

f pred xs = do{
rs <- mapM pred xs;
let (ys, zs) = partition snd (zip xs rs);
return (map fst ys, map fst zs);
}

なら目的は果たせそう
0408デフォルトの名無しさん2012/11/23(金) 00:16:47.55
paritionM で検索すると同じようなことを考えてる人がいる
filterM なら存在するけど partitionM はないんだよな
0409デフォルトの名無しさん2012/11/23(金) 01:03:35.06
Haskellで求人募集してphp組んでもらいます
0410デフォルトの名無しさん2012/11/23(金) 02:09:12.09
Haskellでphpのコード自動生成してたのを思い出した
0411デフォルトの名無しさん2012/11/23(金) 03:47:23.41
>>394
保守?
お前の仕事はそれしかないのか?
>>395
納品?
twitterやfacebookあるいはwindowsみたいに
自分でアイデアを実現して商売始めてやろうという気概や野望はないのか?
0412デフォルトの名無しさん2012/11/23(金) 03:48:46.49
人に言われたことしかやらないような雑魚はhaskellやらなくていいよ。
haskellは受注開発向きじゃないんだから。
0413デフォルトの名無しさん2012/11/23(金) 03:51:13.24
受注開発のソフトハウスなんて指示待ち君の会社バージョンじゃんw
0414デフォルトの名無しさん2012/11/23(金) 06:10:46.56
うわぁ…。
0415デフォルトの名無しさん2012/11/23(金) 07:01:49.96
Haskellは>>411-413みたいな人に向いてるらしい
0416デフォルトの名無しさん2012/11/23(金) 07:02:55.06
何に感化されたのやら。
0417デフォルトの名無しさん2012/11/23(金) 07:05:51.48
なんか、>>411-413が無職の妄想野郎に見える。
0418デフォルトの名無しさん2012/11/23(金) 07:24:06.23
Twitter,Facebook,Windows。どれも、既に類似品があったのに成功した例だな。アイデアと言うよりは、マーケティングの上手さ。
0419デフォルトの名無しさん2012/11/23(金) 07:27:39.44
Simon MarlowがGHCのフルタイム開発を離れる
http://www.haskell.org/pipermail/haskell/2012-November/023566.html
Haskell終わったな
0420デフォルトの名無しさん2012/11/23(金) 07:50:59.95
何も終わっちゃいない
始まってすらない
0421デフォルトの名無しさん2012/11/23(金) 08:10:32.64
いつになったら妄想野郎以外にも使ってもらえるようになるんですか?
0422デフォルトの名無しさん2012/11/23(金) 08:50:34.46
バカが張り付いてるな
0423デフォルトの名無しさん2012/11/23(金) 09:07:05.42
>>411-413
いかにも○○(言語)が最強とか言っちゃいそうなタイプだな
学生に多い
0424デフォルトの名無しさん2012/11/23(金) 09:10:58.51
受注開発してる奴は底辺ドカタ。

底辺ドカタが言語を語るなんて滑稽。君達に選択権は無い。
0425デフォルトの名無しさん2012/11/23(金) 09:27:27.86
どうせ学生ならHaskellみたいなものよりもAgdaとかCoqみたいなものに傾倒して欲しい
0426デフォルトの名無しさん2012/11/23(金) 09:40:17.12
モノで優越感を得る事にはまり込んだヒトの末路
0427デフォルトの名無しさん2012/11/23(金) 09:45:53.79
安全性に傾倒するヒトは、利益の多さではなく損害の少なさを評価する
社畜よ、これが安全だ
0428デフォルトの名無しさん2012/11/23(金) 09:55:47.01
赤字やん
0429デフォルトの名無しさん2012/11/23(金) 10:02:35.08
>>424
残念。趣味では好きな言語を選択して楽しんじゃってまーすw
ベロベロバーw
0430デフォルトの名無しさん2012/11/23(金) 10:04:06.15
ベロベロバーっておっさんっぽい
■ このスレッドは過去ログ倉庫に格納されています