5ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

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

1 :デフォルトの名無しさん:2013/10/25(金) 21:54:29.92
関数型プログラミング言語 Haskellについて語るスレです。

前スレ: 関数型プログラミング言語Haskell Part23
http://toro.2ch.net/test/read.cgi/tech/1376111807/

haskell.org
http://www.haskell.org/

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

過去ログ (10〜)
Part21 ttp://toro.2ch.net/test/read.cgi/tech/1358702176/
Part20 ttp://toro.2ch.net/test/read.cgi/tech/1350428908/
Part19 ttp://toro.2ch.net/test/read.cgi/tech/1340760070/
Part18 ttp://toro.2ch.net/test/read.cgi/tech/1331902463/
Part17 ttp://toro.2ch.net/test/read.cgi/tech/1325510368/
Part16 ttp://toro.2ch.net/test/read.cgi/tech/1317958045/
Part15 ttp://hibari.2ch.net/test/read.cgi/tech/1310199414/
Part14 ttp://hibari.2ch.net/test/read.cgi/tech/1299385928/
Part13 ttp://hibari.2ch.net/test/read.cgi/tech/1286706874/
Part12 ttp://hibari.2ch.net/test/read.cgi/tech/1272536128/
Part11 ttp://pc12.2ch.net/test/read.cgi/tech/1252382593/
Part10 ttp://pc12.2ch.net/test/read.cgi/tech/1231861873/

2 :デフォルトの名無しさん:2013/10/25(金) 21:55:57.09
               ノ      ゚.ノヽ  , /}      ...
            ,,イ`"     、-'   `;_' '    ..::::::::::::::...
   ,-、  _.._   (        (,(~ヽ'~     ..:::::::::::::::::::::::
 )'~  レー'  〉   ヽ       i`'}       .:::::::::::::::::::::::
 ~つ     '-ー、  i       | i'     ...:::::::::::::::::::::::
 /       <  /     。/   !  ......:::::::::::::::::::::::::    これは>>1乙じゃなくて
/         ~^´     /},-'' ,●::::::::::::::::::::::::::::::::::::
i、        ,i' _,,...,-‐-、/    i  ::::::::  .:::::::::::::
..ゝ        <,,-==、   ,,-,/      .:::::::::::            放射能がうんたら
 )       {~''~>`v-''`ー゙`'~       ..:::::::::                          ........::.
 {        レ_ノ            ..::::::::.                         ......:::::::::
ノ         ''           ..:::::::                        ...::.:...:::::::::
                     .:::::::::                     ...:......:::::::::::: .
                    .:::::::::::.        .....      ..  ..::::::::::::::::::::::::   :::.
                    ::::::::::::::::.::::::....:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::.. ::  ::..
                    .:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :::    ::.
                    ::::::::::::::::: :::::::::::::::::::::::::::::: :::::
                          .::    ::.  :::

3 :デフォルトの名無しさん:2013/10/25(金) 21:57:45.35
過去ログ (20〜)
Part23 http://toro.2ch.net/test/read.cgi/tech/1376111807/
Part22 http://toro.2ch.net/test/read.cgi/tech/1364009659/
Part21 ttp://toro.2ch.net/test/read.cgi/tech/1358702176/
Part20 ttp://toro.2ch.net/test/read.cgi/tech/1350428908/

4 :デフォルトの名無しさん:2013/10/26(土) 03:58:23.29
C++の限界
http://www.digitaltrends.com/wp-content/uploads/2013/02/gtav.jpg

C#の限界
http://www.stfuandplay.com/images/uploads/GunsIO-TOP.jpg

Haskellの限界
http://www.haskell.org/wikiupload/c/c2/Frag1.png

5 :デフォルトの名無しさん:2013/10/26(土) 19:26:01.37
最高

6 :デフォルトの名無しさん:2013/10/26(土) 21:50:44.57
Haskellのコスパのいい勉強順序とは?

7 :デフォルトの名無しさん:2013/10/26(土) 21:56:56.30
C++←自転車
C#←空中戦艦
Haskell←ソルジャー

C++が最弱!ありえん!なんで自転車!

8 :デフォルトの名無しさん:2013/10/26(土) 22:32:02.64
>>6
他の言語と同じだよ。

1. まず Hello World 含むトイプログラムを何十個と書いては実行し、
主な文法や機能を身に付ける。

2. 次にそれらのプログラムの実行がなぜ意図した結果になるのか、
中でどのような処理が行われているのか、その意味を理解する。
ただし、Haskell の場合は C や Java などと違ってここが難解なので、
具体的にコンパイラがどのようなコードを吐くかまでは理解しなくてもよい。
もっと抽象的に、プログラムを順に弱頭部正規形に簡約して評価していく様子が
頭に思い浮かべることができれば十分。

3. 何か小さなアプリをいくつか作り上げてみる(完成させるのがポイント)。
linux の echo コマンドや cat コマンドの簡易版でも良い。
完成したら、いくつか機能を付け加えてみる。

4. いくつか作ってみるうちに、ボイラープレートを何とかしたいなとか、
もっと簡単に機能を加える方法はないものかとか、
なんかプログラムが汚くてかっこ悪いなとか、いろいろ思うところが出てくる。
そうしたら、他人のコードを見たり、BBSで質問したり、
問題を解決してくれそうなライブラリを探したりすればいい。

実際はこんな綺麗にステップアップ式に学べるものではなく、
おそらく 2 3 4 を行ったり来たりすることになるが、
概ねこのような順で学ぶといいのではないか。

コストを時間と捉えるなら、私はこの順を勧める。

9 :デフォルトの名無しさん:2013/10/26(土) 22:53:59.43
プログラマは頭なんてよくないよ
一種のサバン症候群だから日本語は苦手

10 :デフォルトの名無しさん:2013/10/26(土) 23:07:12.23
>>8
これはありがたい

11 :デフォルトの名無しさん:2013/10/27(日) 01:47:21.69
ネット上で日本語の質の良い入門サイト教えてほしい

12 :デフォルトの名無しさん:2013/10/27(日) 03:31:14.01
gentle introductionの日本語訳

13 :デフォルトの名無しさん:2013/10/27(日) 05:04:16.17
サンプル見ながらでしか書けない人っているよね

14 :デフォルトの名無しさん:2013/10/27(日) 05:05:09.54
文字列を出力して改行する = putStrLn
こんにちは、世界 = 文字列を出力して改行する "こんにちは、世界"

15 :デフォルトの名無しさん:2013/10/27(日) 07:28:10.87
SL4A で動きますか?

16 :デフォルトの名無しさん:2013/10/27(日) 08:23:51.44
>>14
へー(、)という演算子が定義できるのか

17 :デフォルトの名無しさん:2013/10/27(日) 08:39:05.13
冗談抜きでプログラムさくさく書けるひと尊敬するわ
コミュ障が多いけど

18 :デフォルトの名無しさん:2013/10/27(日) 11:21:51.69
今時プログラムをさくさく書けないって古い地球人過ぎないか

19 :デフォルトの名無しさん:2013/10/27(日) 11:55:53.91
マルチポストに反応する新しい地球人

20 :デフォルトの名無しさん:2013/10/27(日) 12:02:52.38
>>13
関数マニュアル見ただけでかけるほどマニュアルはちゃんとかけてないし、
そもそも関数自体がそんな風にできてない
とすればどういう使い方を想定して関数があるのかをサンプル見て知るしかない

21 :デフォルトの名無しさん:2013/10/27(日) 13:11:39.80
>>12
これのこと?
ttp://www.sampou.org/haskell/tutorial-j/index.html
結構古いけどhaskell98って今のhaskellと違う部分とか無いのかな

22 :デフォルトの名無しさん:2013/10/27(日) 13:49:51.27
そんなに変わってない。基本的に高度な機能は言語拡張(処理系依存)でカバーするから
http://www.haskell.org/haskellwiki/Haskell_2010#Changes_since_Haskell_.2798

23 :デフォルトの名無しさん:2013/10/27(日) 15:22:18.34
じゃあ大丈夫か
でもやっぱりそのサイトの日本語分かりづらかったから本買おうかな
Lispから本格的にHaskellに入信しようか迷う

24 :デフォルトの名無しさん:2013/10/28(月) 02:49:05.04
Haswell の GUI は何がメジャーですか

25 :デフォルトの名無しさん:2013/10/28(月) 10:14:58.65
gtk+とwxHaskellかな
qtもあるけど長いこと更新されてないと思う

26 :デフォルトの名無しさん:2013/10/28(月) 14:33:22.79
節子それHaswellちゃう

27 :デフォルトの名無しさん:2013/10/29(火) 02:23:58.08
通はHaskell+GLUT

28 :デフォルトの名無しさん:2013/10/29(火) 07:39:36.24
http://www.haskell.org/haskellwiki/X_window_programming_in_Haskell
Xサーバでも、Xqartz、Xmingで動けばいちおうクロスプラットフォームになるのか。

29 :デフォルトの名無しさん:2013/10/29(火) 07:54:11.48
よくかんがえてみたらJavaの実行環境もそんなもんだったな
インストーラ作ってハードル下げればクロスプラットフォームになるんじゃ

30 :デフォルトの名無しさん:2013/10/29(火) 10:16:35.03
>>27
いや、Haskell+GLFWだね

31 :デフォルトの名無しさん:2013/10/29(火) 15:02:10.03
Win32APIで勉強してる

32 :デフォルトの名無しさん:2013/10/29(火) 15:25:23.97
結局よくあるプログラムには向いてないんだよね?
そういうのも綺麗にシャレオツに書ける言語ないかな。

33 :宇宙人:2013/10/29(火) 16:44:31.44
>>32
地球には今のところ無いが、地球の科学技術レベルはまんざらでもなく10年後くらいにはあるかも。

34 :デフォルトの名無しさん:2013/10/29(火) 17:47:43.20
お、おう

35 :デフォルトの名無しさん:2013/10/29(火) 17:51:23.93
プログラムを作ることに向かないプログラミング言語Haskell

36 :デフォルトの名無しさん:2013/10/29(火) 21:06:32.89
でも論文採択率は良さそう...

37 :デフォルトの名無しさん:2013/10/30(水) 00:49:38.58
WindowsやAndroidでも普通に動けばな

38 :デフォルトの名無しさん:2013/10/30(水) 00:50:18.81
F#でいいんじゃねぇの

39 :デフォルトの名無しさん:2013/10/30(水) 01:29:12.39
逆に関数型で生まれた概念が他の言語に入れば満足だ
純粋関数だけでどうせプログラム組めないし

40 :デフォルトの名無しさん:2013/10/30(水) 02:00:26.33
>>39
一番成功している関数型言語がC言語というオチ

41 :デフォルトの名無しさん:2013/10/30(水) 06:50:46.69
Cが関数型言語ってどういうこと
プリプロセッサで頑張る話?

42 :デフォルトの名無しさん:2013/10/30(水) 07:08:58.55
手続き型言語が体に馴染んでいるならそれ使ってればいいじゃん?って思うんだけど
Haskellが第一言語の俺達とは相容れない運命なのさ…

43 :デフォルトの名無しさん:2013/10/30(水) 09:04:47.62
pascalが手続き型でcが関数型だと勘違いしてた時期が俺にもありましたw

44 :デフォルトの名無しさん:2013/10/30(水) 09:36:55.63
>>41
別にプリプロセッサだけで頑張る必要ないだろ。
純粋性を保つようにコードを書けばいいんじゃね?

45 :デフォルトの名無しさん:2013/10/30(水) 12:31:19.74
>>44
あいや、Cで関数型と聞いて思い当たったのがプリプロセッサを純粋関数型言語として使うという話しかなかったので
Cの #define を駆使するとプリプロセッサだけで案外ちゃんと計算ができるんだけど、代入が表現できないので純粋関数型言語の作法で書かざるを得ないというネタ(思い出してみたらネタだったけど煽る意図ではなかった)

46 :デフォルトの名無しさん:2013/10/30(水) 12:31:45.13
>>44
保証がない

47 :デフォルトの名無しさん:2013/10/30(水) 12:39:29.52
昔から一応functionalヘッダ持ってたり最近ラムダ式とか仕様に入れだしたC++を挙げるならまだしもなぜわざわざCを

48 :デフォルトの名無しさん:2013/10/30(水) 12:40:37.22
Haskell の解説を見ると呪文のようにループは再帰があればって書いてあるけど
本当はループ欲しいんじゃないの?

49 :デフォルトの名無しさん:2013/10/30(水) 13:20:22.69
>>46
unsafePerformIOだって保証ないじゃん

50 :デフォルトの名無しさん:2013/10/30(水) 19:04:39.77
>>49
無理に穴を見つけようとしないで、もっと気楽に素直になれ

51 :デフォルトの名無しさん:2013/10/30(水) 19:29:28.28
>>48
心の底から要らない。あっても使わない

52 :デフォルトの名無しさん:2013/10/30(水) 19:50:42.76
>>48
ループはいらんかもね。
俺は再帰よりもmapとかを多用するようになった。

53 :デフォルトの名無しさん:2013/10/30(水) 20:12:40.70
caseいらないとかも同じで
最初から完璧な最終的なコード書けるならいいけど
実験的なコード書いてるときはどうしてもゆるい書き方が欲しくなるのだよ

54 :デフォルトの名無しさん:2013/10/30(水) 20:24:55.77
xml-conduit モジュールの Text.XML.Cursor.content や attribute などは
戻り値として text モジュールの Data.Text.Internal.Text 型のリストを返します。

このリストの要素に対して text モジュールの Data.Text.unpack 関数を適用すると
String 型の値が返ってきます。

しかし、なぜ Data.Text.Internal.Text 型の値に
Data.Text.unpack 関数が使えるのでしょうか。

Data.Text.unpack :: Text -> String の第1引数の型は
Data.Text.Text であって、Data.Text.Internal.Text ではないにも関わらず、です。

55 :デフォルトの名無しさん:2013/10/30(水) 20:30:34.85
>>54
コンパイラーさんがいいと言ってるんだから、細けぇことはいいんだよ!

56 :デフォルトの名無しさん:2013/10/30(水) 23:20:41.33
再帰はスタックを馬鹿食いするから多用すべきではない

57 :54:2013/10/30(水) 23:50:04.37
>>55
真面目にお願いします

58 :デフォルトの名無しさん:2013/10/30(水) 23:53:13.23
>>54
名前空間が違うだけで、型は同じ。

59 :デフォルトの名無しさん:2013/10/30(水) 23:54:53.51
>>56
List->Listなら、再起でもスタック消費しない。
それ以外は基本、末尾再帰。

60 :デフォルトの名無しさん:2013/10/31(木) 00:08:02.05
>>57
http://hackage.haskell.org/package/text-0.11.3.1/docs/src/Data-Text.html

61 :デフォルトの名無しさん:2013/10/31(木) 17:03:37.76
Egisonの話題ってここで良いの?

62 :デフォルトの名無しさん:2013/10/31(木) 19:51:29.64
ダメだろ

63 :デフォルトの名無しさん:2013/10/31(木) 20:11:50.44
どこですればいい?

64 :デフォルトの名無しさん:2013/10/31(木) 20:37:46.69
>>63
こちらで
http://toro.2ch.net/test/read.cgi/tech/1383219359/

65 :デフォルトの名無しさん:2013/10/31(木) 20:42:14.31
おっ サンキュー

66 :54:2013/11/01(金) 07:51:27.23
>>58
>>60

「名前空間が違うだけで、型は同じ」 そういうことなんですね。

でも、どうしてわざわざ Internal の方の名前空間を使うのでしょうか。

"Internal" というモジュールは他のライブラリでもありますが、
基本的にはより低レベルの内部的な処理のためのものだと思います。
ライブラリを利用する側の者が使うのはあまり好ましいことではないような気がしますが、
Data.Text.Internal の説明には

Modules which extend the Text system may need to use this module.

とあるように、むしろ Data.Text ではなくこちらを使うよう促していますよね。
なぜなんでしょうか?

67 :デフォルトの名無しさん:2013/11/01(金) 09:24:55.23
>>66
それ以上は言語とは関係ないライブラリ固有の話題だからドキュメント調べろよ

68 :デフォルトの名無しさん:2013/11/01(金) 09:47:45.58
>>66
>Modules which extend the Text system
ってライブラリを拡張する場合だから、ただの利用者じゃないでしょ。

69 :デフォルトの名無しさん:2013/11/01(金) 10:16:27.59
>>68
その上、その後ろに、こう書いてあるしな。

You should not use this module unless you are determined to monkey
with the internals, as the functions here do just about nothing to preserve
data invariants. You have been warned!

そもそも、>>54の前提がおかしい。

>xml-conduit モジュールの Text.XML.Cursor.content や attribute などは
>戻り値として text モジュールの Data.Text.Internal.Text 型のリストを返します。

ソースを見るとこうなってる。
http://hackage.haskell.org/package/xml-conduit-1.1.0.7/docs/src/Text-XML-Cursor.html#content

import qualified Data.Text as T
content :: Cursor -> [T.Text]

70 :54:2013/11/01(金) 12:52:36.75
>>69
ghci の :t コマンドで型情報を調べたのですが、
どうも、現在どのモジュールを読み込んでいるのかによって
:t コマンドの結果が違うようです。

ghci を立ち上げた直後に :m + Text.XML.Cursor として
モジュールを読み込んだ状態だと、次のようになりました。

Prelude Text.XML.Cursor> :t content
content :: Cursor -> [Data.Text.Internal.Text]

Data.Text モジュールも一緒に読み込むと次のようになりました。

Prelude Text.XML.Cursor Data.Text> :t content
content :: Cursor -> [Text]

:l で読み込んだ自作のモジュール内に import Data.Text (Text) という記述があっても、
:t で型を調べるときは上記のように「何を :m で読み込んでいるか」によって結果が変わるみたいです。

私は ghci 上の Prelude Text.XML.Cursor> の状態で調べていたようです。

本当の型を調べるには :t は役立たず、ソースを読まなければならないということでしょうか。


環境
ghc 7.6.3

71 :デフォルトの名無しさん:2013/11/01(金) 14:11:44.51
te

72 :デフォルトの名無しさん:2013/11/01(金) 14:30:43.39
>>70
牛丼屋に入って調理場に向かって”並・たまご”と言うか、
カウンターで注文取りにきた人に”牛丼並盛・たまご1つ”
と言うかの違い。

基本的には出てくるものは同じだが、掟破りの注文方法がずっと通用する
保証はどこにもない。

73 :デフォルトの名無しさん:2013/11/01(金) 16:53:11.20
t

74 :54:2013/11/01(金) 17:57:01.12
>>72
今回の件で言えば、どれのことを「掟破り」と喩えているのでしょうか。

Data.Text.Internal.Text 型を使うのが掟破りで、
Data.Text.Text 型を使うのが通常の方法という意味でしょうか。
それだと、やはり ghci の :t では掟破りかどうかを判断できないということでしょうか。

それとも、型を調べるのにソースを参照するのが掟破りで、
ghci の :t を使うのが通常の方法ということでしょうか。
それだと今回のように正しい判断ができなくなります。

75 :デフォルトの名無しさん:2013/11/01(金) 18:10:20.33
>>74
型を調べる正しい方法はドキュメントやソースを読むことであって、
:t を使うのは調理場の中に入って自分でご飯をよそうようなことだと思うけど。

76 :デフォルトの名無しさん:2013/11/01(金) 18:27:57.28
ドキュメントはともかくソースを読んじゃダメでしょ
内部実装はいつ変更されても文句言えない

77 :デフォルトの名無しさん:2013/11/01(金) 18:38:30.23
:tを使うのは食べログみる感じじゃない?
食べログで確認したとおりに二郎で注文したのに「うちはマシマシ禁止です」って
怒られたことがある

78 :デフォルトの名無しさん:2013/11/01(金) 18:39:25.32
・モジュールは、別のモジュールからインポートした型や関数を再エクスポートできる
・Data.Textは、Data.Text.Internalで定義されたTextという型を再エクスポートしている
・再エクスポートしても実体は一つ。同じ型
・textパッケージの作者から見ると、TextがInternalで定義されているというのは実装の詳細で、
 普通の利用者にはData.Textからインポートして欲しいと思っている
・ghciから見ると、作者の意図など知ったこっちゃないので、:tでは
 Textが実際に定義されているInternalモジュールを提示する

79 :デフォルトの名無しさん:2013/11/01(金) 18:53:41.07
C言語のヘッダファイルのような、モジュールの公開情報を知る方法ってないの?
型の定義とか、関数の型とか。
ドキュメントは古かったり間違ってたりするよね。ってのは偏見かなぁ。

80 :デフォルトの名無しさん:2013/11/01(金) 18:54:58.27
下手くそな比喩やめろ

81 :デフォルトの名無しさん:2013/11/01(金) 19:01:34.11
まだハスケルってあったの?
もうとっくに消えたかと思った。
C言語が流行ったときのパスカルみたいな存在だよねw

82 :デフォルトの名無しさん:2013/11/01(金) 19:04:07.57
連続して訳の分からない比喩が

83 :54:2013/11/01(金) 19:07:11.31
>>76
たとえば Text.XML.Cursor モジュールのドキュメントの content :: Cursor -> [Text] の項を見ると、
Text のリンクは Data.Text.Text ではなく、Data.Text.Internal.Text へ飛びます。

それが本当は Data.Text.Text を指していることは、今回ソースを読んだ >>69 の指摘でわかりました。

やはり型を知るにはソースを読まないといけないのが現状だと今回の件で認識しました。

それとも、もしかしてドキュメントのリンクがこのようになっているのは私だけでしょうか。
たとえば、ライブラリ(ドキュメント)のインストール順序によってはリンクがおかしくなるとか・・・

84 :デフォルトの名無しさん:2013/11/01(金) 19:34:26.81
>>74
>Data.Text.Internal.Text 型を使うのが掟破りで、
>Data.Text.Text 型を使うのが通常の方法という意味でしょうか。

そういうこと。Text.XML.Cursor.contentも、そうしてる。

ghciは自分の知ってる型の中から合致するものを報告するだけ。
(xml-conduit モジュールの作者の意図とは無関係)

>>83
もしかして、Data.Text.Internal.TextとData.Text.Textが違うものだと
思ってる?

本体はData.Text.Internal.Textに定義してあって、Data.Text.Textは
そのリンクだと思えば良いよ。
でも、ライブラリ作者がユーザーに使ってもらいたいのはリンク(Data.Text.Text)の方。

ghciは空気読めないから、その作者の意図に反して本体を示すことがある。
haddocで自動生成されるドキュメントも同じこと。

85 :デフォルトの名無しさん:2013/11/01(金) 19:39:14.03
>>83
>やはり型を知るにはソースを読まないといけないのが現状だと今回の件で認識しました。

極論を言えば、そういう場合もあるけど、今回の場合は”.Internal.”をみて、ユーザが
作者の意図を察してあげるのがプログラマ社会のルールだと思う。

86 :デフォルトの名無しさん:2013/11/01(金) 19:43:32.97
>>79
haddockドキュメントの中でで、英語で書いてある部分は全部無視して型情報だけ見ればいい
そこは自動生成なので古くならない

87 :54:2013/11/01(金) 21:15:01.08
>>84
> もしかして、Data.Text.Internal.TextとData.Text.Textが違うものだと
> 思ってる?

初めはそう思っていましたが、皆さんの指摘を受けて同じものだと知りました。

>>66 の時点で同じものだと知りましたが、ghci の :t を疑わなかったので、
同じ物のうちで TextとData.Text ではなく Data.Text.Internal の方を公開している
という勘違いをずっとしていました。
その勘違いも理解できました。

> 今回の場合は”.Internal.”をみて、ユーザが
> 作者の意図を察してあげるのがプログラマ社会のルールだと思う。

それなら仕方ありません。
私もそのように従うことにします。

みなさんアドバイスありがとうございました。

88 :デフォルトの名無しさん:2013/11/01(金) 22:33:25.63
Haskellにはモジュール化設計や抽象データ型といった
モダンな大規模開発向け機能が欠落しているのかね?

モジュール化設計機能を備えた言語であれば、
モジュールの外部仕様(interface)と実現方法(implement)を
分離できるから、ツール類で実装向けデータ構造と
ユーザ提供向けデータ構造を正しく認識できるから、
>>87みたいな:tコマンドやhaddockでの誤認識は起こりえない

また、抽象データ型機能を備えた言語であれば、
内部の実装向けデータ構造をユーザから完全に隠蔽できるから、
Data.Text.Internalみたいな実装向けデータ構造が
外部から見えてしまうという根本の問題が生じ得ない

Haskellは関数型言語研究の最新の成果を反映した先端言語という
ふれこみであるけれど、(結局は数学者/研究者向けの言語だから、)
ソフトウェア工学において大規模開発では必須と認められている
これらの機構が完全に無視されてているように見える

結論として、Haskellは研究や試作といった用途には適しているのかも
しれないけど、大規模開発&保守性を要求される産業界での
実用的な開発には不適格な言語ではないのかと考える

89 :デフォルトの名無しさん:2013/11/01(金) 22:42:07.77
>>88
日本語が変だったので、以下の段落を書き直す

>モジュール化設計機能を備えた言語であれば、
.... 中略 ....、
>>>87みたいな:tコマンドやhaddockでの誤認識は起こりえない


モジュール化設計機能を備えた言語であれば、
モジュールの外部仕様(interface)と実現方法(implement)を
分離できるから、ツール類でも実装向けデータ構造と
ユーザ提供向けデータ構造を正しく認識できるはず
(もしできないのであれば、ツールのバグか機能不十分と見なすべき)
結果として、>>87みたいな:tコマンドやhaddockでの誤認識は起こりえない

90 :デフォルトの名無しさん:2013/11/01(金) 23:14:33.52
あえてオブジェクト指向という言葉を避けているように見受けるが何かあるのか?

91 :デフォルトの名無しさん:2013/11/01(金) 23:20:37.34
Haskellはデータとプロシージャが分離してる

92 :デフォルトの名無しさん:2013/11/01(金) 23:30:10.81
インターフェースも実装も実体も同じ物2つをさして
見分けられないからモジュール性に優れてないってめちゃくちゃ言ってるな
単なるghcの不具合ってだけだろ

93 :デフォルトの名無しさん:2013/11/01(金) 23:36:58.05
>>88
>分離できるから、ツール類で実装向けデータ構造と
>ユーザ提供向けデータ構造を正しく認識できるから、
今回の例ではデータ構造は一つだからこれは当たらない

>また、抽象データ型機能を備えた言語であれば、
>内部の実装向けデータ構造をユーザから完全に隠蔽できるから、
もちろんHaskellでもこれはできる。でもtextパッケージはあえてやってない
一部の用途ではどうしても内部実装に踏み込みたいことがある
そういう場合に、実装を完全に隠蔽していたら、せいぜいソースをコピーして
パッチを当てるしか道がない
それよりは、「特殊用途向け」に.Internalモジュールを公開して、その代わり
これは内部実装だからマイナーバージョンアップで壊れるかもしれないよ、
気軽に使うなよ、と宣言しておくのがまだマシだという思想

94 :デフォルトの名無しさん:2013/11/01(金) 23:41:17.02
慣れれば一瞬でループを再帰に置き換えられるもんなの?

95 :デフォルトの名無しさん:2013/11/01(金) 23:41:53.15
>>90
モジュール化と抽象データの概念がソフトウェア工学研究の成果として
認知されたのが1970年代後半から1980年代
この頃に設計された Modula, Mesa, Ada といった言語には、これらの機能が備わっている
オブジェクト指向の概念が登場したのは、その後になる

つまり、オブジェクト指向という言葉を持ち出さずとも論証できるから、
というのが第一の理由


また静的型付け関数型言語である Standard ML(SML) は
オブジェクト指向の機構を一切持たない古い設計であるが、
完全なモジュール化と抽象データの仕組みを備えているから、
>>88,89の問題はどのSML処理系を利用していても現実に起きたことがない

つまり、SMLでも問題が生じないのだからオブジェクト指向とHaskellの問題は無関係
これが、オブジェクト指向という言葉を持ち出さない第二の理由

96 :デフォルトの名無しさん:2013/11/01(金) 23:43:10.97
>>94
効率を考えないなら書き換え自体は別に難しくないだろ
関わる変数を全て引数にするだけだし

97 :デフォルトの名無しさん:2013/11/01(金) 23:45:35.24
あと
>ソフトウェア工学において大規模開発では必須と認められている
>これらの機構が完全に無視されてているように見える
こういう明かな間違いを平気な顔で言うのは恥ずかしいから、
今後は入門書の一冊でも読んでから批判するのが良いと思う

98 :デフォルトの名無しさん:2013/11/01(金) 23:45:57.88
20年にわたるオブジェクト指向の実験は失敗に終わった
従来の構造化プログラミングと1980年代のsmalltalkからのアドバンテージがなかった

99 :デフォルトの名無しさん:2013/11/02(土) 00:01:44.35
>>92
どこにghcの不具合があるのか
ghcは正しくはどうするべきだったと思う?

100 :デフォルトの名無しさん:2013/11/02(土) 00:08:16.38
>>93
>今回の例ではデータ構造は一つだからこれは当たらない

>>93の後段では「一般用途向け(Data.Text.Text)」と
「特殊用途向け(Data.Text.Internal.Text)」という
二種類のデータ構造を提供していると書いてあるように読めるから、
矛盾していないかな?


>それよりは、「特殊用途向け」に.Internalモジュールを公開して、その代わり
>これは内部実装だからマイナーバージョンアップで壊れるかもしれないよ、
>気軽に使うなよ、と宣言しておくのがまだマシだという思想

こういったレイヤの異なる二種類のインターフェイスを提供するという考え方(思想)は、
決して間違いではないとは思う
ただし、SMLを含むモダンな言語のモジュール化機構では、
アプリケーション側で用途に応じて必要なモジュールだけをimportできる仕組みが、
言語仕様の一部として提供されている
結局、このレス(>>93)では、まともなモジュール化機構を持たないHaskellが
(形式的な理論ではなく)コード設計技法という小手先のテクニックで
モジュール化機能を模倣している、という説明にしかならない

これは、モジュール化機構を持たないJavaScriptが、コード設計技法と規約によって
モジュール化の基本である階層的名前空間を実現している実情と、よく似ている
そして、モジュール化機能がツールで支援できない点もHaskellと同様だ

101 :デフォルトの名無しさん:2013/11/02(土) 00:09:53.81
Haskellは静的型付けだからコンパイルできればおk
例外が出たときは書いた奴が悪い
GHCは何も悪くない

102 :デフォルトの名無しさん:2013/11/02(土) 00:14:04.22
>>97
間違っていると批判するのなら、>>97が正しいと考える
「大規模開発で必要とされる要素」を>>97自身が説明すべきではないのかな?
自らの意見を述べずに批判するだけなら、アホ民主党と何ら変わりがない

103 :デフォルトの名無しさん:2013/11/02(土) 00:15:07.76
>>100
>矛盾していないかな?
Data.Text.TextとData.Text.Internal.Textは同じ型。あらゆる文脈で交換可能
(なので単にTextと書くことにする)
二つのモジュールの違いは、Data.Text.InternalがTextの内部実装に
アクセスする手段を公開しているのに対し、Data.Textはそうしていないこと

>アプリケーション側で用途に応じて必要なモジュールだけをimportできる仕組みが、
>言語仕様の一部として提供されている
これは当然Haskellにもある。ユーザは必要に応じてData.TextかData.Text.Internalの
一方または両方をimportする
>>97を繰り返すけど、入門書の一冊でも読んでから批判するのを勧める

104 :デフォルトの名無しさん:2013/11/02(土) 00:16:38.24
Internalなどただの習慣にすぎない
exportしている関数は全部読めるだけだ
支障はない

105 :デフォルトの名無しさん:2013/11/02(土) 00:17:57.72
>>102
いや、「大規模開発で必要とされる要素」については異論はないよ
Haskellには(簡素だけどちゃんと機能する)モジュールシステムと
抽象データ型を定義するための仕組みがある、と言っている

106 :デフォルトの名無しさん:2013/11/02(土) 00:24:21.35
Text.ParsecをimportしてもText.Parsec.Stringで定義されているParserという型は使えない
Text.Parsecの中でText.Parsec.Stringをexportしていないから
それだけ

107 :106:2013/11/02(土) 00:28:08.61
訂正
module Text.Parsec
( module Text.Parsec.Prim

, module Text.Parsec.String

) where



import Text.Parsec.String hiding ( Parser, GenParser, parseFromFile )



108 :デフォルトの名無しさん:2013/11/02(土) 00:36:35.47
>>100
>アプリケーション側で用途に応じて必要なモジュールだけをimportできる仕組みが、
Haskellも特定モジュールのその上さらに特定データ型や関数のimportもできるけど
単に知らないだけだよね?君

109 :デフォルトの名無しさん:2013/11/02(土) 00:55:45.56
>>99
gccみたいにalias名も出す

110 :デフォルトの名無しさん:2013/11/02(土) 02:57:06.00
>>97
おれもHaskellはソフトウェア工学をかなり無視していると思う。
>>88 指摘は全く持ってそのとおり。
俺的にもpugsのオードリー・タンが大規模開発に成功したのはHaskellで(言語備え付けの機能を使わず)
構造化プログラミング(特に段階的詳細化法)をやったからだし。
Haskellは抽象データ型と実装の分離は一応できるものの、抽象データ型の利点であるはずのデータ構造を操作する手続きの
変更にやたら弱かった(はず)。

111 :デフォルトの名無しさん:2013/11/02(土) 03:02:09.98
抽象データ型の利点は関連コードの局所化と仕様と実装の分離で、Haskellはなぜか
データ構造はデータ構造、そのデータ構造の操作はデータ構造の操作で、データ型の定義とは
別のところで定義しないといけない。だから大規模開発は(抽象データ型の発展系である)
オブジェクト指向には劣ると思う。

112 :デフォルトの名無しさん:2013/11/02(土) 03:05:41.67
ただ、強い型付けのおかげで、JSP(ジャクソン流構造化プログラミング)には向いてる気がするんだよな。

113 :デフォルトの名無しさん:2013/11/02(土) 03:08:50.31
>>111
そもそも、そのデータ構造の定義とデータ操作を同じ場所に記述するというのが失敗だった件
必要なのは、データ構造の抽象化ではなく、操作の方の抽象化だったというオチ

114 :デフォルトの名無しさん:2013/11/02(土) 03:25:09.82
マイケルジャクソンは関係ないだろ

115 :デフォルトの名無しさん:2013/11/02(土) 03:43:20.24
思ったんだがピラミッドって誰が設計したんだろう?

116 :デフォルトの名無しさん:2013/11/02(土) 03:56:07.59
ソフトウェア工学ってオワコンじゃね?
いつの時代の話よ

117 :デフォルトの名無しさん:2013/11/02(土) 04:10:58.37
似非OOPなんて、継承の弊害でメッキ剥がれてるだろ
DIとかインターフェース指向設計とか十分に経験則もできたんだから次に行けよ
もう不要な親子・依存関係とか作る時点で大規模向いてないんだよ

118 :デフォルトの名無しさん:2013/11/02(土) 06:58:51.93
例えばC言語の場合は「公開ヘッダ」にData.Text.Textを定義して
「内部実装ヘッダ」にData.Text.Internalを定義して、
通常の利用者は公開ヘッダのみを用いてライブラリを使用でき、
特殊な利用者は内部実装ヘッダを用いてライブラリを使用できる。

だから今回のように「通常の利用者」が内部実装で使われている型を目にして混乱することはない。

でもHaskellでは「通常の利用者」に対しても内部実装ヘッダが公開されてしまうので、
今回のように内部実装を必要としない利用者に内部実装の型が公開されることで
:t の結果も内部実装向けの型を返すようになり混乱を招いている。

以上。

119 :デフォルトの名無しさん:2013/11/02(土) 08:01:17.68
>>113
操作の方の抽象化とはなんのことだ?
抽象化、抽象化というがなんのために抽象化するかと言えば関連コードの局所記述を可能にするためだぜ。

120 :デフォルトの名無しさん:2013/11/02(土) 08:03:10.07
>>118
>例えばC言語の場合は「公開ヘッダ」にData.Text.Textを定義して
>特殊な利用者は内部実装ヘッダを用いてライブラリを使用できる。
内部実装ヘッダを用いてって
内部実装外にAPI晒して内部実装用ヘッダも公開してますってなら同じだろ
頭悪すぎる

121 :デフォルトの名無しさん:2013/11/02(土) 08:04:30.09
>>119
逆だろうが
抽象化は実装を外部に追い出すためだろ
一緒に書いてどうすんだよ

122 :デフォルトの名無しさん:2013/11/02(土) 08:13:30.03
>>121
あ、ごめん。そうだわ。

123 :デフォルトの名無しさん:2013/11/02(土) 08:16:12.00
寝ぼけて抽象データ型の話とごっちゃにしてしもうた。

124 :デフォルトの名無しさん:2013/11/02(土) 08:28:00.46
>>110
>Haskellは抽象データ型と実装の分離は一応できるものの、抽象データ型の利点であるはずのデータ構造を操作する手続きの
>変更にやたら弱かった(はず)。
いやそんなことないと思うけど
具体例があればくれ

125 :デフォルトの名無しさん:2013/11/02(土) 08:30:07.73
>>109
Textが再エクスポートされてるモジュールを全部列挙しろってこと?
:tで何か聞かれるたびにそれをするのは非現実的だろ

126 :デフォルトの名無しさん:2013/11/02(土) 08:35:35.38
>>118
今回の問題では、利用者がData.TextとData.Text.Internalのどちらもインポートしていない
(もしインポートしていたら、ghciはData.Text.Internal.Textじゃなくて単にTextと答える)
だからghciにとってはどっちのモジュール名を使えば良いのか決められない
たまたま今の実装が、その型が定義されているモジュールの名前を返すようになってるというだけ

127 :デフォルトの名無しさん:2013/11/02(土) 08:54:12.87
俺も今回の問題は単なる >>126 だと思う。
今回の件に限れば、これがコンパイル時に問題になることはない。

モジュール化設計機能や抽象データ型機能のレベルが
CやJavaなどで開発してきた者にとっては期待するほど高くない、
あるいはやや趣が異なり戸惑うというのはわかるが、
その根拠として今回の問題を挙げるのは的はずれだと思う。

128 :デフォルトの名無しさん:2013/11/02(土) 08:55:06.02
>>126
間接的にでもData.Text.Internalが読み込まれている時点でおかしい
他のモジュール化が可能な言語ならData.Text.Internalがライブラリの外側まで漏れることはない

129 :デフォルトの名無しさん:2013/11/02(土) 09:02:40.94
関数型は一言で表すと古くて新しい言語あるいは新しくて古い言語
一般的な言語しか触ったことない奴には関数型は新しく感じるけど
既に歴史自体結構長いし他の言語はどんどん新しい概念取り入れてるけどそこらへんはかなり昔のままだから古臭く感じる

130 :デフォルトの名無しさん:2013/11/02(土) 09:04:14.36
>>128
こいつHaskellのこと何もわかってないだろ

131 :デフォルトの名無しさん:2013/11/02(土) 09:08:51.69
ghciは実行時にリンクするからそう評価するだけじゃね
よくわからんけど
つか、hugsではどうなの?
インタプリタ専門だからその辺頑張ってそうだけど

132 :デフォルトの名無しさん:2013/11/02(土) 09:21:02.33
>>129
モジュール化に関してはOCamlのが先進的機能たくさんあるわ
本当にOO言語その他をひと通り触ってたらそんな事言わねえよ
さっきからイメージだけで語ってんじゃねえよ

133 :デフォルトの名無しさん:2013/11/02(土) 09:27:56.67
先進的?

134 :デフォルトの名無しさん:2013/11/02(土) 09:49:01.45
>>128
GHCから見ればInternalモジュールも公開されたインタフェースの一部だよ
これをtextが意図的にやってるのは>>93の通り

135 :デフォルトの名無しさん:2013/11/02(土) 10:26:39.84
>>134
他の言語を使ったことがない人には理解できないかもしれないが、
普通の言語は内部実装を公開したい場合は公開相手を選べるんだよ
今回みたいに一般の利用者まで巻き込んで可視範囲を広げるようなことはしない

だから「内部実装に触りたい人もいるから初期設定で全員に内部実装を公開してる」ってのは言い訳になってない

136 :デフォルトの名無しさん:2013/11/02(土) 10:40:03.16
hackage.haskell.org/package/text/docs/Data-Text-Internal.html
hackage.haskell.org/package/text/docs/Data-Text.html
これ読めば全部わかるじゃん
ドキュメント読まない奴が悪いんじゃないの結局

137 :デフォルトの名無しさん:2013/11/02(土) 10:52:01.76
>>135
可視範囲は広がってなんかないよ
今回はData.Text.TextもData.Text.Internal.Textもスコープの外
ghciは気を効かせてスコープの外の名前を無理矢理表示している
何も表示しないよりはマシ

138 :デフォルトの名無しさん:2013/11/02(土) 10:52:32.75
ドキュメント読まないというよりHaskellのモジュールシステムを理解してない

139 :デフォルトの名無しさん:2013/11/02(土) 11:57:07.82
>>138
では、理解できるように資料などがありましたら教えてください

140 :デフォルトの名無しさん:2013/11/02(土) 12:16:12.25
>>111
関数だけでなくADTが必要という理論は
関数とデータ構造を区別するという前提がなければ成立しない

例えば関数と変数の名前空間を分ける言語とか
無名のデータ構造はあるけど無名関数がない言語とかはADTがないと駄目かもしれない
が、前提条件を満たさないものが劣っているというのは理論的にいえることではない

141 :デフォルトの名無しさん:2013/11/02(土) 12:18:26.49
>>139
http://www.haskell.org/onlinereport/haskell2010/haskellch5.html#x11-980005

142 :デフォルトの名無しさん:2013/11/02(土) 12:38:28.41
Javaとかのウンコ言語信者が
1ミリも理解できてないHaskellを何故かdisってる、
って理解でOK?

143 :デフォルトの名無しさん:2013/11/02(土) 12:49:50.84
SML信者じゃね

144 :139:2013/11/02(土) 13:17:31.74
>>141
ありがと。

145 :デフォルトの名無しさん:2013/11/02(土) 14:09:33.91
classには変数と関数があったけど
interfaceは関数しかなくなったので
「関数だけでは物足りないよね」っていうマーケティングが効かなくなった

146 :デフォルトの名無しさん:2013/11/02(土) 14:41:53.11
>>144
ありがとって、これ言語仕様じゃん
訊く前に真っ先に調べるモンちゃうの?
Haskellの仕様について深く議論しようとしてるんだし

147 :デフォルトの名無しさん:2013/11/02(土) 17:25:16.10
Javaの信者なんているわけないだろ
どんな人生送ってたらそんな発想になるんだ

148 :デフォルトの名無しさん:2013/11/02(土) 18:46:43.24
>>135
ちょっとその普通の言語でtextと同じ仕組みで型を公開しつつ可視範囲を限定できるコード書いてよ

149 :デフォルトの名無しさん:2013/11/02(土) 18:48:24.41
もしも多数決と順張りだけで勝ち続ける人生だったらJavaの信者になるかな

150 :デフォルトの名無しさん:2013/11/02(土) 18:50:16.82
そもそも用語の定義があいまいだからな
可視範囲って何だよ

151 :デフォルトの名無しさん:2013/11/02(土) 18:55:57.33
scopeの訳語じゃないの

152 :デフォルトの名無しさん:2013/11/03(日) 01:10:04.05
変数持続期間と違うの?

153 :デフォルトの名無しさん:2013/11/03(日) 01:24:07.34
>>142
みんな勘違いしてるけど、javaはオブジェクト指向ではない
javaをオブジェクト指向だと言うなら、Cもオブジェクト指向と言うべき
オブジェクト指向の例であげるなら smalltalkにすべき
メッセージパッシングに注目するなら erlang にすべき

154 :デフォルトの名無しさん:2013/11/03(日) 02:04:07.95
地球のオブジェクト指向は未熟だ。javaもC++もsmalltalkもerlangも。

155 :デフォルトの名無しさん:2013/11/03(日) 02:15:24.71
この星において地球外生命体の方はブラケットを用いて
(きこえますか…きこえますか…)
とあなたの心に直接呼びかけるのがマナーです

156 :デフォルトの名無しさん:2013/11/03(日) 02:26:24.79
わたしのなまえはスターシア

157 :デフォルトの名無しさん:2013/11/03(日) 02:33:25.74
トミーリージョーンズの声で再生される

158 :デフォルトの名無しさん:2013/11/03(日) 05:40:03.82
はじめまして、初書き込みです
現在hintと haskell-src-extsを使ったhaskellプログラムを書いているのですが、どうもうまくいきません
http://d.hatena.ne.jp/keigoi/20100125/1264411453
にあるサンプルを参考にしているのですが実行するとエラーを吐かれます
調べたところ、どうやらLanguage.Haskell.InterpreterモジュールのloadModules関数が悪さしているみたいです
そういえばhintをcabal installした時
Warning: Language.Haskell.Interpreter: could not find link destinations for:
Hint.Base.FromSession Hint.Base.ModifySessionRef Hint.Base.RunGhc
と言われました
何か関係しているのではと調べましたが原因は掴めないままです
同じとこでハマってる人いませんか

159 :デフォルトの名無しさん:2013/11/03(日) 06:24:19.90
ちなみに各バージョンは
ghc-7.4.2
hint-0.3.3.7
cabal-install 1.16.0.2
Cabal library 1.16.0.3
Mac OS X 10.9
です

160 :デフォルトの名無しさん:2013/11/03(日) 08:35:05.82
>>158
試してみたけどparseModeの型が変わっててコンパイルできない
>Warning: Language.Haskell.Interpreter: could not find link destinations for:
>Hint.Base.FromSession Hint.Base.ModifySessionRef Hint.Base.RunGhc
>と言われました
これはhaddockの警告だから無視して良い

161 :デフォルトの名無しさん:2013/11/03(日) 09:37:56.05
>>158
ParseModeのところを直して、
H.set [H.languageExtensions H.:= [H.ImplicitParams]]
の行をコメントアウトしたら動いた

162 :デフォルトの名無しさん:2013/11/03(日) 12:02:31.92
ghciの:tはどういう仕組みで型を調べているのでしょうか?

   import qualified Data.Text as T

   content :: Cursor -> [T.Text]

と書いてあるのに、:t contentで型を調べると

   content :: Cursor -> [Data.Text.Internal.Text]

になります

163 :デフォルトの名無しさん:2013/11/03(日) 12:27:14.55
www.haskell.org/ghc/docs/latest/html/users_guide/ghci.html
どうぞ

164 :デフォルトの名無しさん:2013/11/03(日) 12:28:11.58
>>162
ghcは内部的にはあらゆる型をそれが定義されたモジュールと合わせて区別する
xml-conduitをコンパイルした時点で、xml-conduit内の関数それぞれの型が
hiファイルに記録される。たとえば
content :: Text.XML.Cursor.Cursor -> [Data.Text.Internal.Text]
みたいに型情報が入ってる。(hiファイルはghc --show-ifaceで読める)
ghciは、これを読んで、なるべく分かり易いように表示する
Text.XML.Cursor.Cursorは、スコープにある型なので、単に「Cursor」と表示する
Data.Text.Internal.Textは、スコープにないので、そのまま「Data.Text.Internal.Text」になる

165 :デフォルトの名無しさん:2013/11/03(日) 12:34:55.62
>>164
わかりやすい

166 :デフォルトの名無しさん:2013/11/03(日) 12:43:45.19
自演乙
>>162
>>164
>>165

167 :デフォルトの名無しさん:2013/11/03(日) 12:51:12.74
なんでも自演に見えるのは病気だよ

168 :デフォルトの名無しさん:2013/11/03(日) 12:53:08.69
自演だろうと、そうでなかろうと、どういう文体だろうとどうでもいい

情報だけが大事

手紙じゃないんだから

169 :デフォルトの名無しさん:2013/11/03(日) 12:55:57.70
いや、昨日の自演の続きかと思って

170 :デフォルトの名無しさん:2013/11/03(日) 13:05:53.98
自演乙
本人乙

常套句でつね

171 :162:2013/11/03(日) 13:18:18.23
>>163
全部調べましたがどこにも":t"の仕様に関する情報はありませんでした

>>164
> たとえば
> content :: Text.XML.Cursor.Cursor -> [Data.Text.Internal.Text]
> みたいに型情報が入ってる。

ソースコードには
   import qualified Data.Text as T
   content :: Cursor -> [T.Text]
と書いてあるのに、なぜ
   [Data.Text.Internal.Text]
として型情報が記録されるのかがわかりません。

172 :デフォルトの名無しさん:2013/11/03(日) 13:24:27.16
それはそうとぉ、 :l *Main.hs、:m *Module みたいにしてやるとぉ、
:tでちゃんと型だけの表示になると思うんだけどぉ、俺の環境だけかなぁ?
みんなも試してみてよぉ

173 :デフォルトの名無しさん:2013/11/03(日) 13:35:53.92
>>171
T.Textは、Data.TextからエクスポートされているTextという名前を参照する構文
で、Data.TextがエクスポートするTextは何かと言うと、
Data.Text.Internalで定義されたTextという型(これはData.Textのhiファイルに書いてある)
Data.Textのソースを見れば、Data.Text.InternalからインポートしたTextを
そのままエクスポートしてるのが分かる

174 :デフォルトの名無しさん:2013/11/03(日) 13:45:36.05
>>173

俺は >>162 とは別人だが、ちょっと質問。

content :: Cursor -> [T.Text] の
Text.XML.Cursor.Curdor 型の方はなぜ
Text.XML.Cursor.Generic.Cursor と表示されない?

175 :174:2013/11/03(日) 13:48:20.91
>>173
あ、ごめん、分かった

Text.XML.Cursor.Curdor 型の方は
type Cursor = CG.Cursor Node と型シノニムが定義されて、
それがエクスポートされているからか

176 :162:2013/11/03(日) 14:52:09.40
>>173
ようやくわかったよありがとう。
Haskell何も知らん人に丁寧に教えてくれてありがとうw

177 :デフォルトの名無しさん:2013/11/03(日) 16:06:44.34
結局既存のプログラムを置き換えようとすると
手続きっぽく書くことになるのかな

178 :デフォルトの名無しさん:2013/11/03(日) 16:23:23.81
どんなプログラムでも関数的な書き方と手続き的な書き方の混合になるよ
混合比はプログラムの種類によって違うけど、手続き一辺倒になることは滅多にない

179 :デフォルトの名無しさん:2013/11/03(日) 16:28:29.29
そそ、結局ラムダになるよね、基本

180 :デフォルトの名無しさん:2013/11/03(日) 16:36:58.18
例えば編集距離を求めるコードはこうなる

levenshtein2 sa sb = last $ foldl transform [0..length sa] sb
 where
  transform xs@(x:xs') c = scanl compute (x+1) (zip3 sa xs xs')
   where
    compute z (c', x, y) = minimum [y+1, z+1, x + fromEnum (c' /= c)]

181 :デフォルトの名無しさん:2013/11/03(日) 16:58:16.40
>>179
関数ポインタを持ってるC言語こそが本当の関数型ということになる

182 :デフォルトの名無しさん:2013/11/03(日) 18:02:54.79
>>181
C言語が持てる関数ポインタの数はソースにより上限が決まる
本当の関数型なら有限のソースから無限に異なる関数を生成できる

突き詰めると、関数に必ず名前をつける言語は本当の関数型ではないってこと

183 :デフォルトの名無しさん:2013/11/03(日) 18:23:32.74
>>182
C言語は、引数としての関数の記述には制限はない

184 :デフォルトの名無しさん:2013/11/03(日) 19:27:28.45
C言語が実際には関数型かどうかなんて、このスレ的にはどうでもいいこと
Haskellの話とは何の関係もない
(C言語が関数型だろうと、Haskellには何の影響も及ぼさない)

新しくスレを作ってそちらで大いに議論してもらいたい

185 :デフォルトの名無しさん:2013/11/03(日) 19:35:49.74
void *(*f)(void *(*)(void *(*)(void *(*)(void *(*)(void *(*)(void *(*)(void *(*)(...))))))));

こういうのって何段まで書けたっけ

186 :デフォルトの名無しさん:2013/11/03(日) 19:38:13.35
>>184
Haskell言語の特徴として関数型言語であることを挙げるのはやめるべき
より純粋な関数型言語のCがあるんだから

187 :デフォルトの名無しさん:2013/11/03(日) 19:41:09.92
やめるかどうかはともかく、関数型という一面が強調されすぎの感はある

188 :デフォルトの名無しさん:2013/11/03(日) 20:05:30.63
でかい釣針だな。
http://ja.wikipedia.org/wiki/%E9%96%A2%E6%95%B0%E5%9E%8B%E8%A8%80%E8%AA%9E
から抜粋
>手続き型プログラミングなどにおける「関数」ではないことをまず注意する。

189 :デフォルトの名無しさん:2013/11/03(日) 20:10:06.02
>>184
> (C言語が関数型だろうと、Haskellには何の影響も及ぼさない)

ダウト
関数型言語のシェアという点では関数型言語Haskellに大いに関係ある話題である

190 :デフォルトの名無しさん:2013/11/03(日) 20:10:29.19
ならモナドやめろって話だよ

191 :デフォルトの名無しさん:2013/11/03(日) 20:22:57.55
モナドは型クラスだから
曖昧なパラダイムや変動するシェアによって定義が変わることはない
そういう影響は受けない

192 :デフォルトの名無しさん:2013/11/03(日) 20:47:59.08
モナドなんて構造の一つの表現にすぎないだろ
べつにHaskellに限った仕組みじゃなし

193 :デフォルトの名無しさん:2013/11/03(日) 21:29:41.73
手続きとかいう曖昧な言葉を厳密な型であるIOモナドで表現した

人間が手続きを差別したり見下したりする必要はなくなり
コンパイラが機械的にチェックすればいいだけになるはずだった

194 :デフォルトの名無しさん:2013/11/03(日) 22:46:38.09
haskellから遅延評価を排除したら何が残る?ラムダも破綻するだろ?

195 :デフォルトの名無しさん:2013/11/03(日) 22:52:31.32
>>194
データ操作をデータ構造が分離した近代言語

196 :デフォルトの名無しさん:2013/11/03(日) 23:08:35.29
>>189
Haskellのシェアも、このスレではどうでもいい
なんでそんな話をする?

この言語を使って実際にプログラムする事に関係ある話をしろよ

197 :デフォルトの名無しさん:2013/11/03(日) 23:12:57.59
>>196
Haskellを使って実際にプログラミングするためには、機械語のレガシーソフトすら存在する現場において、Haskellの有用性と位置付けと言語的特徴を他の言語と比較して説明しなければならない

実際の労力に換算したら、その説得こそがHaskellプログラミングと言える

198 :デフォルトの名無しさん:2013/11/03(日) 23:26:30.51
>>197
そういう事なら、他の言語と比較する事を手段として、
「Haskellの有用性と位置付けと言語的特徴」の話をちゃんとしてほしい

関数型とか手続き型とか、より純粋な関数型言語とか、
そんな名称の定義は一定していないし、綺麗に分けられるものではないのだから、
たとえば「Haskellは**をするのに〜〜と書ける」というような
実際のプログラミングで優位性や特徴を語るべきだと思う

それと、シェアの話しならマ板でやってほしい

単なる一住人のわがままなので、これ以上は何も言わないでおく

199 :デフォルトの名無しさん:2013/11/03(日) 23:33:22.04
>>198
実際の現場では、名称の定義も綺麗な分類も必要ない
特にクライアントに納入するコードの説得に必要なのは、シェアの話以外にない

200 :デフォルトの名無しさん:2013/11/03(日) 23:42:01.94
>>199
そういうのはいつだって自慢話に帰着して終了なんだけど。

201 :デフォルトの名無しさん:2013/11/04(月) 00:43:46.57
今まで一部の人間がひっそりと優越感に浸りながらオナニーしてたけど
馬鹿に見つかってしまって必死にその世界を守ってるという言語

202 :デフォルトの名無しさん:2013/11/04(月) 00:49:29.58
と馬鹿が申しております

203 :デフォルトの名無しさん:2013/11/04(月) 01:56:19.33
>>199
もし仮にコンピュータ言語のことで自慢できる立場の人がこのスレを見てるなら、スレ関係なくどんどん書きこんでほしいと思うのは俺だけか

204 :デフォルトの名無しさん:2013/11/04(月) 06:55:18.40
>>194
型クラス、軽量スレッド、do記法、純粋性、ユーザ定義演算子、STM…
挙げればきりがない

205 :デフォルトの名無しさん:2013/11/04(月) 07:12:28.92
javascriptの悪口なんて誰も言ってないのに何でHaskellを叩くのだろうか
UHC,Fay,GHCJSとかあるのに

206 :デフォルトの名無しさん:2013/11/04(月) 07:28:16.61
オナニー言語

207 :デフォルトの名無しさん:2013/11/04(月) 07:32:24.20
袋入り食パンのあれ、バッグクロージャって言うらしいね
どことなく関数型ぽくね?

208 :デフォルトの名無しさん:2013/11/04(月) 08:11:05.74
つまりクロージャもラムダも高階関数もあるJavaScriptは関数型かつオナニー言語ってことだな

209 :デフォルトの名無しさん:2013/11/04(月) 08:18:41.17
閉包ー閉包ー関数が好きー

210 :デフォルトの名無しさん:2013/11/04(月) 08:25:33.47
>>198
自分が気に入らない話題の時は黙ってスルーするだけでなく
「俺の好きな話題以外は一切出すな!」って

大丈夫か?
社会生活的に。

211 :デフォルトの名無しさん:2013/11/04(月) 08:37:32.13
自演評価

212 :デフォルトの名無しさん:2013/11/04(月) 11:54:30.30
>>205
>javascriptの悪口なんて誰も言ってないのに
えっ
>JavaScript sucks. The depths to which JavaScript sucks is well-documented and well-understood.……
http://www.haskell.org/haskellwiki/The_JavaScript_Problem

213 :デフォルトの名無しさん:2013/11/04(月) 12:07:51.38
遅延評価だけに後回し後回しの人生です

214 :デフォルトの名無しさん:2013/11/04(月) 12:16:34.21
>>213
Haskellは必要なときには過不足なく仕事してるんだよ

お前は必要な時もサボってるだろ

215 :デフォルトの名無しさん:2013/11/04(月) 12:22:38.14
ここはHaskellで書くスーパーハッカー的プログラムを公開するスレです

216 :デフォルトの名無しさん:2013/11/04(月) 12:32:59.81
>>215
そう言うあなたがスーパーハッカー的プログラムを一切公開しない理由を説明してほしいです

217 :デフォルトの名無しさん:2013/11/04(月) 14:16:01.11
よくいるよね
高価な文房具を買いそろえ、勉強はあまりしない
高価なギターやエフェクター類をそろえるが練習しない

218 :デフォルトの名無しさん:2013/11/04(月) 14:22:23.79
10年ぐらいたって突然それらが遅延評価されて練習が始まるのです

219 :デフォルトの名無しさん:2013/11/04(月) 14:56:47.74
ワロスwwwww

220 :デフォルトの名無しさん:2013/11/04(月) 15:29:14.44
遅延評価とか言ってる割には

fib n = fib(n-2) + fib(n-1)
fib 1 = 1
fib 2 = 1

とかできなくて残念な言語

221 :デフォルトの名無しさん:2013/11/04(月) 15:47:35.09
>>220
試してみたら普通に動いたよ

222 :デフォルトの名無しさん:2013/11/04(月) 15:55:52.45
>>221
この定義の順番では「Pattern match(es) are overlapped」でまともに動きません。
fib 1 と fib 2 の定義を fib n の定義より先に書けば動きます。

>>220 は「遅延評価」をなにか別のものと勘違いしているか、
勝手に拡大解釈して期待してたのに思い通りにならなくて落胆しているか、どちらかです。

223 :デフォルトの名無しさん:2013/11/04(月) 16:03:31.69
>>220
ご覧の通り

ghci>:{
Prelude| let {
Prelude| fib 1 = 1;
Prelude| fib 2 = 1;
Prelude| fib n = fib (n-2) + fib (n-1)
Prelude| }
Prelude| :}
ghci>fib 1
1
ghci>fib 2
1
ghci>fib 3
2
ghci>fib 4
3
ghci>fib 5
5
ghci>fib 6
8
ghci>fib 10
55
ghci>fib 100
^Z
[1]+ 停止

224 :デフォルトの名無しさん:2013/11/04(月) 16:36:21.66
欠陥を指摘してドヤ顔しようとしたら言語の基本を知らなかっただけの>>220が涙目すぎてつらい

225 :デフォルトの名無しさん:2013/11/04(月) 16:40:46.50
なんかすごい深い話かと思って二度見したわ
パターンマッチの規則も知らん奴に涙目とか言われても反応に困る

226 :デフォルトの名無しさん:2013/11/04(月) 16:55:30.00
Backpack: retrofitting Haskell with interfaces
research.microsoft.com/en-us/um/people/simonpj/papers/modules/

へーHaskellのモジュールシステムってそんなに弱いんだー
知らなかったー

227 :デフォルトの名無しさん:2013/11/04(月) 19:03:28.46
メモ化の話を蒸し返してきたのかと思ったらそれ以前の関数型ワナビだった

228 :デフォルトの名無しさん:2013/11/04(月) 19:42:59.03
SMLやOCamlに比べればモジュールシステムが弱いのは有名
かと言って強いモジュールシステムが欲しいという声もそんなに聞かないけど

229 :デフォルトの名無しさん:2013/11/04(月) 19:50:47.10
>>228
確かにmoduleシグネチャは強力だけど
ocamlはocamlでコンパイル順序の問題があるからな・・・

230 :デフォルトの名無しさん:2013/11/04(月) 19:57:14.35
>>217
やめろ!

231 :デフォルトの名無しさん:2013/11/04(月) 20:00:20.72
>>217
逆に色々不完全な奴ほど精力的だよな。
脳が不完全で矛盾だらけなやつほど行動力がある。

232 :デフォルトの名無しさん:2013/11/04(月) 20:02:02.66
遅延するし必要なときは仕事するけど、不要な時も暇なら気まぐれで仕事するよって機構はないの?
ガベコレにいいと思うんだ

233 :デフォルトの名無しさん:2013/11/04(月) 20:24:42.41
ガベコレは最近は排除の流れだがよろしいか

234 :デフォルトの名無しさん:2013/11/04(月) 20:37:01.15
目の前の戦いに集中するのが完璧に正解
戦いが終わった後のために買い物したらどうなるか気付かない奴は不完全

235 :デフォルトの名無しさん:2013/11/04(月) 20:54:19.29
>>234
つまり極論すれば知識や経験などは余計な物というわけですね。

236 :デフォルトの名無しさん:2013/11/04(月) 21:28:54.99
必要だから持ってる知識と、ただ何となく持ってる知識を区別しない

237 :デフォルトの名無しさん:2013/11/04(月) 22:02:37.50
replで
let result = f x -- fは何か物凄く重い処理
とやって、すぐにプロンプトが帰ってきたので、haskellスゲーと思って、resultの中身みたら長々と重い処理が始まった

これが遅延評価

238 :デフォルトの名無しさん:2013/11/04(月) 22:03:02.68
knowledge is not orange.

239 :デフォルトの名無しさん:2013/11/04(月) 22:59:28.85
a = [0, [1, [2, null]]];
a[1][1][1] = a;
循環するデータ構造を作りたいとき
遅延評価がないとnullと代入が出てくる

240 :デフォルトの名無しさん:2013/11/04(月) 23:31:37.28
ふむ

241 :デフォルトの名無しさん:2013/11/05(火) 08:24:52.57
>>237
これマルチコアプログラミング時の落とし穴なんですよね
リワハざっと読みましたけど

242 :デフォルトの名無しさん:2013/11/05(火) 11:22:49.67
Futureとは違う

243 :デフォルトの名無しさん:2013/11/05(火) 12:13:31.95
deepsecしましょ

244 :デフォルトの名無しさん:2013/11/05(火) 15:24:04.13
Haskell Platform 2013.4.0.0 のリリース予定昨日だったけど遅れてんのかな

245 :デフォルトの名無しさん:2013/11/05(火) 17:52:50.61
Haskell Platform のリリースが予定から遅れるなんていつもの事

246 :デフォルトの名無しさん:2013/11/05(火) 23:09:14.28
リリースも遅延評価なので

247 :デフォルトの名無しさん:2013/11/06(水) 01:58:38.62
今まで開発さぼってたんかい!

248 :デフォルトの名無しさん:2013/11/06(水) 04:59:36.76
バグの追求に時間がかかっているんだよ。
オナニー言語らしいじゃないか。

249 :デフォルトの名無しさん:2013/11/06(水) 07:55:25.42
人ば…アーリーアダプター言語らしい

250 :デフォルトの名無しさん:2013/11/08(金) 21:15:33.74
正式版をリリースした後にキャンセルして、一ヶ月後にβ版からリリースし直した言語もあるんですよ!

251 :デフォルトの名無しさん:2013/11/08(金) 23:16:48.08
AnyやAllの用途って何ですか?

252 :デフォルトの名無しさん:2013/11/08(金) 23:59:41.00
Anal の用途なら分かるのだが…

253 :デフォルトの名無しさん:2013/11/09(土) 00:44:19.30
リスト以外のデータ構造をFoldableにしてfoldMapしたりするんじゃないの?
http://hackage.haskell.org/package/base/docs/Data-Foldable.html

254 :デフォルトの名無しさん:2013/11/10(日) 23:44:51.91
ThreadScopeでCPU(コア)の使い方を調べている時、
グラフのどの部分がプログラムソースのどの辺りの計算をしている時のものか
予想がつく場合もあれば、なかなか分からない場合もあります。

プログラムソースの中に、なにか目印を付けて、イベントログにその情報を出力し、
ThreadScopeで見た時にその目印がグラフ上に表示されるような事はできるでしょうか。

255 :デフォルトの名無しさん:2013/11/11(月) 20:20:01.92
>>254
Debug.Trace.traceEvent

256 :デフォルトの名無しさん:2013/11/11(月) 20:54:46.28
>>255
ありがとうございます。

これで作業がはかどります。

257 :デフォルトの名無しさん:2013/11/11(月) 23:33:16.27
Codec.Image.DevIL パッケージの Codec.Image.DevIL.writeImage 関数について質問です。

この関数で画像ファイルを出力するとき、すでに同じパスのファイルが存在すると、
上書きされずに関数から返ってきます。
エラーも何も起こりません。

新しい画像データで上書きしたように見せかけるには、
もしすでに同じパスのファイルが存在するなら、この関数を使う前に
そのファイルを削除しておくという方法があります。

しかしこの場合、もし writeImage 関数の内部で何かエラーが起きて関数が中断されても、
先に消したファイルは取り戻せません。

writeImage 関数で上書きするもっと良い方法はないでしょうか。
このパッケージの使用はあきらめて、別の画像書き込み用パッケージを探すべきでしょうか。

258 :デフォルトの名無しさん:2013/11/11(月) 23:37:29.60
>>257
ファイルを別名に変えればいいじゃん。

259 :デフォルトの名無しさん:2013/11/12(火) 00:20:45.95
>>258
アドバイスありがとうございます。

不格好ではありますが、幾分マシになったと思います。
リネームする方法を採用してみます。

260 :デフォルトの名無しさん:2013/11/13(水) 00:41:35.89
Stateモナドを使う典型的な場合ってどういう場合でしょうか?
乱数関数を使うときというような例はよく出てくるのですが、もっと効果がはっきりした
使用例を知りたいのですが

261 :デフォルトの名無しさん:2013/11/13(水) 01:22:02.64
>>260
カウンタ

262 :デフォルトの名無しさん:2013/11/13(水) 12:49:22.82
ghc-modがcabalのsandboxの中のモジュールを認識してくれない
なんか設定加える必要あるの?

263 :デフォルトの名無しさん:2013/11/13(水) 15:04:46.39
>>261
なるほど。ありがとうございます。カウンタは小さいが典型的ということでしょうか。
ただカウンタの例だと、Stateモナドってその程度のものかとも思ってしまうのですが、
これぞという使用例はないでしょうか?

264 :デフォルトの名無しさん:2013/11/13(水) 15:59:02.30
局所的環境があると思えば、わざわざ引数を書かなくて済むから楽できるということでは
使うStateに別名をつけるとわかりやすいか
俺はプログラミング初心者なんでよくわかりませんが

265 :デフォルトの名無しさん:2013/11/13(水) 17:09:26.45
get put modify runStateつかって具体的に教えてください

266 :デフォルトの名無しさん:2013/11/13(水) 17:30:38.41
初心者なんで無理です
とりあえず練習にゴミみたいなのを書きました

import Control.Monad.State
import Data.List
import Data.Maybe

type ListState = State [Int]

main :: IO ()
main = print $ evalListState [3,6,2,7,1,8,0,9,5]

evalListState :: [Int] -> [[Int]]
evalListState a = evalState (mapM f a) []

f :: Int -> ListState [Int]
f x = g x >> get >>= return

g :: Int -> ListState ()
g x = get >>= \ys -> do put $ x : ys; modify sort

267 :デフォルトの名無しさん:2013/11/13(水) 23:49:38.29
ローカルで hoogle を動かそうとしています。

hoogle data --local
hoogle server --local

として稼動させたのですが、ドキュメントのパスにパーセントエンコードが含まれる場合に File not found となるようです。
http://gazo.shitao.info/r/i/20131113234831_000.png
パーセントエンコードが含まれないパスなら問題ありませんでした。
これは何か設定上の問題でしょうか? それとも hoogle のバグでしょうか?
バグだとしたら src/Web/Server.hs あたりのどこかで urlDecode をかませばよさそうに思いますが…。
解決策をご教示いただければ助かります。

268 :デフォルトの名無しさん:2013/11/14(木) 01:40:23.20
異なる型を同一のリストに入れる方法を探しています

例えば
foo :: Int -> Int -> Int
bar :: Int -> Int
とした時、この二つの関数を同じリストに入れるというわけです
そのままリストに入れても弾かれるので両者を包むような型を作ろうと思いました

data Func = F (Int -> Int -> Int) | B (Int -> Int)

というデータ型を定義すれば
[F foo, B bar]
というリストが一応できます
しかしその中身は取り出せません
test (F f) = f
test (B b) = b
このような関数は定義できません、考えれば当然のことですが

一つのリストに入れ、その中身を取り出すような方法はないでしょうか?

269 :デフォルトの名無しさん:2013/11/14(木) 03:21:12.40
data Func = F (Int -> Int) | B Int
foo :: Int -> Func
bar :: Int -> Func
[(Int -> Func)]

でどうでしょうか?

270 :デフォルトの名無しさん:2013/11/14(木) 07:41:00.40
{-# LANGUAGE FlexibleInstances, InstanceSigs #-}

data Func = F (Int -> Int -> Int) | B (Int -> Int)
class Foo a where
test :: Func -> a

instance Foo (Int -> Int -> Int) where
test :: Func -> (Int -> Int -> Int)
test (F a) = a

instance Foo (Int -> Int) where
test :: Func -> (Int -> Int)
test (B a) = a

こうですかね
めんどい

271 :デフォルトの名無しさん:2013/11/14(木) 07:47:10.42
InstanceSigsを使って型を書いた意味はないのかなあ
>>> let b = B succ
>>> let f = test b :: Int -> Int
>>> f 0
1

272 :デフォルトの名無しさん:2013/11/14(木) 08:25:16.27
>>268
test (F f) _then _else = _then f
test (B b) _then _else = _else b

273 :デフォルトの名無しさん:2013/11/14(木) 17:24:35.79
haskellでforとかwhileとかそういう言語構造の内容は本家のどこのページにのってますか?

274 :デフォルトの名無しさん:2013/11/14(木) 17:41:00.57
Haskell は構文要素としては for や while に相当するものを持ってない。
if も関数に出来たと思うんだけど、なんで構文になってるんだろう。

275 :デフォルトの名無しさん:2013/11/14(木) 19:26:47.21
>>273
http://www.haskell.org/onlinereport/haskell2010/haskellch3.html#x8-220003

276 :デフォルトの名無しさん:2013/11/14(木) 19:32:45.49
>>274
個人的には、if :: Bool -> a -> a -> a という関数より、
if then else という構文の方がソースが見やすい

関数にすると括弧が増えて lisp/scheme みたいになる

277 :デフォルトの名無しさん:2013/11/14(木) 20:09:36.15
おまいらLisperをDISってんの?
http://gazo.shitao.info/r/i/20131114200901_000.jpg

278 :267:2013/11/14(木) 20:10:31.28
ところで誰もこの問題を解決していないのでしょうか。

279 :デフォルトの名無しさん:2013/11/14(木) 21:05:05.02
誰かがバグを見つけるよりコンパイラがバグを見つける方が早い
という願望がある限り解決しないみたいなパターンか

280 :デフォルトの名無しさん:2013/11/14(木) 22:21:27.34
cmdargs パッケージを入れてコマンドラインオプションを解析しようとしました。

次のオプションを解析したいです。

-a か -b のどちらかのオプションが排他的に指定できる
もし -b を指定するなら、追加で数値を指定できる(-b 3 や -b 17 など)

このようなオプションは cmdargs パッケージで解析できるのでしょうか。

281 :デフォルトの名無しさん:2013/11/15(金) 12:31:14.32
FlexibleInstances くらいはもうデフォでオンにしちゃって良い気がする

282 :デフォルトの名無しさん:2013/11/15(金) 12:36:14.18
hello worldをひょうじするだけのサンプルコードをコンパイルするだけでファイルサイズが1MBも消費するんですが
これ軽量化するオプションか何かないですか?

283 :デフォルトの名無しさん:2013/11/15(金) 12:43:57.99
jhc を使えばかなりマシになるけど、
言語機能としては GHC ほどまではサポートできていないので、
トレードオフだわな。

284 :デフォルトの名無しさん:2013/11/15(金) 12:45:33.64
>>282
「haskell executable size」でググると色々方法が出てくる

285 :デフォルトの名無しさん:2013/11/15(金) 12:53:14.63
>>282
sharedライブラリとしてインストールされているパッケージを使っているならダイナミックリンクできます
ghc -dynamic hoge.hs
ついでにstripしてもいいのではないでしょうか

286 :デフォルトの名無しさん:2013/11/15(金) 12:56:30.62
strip 前だと3MBくらいあるぞ

287 :デフォルトの名無しさん:2013/11/15(金) 15:46:57.27
とりあえず本家のドキュメントを見て勉強しようかとおもうんだけど
Haskellにかんするドキュメントのページが見当たらない
なのでhttp://www.haskell.org/ghc/docs/7.6-latest/html/libraries/index.htmlから勉強しようと思うんだけど
リファレンスとかチュートリアルは公式サイトに用意されてないのですか?

288 :デフォルトの名無しさん:2013/11/15(金) 16:09:38.87
>>287
それがリファレンスでないと申すか。

289 :デフォルトの名無しさん:2013/11/15(金) 16:26:12.12
チュートリアル (へのリンク) はここにまとまってる。
http://www.haskell.org/haskellwiki/Tutorials
でも、全くゼロからの入門なら入門書の一冊くらいは読んだ方がいいと思うぞ。

290 :デフォルトの名無しさん:2013/11/15(金) 17:14:35.49
instance Num a => Num (Maybe a) where {
Just x + Just y = Just (x+y);
Just _ + Nothing= Nothing;
Nothing+ Just _ = Nothing;
}

というような定義をすると (*) などのメソッドが定義されていないとして警告が出ます。
使う必要がなくてメソッドを定義しない場合に、意図的に未定義なのだということを明示して警告を抑制する方法はありますか?

291 :デフォルトの名無しさん:2013/11/15(金) 17:28:39.66
未定義を英訳すると

292 :デフォルトの名無しさん:2013/11/15(金) 17:49:09.33
be not defined

293 :290:2013/11/15(金) 17:57:41.63
>>291
ありがとうございます。
それをヒントに調べたところ
(*) = undefined;
というようにすればよいことがわかりました。

294 :デフォルトの名無しさん:2013/11/15(金) 18:01:52.03
試しに (*) = undefined とかしてみたら警告は出なくなったけど、
そんな風に見境なくインスタンス宣言していいものなの?
いろいろ訳の分からない事が起こりそうな気がするんだけど…

295 :デフォルトの名無しさん:2013/11/15(金) 18:23:33.71
reflection使ってその場限りのMonoidとして定義するのがよさそう

296 :290:2013/11/15(金) 18:25:41.59
>>294
ここでは例として Maybe を出しましたが、そういう基本的な型をインスタンスにしするのはあまり筋が良くないでしょうね。
実際にやろうとしていたのは自分で定義した2x2行列の型のべき乗なんです。
単に (^) を使いたいけどそのためには Num のインスタンスでなければならずかけ算だけは定義されていなければならないという状況です。

297 :デフォルトの名無しさん:2013/11/15(金) 19:07:23.87
Numのインスタンス宣言は
メソッドの定義だけでなく Num a => がついてる全ての定義を実体化する宣言だから
その全てに対して意図的にundefinedにしたことを明示するのは無理じゃないかね

298 :デフォルトの名無しさん:2013/11/16(土) 04:08:32.69
>>294
よくないと思う。Minimal complete definitionすら定義できないってことは
“そもそもその型はそのクラスのインスタンスではない”ということだと思う
つまり、そのインスタンス宣言は純粋に間違っている

299 :296:2013/11/16(土) 13:57:22.51
>>298
なるほど。 >>296 のような状況なのですが、 (*) も未定義にしてみたところコンパイルは通っちゃいますね。
そんでもって実行時エラー。

しかし、必要な (実際に使われる) メソッドが定義されていないというのはコンパイル時に検出できないものなのでしょうか。
現在の GHC は「実際に使われはしないけどクラス定義が要求するメソッドを定義してない」のも
「実際に使われるメソッドを定義してない」のも等しく警告しか出さないというのはちょっと微妙な挙動に思えます。

300 :デフォルトの名無しさん:2013/11/16(土) 13:57:27.77
>>288
チュートリアルでないことは確かだな

301 :デフォルトの名無しさん:2013/11/16(土) 14:11:16.78
>>299
実際にはundefinedを呼ぶという定義をしているだけで
それの定義がこれなので問題なくコンパイルできるし実行時に評価されればエラーを出すっぽい雰囲気ですね
undefined :: a
undefined = error "Prelude.undefined"

headでも空リストを適用したのが評価されれば実行時にerrorになるっぽいそんな雰囲気

302 :301:2013/11/16(土) 14:15:35.96
あーundefinedではなく本当に未定義でも通るのか
勘違いしてた

303 :301:2013/11/16(土) 14:18:17.26
それでも評価しなければエラーは出ないけど

304 :デフォルトの名無しさん:2013/11/16(土) 14:24:27.83
>>299
どのメソッドが使われるかは静的には分からないから、
「実際に使われた場合のみ」警告するのは難しい
(ごく粗い近似ならできそうだけど、粗すぎて役に立たない可能性がある)

スタイルとしては、型クラスのインスタンスは必要なメソッドを全部定義するべきとされている
(*)が定義できないなら、おそらくその型はNumにしない方が良い
AdditiveGroupとか検討しても良いと思う
http://hackage.haskell.org/package/vector-space-0.8.6/docs/Data-AdditiveGroup.html

305 :デフォルトの名無しさん:2013/11/16(土) 14:35:45.25
そもそも行列は数だっか?

306 :290:2013/11/16(土) 14:39:26.60
交換法則が成り立たないので駄目ですかね。

307 :デフォルトの名無しさん:2013/11/16(土) 14:50:24.03
Numクラスは+と-と*があるから環っぽいな
環なら*に交換法則無くてもいけるから*との分配法則が成り立つアーベル群をなす加算を適当にでっち上げればいけなくも無いんじゃないかな

308 :290:2013/11/16(土) 14:56:49.66
abs に自然な定義が出来ない気がする

309 :デフォルトの名無しさん:2013/11/16(土) 14:57:35.20
そっか

310 :デフォルトの名無しさん:2013/11/16(土) 15:09:59.70
n次正方行列なら行列環として定義して
absは行列のノルムと単位行列のスカラー積にしたらいけるんできるんじゃないかな

311 :デフォルトの名無しさん:2013/11/16(土) 15:11:04.78
複素数や四元数ってスカラーでしたっけ?

312 :デフォルトの名無しさん:2013/11/16(土) 15:19:58.27
絶対値はスカラーじゃん
でもそれだとインスタンスにできないから戻す単位元と乗じる等して台集合の中に戻す必要がある

313 :デフォルトの名無しさん:2013/11/16(土) 19:15:30.90
話の筋としてはよくないな

314 :デフォルトの名無しさん:2013/11/16(土) 19:24:36.46
pythonのラムダが便利だなと思って関数型言語の勉強を始めてみたけど
コード見ても何か居てあるのかさっぱりわかりませんよ

315 :デフォルトの名無しさん:2013/11/16(土) 19:32:27.11
慣れですよ

316 :デフォルトの名無しさん:2013/11/16(土) 20:01:49.67
haskell の CPP を、使ってみてるんですが、
#name での quoting って、ないんですか?

# を使うと、section なら、 () で囲めって怒られます。

検索で、うまく引っ掛からないんで、教えてください。

317 :デフォルトの名無しさん:2013/11/16(土) 20:33:02.77
>>314
たとえば、どんなコードですか?
もしかしたら、そのコードの書き方が悪いのかもしれません。

コードに問題は特に無く、単にあなたが未熟なだけかもしれませんが。

318 :デフォルトの名無しさん:2013/11/16(土) 20:43:43.45
cabal でパッケージをインストールするとき、ドキュメントも同時にインストールするように
.cabal/config を設定しているのですが、そのドキュメントに対して、
ソースコードへのリンクを張るように設定するにはどうすればよいのでしょうか。

http://hackage.haskell.org/packages/ ここのドキュメントみたいにしたいです。

319 :デフォルトの名無しさん:2013/11/17(日) 00:12:47.66
>>314
ラムダを使ってる箇所は大抵開いて書き直す事ができて(関数定義の局所性などの問題を除けば)
同等で長ったらしい形に書き直せる.

そういう書き直しの練習をいくつかしてみれば,自分の理解に応じて「ここは確かにラムダで簡単に書きたい」とか
思うようになるかもしれないし「ここはわざわざラムダ使うより where できちんと関数定義したほうがいいな」とか
色々思うようになるんじゃないかな

320 :デフォルトの名無しさん:2013/11/17(日) 00:32:09.25
>>314
関数型にはほとんど言語的メリットはないよ

321 :デフォルトの名無しさん:2013/11/17(日) 01:34:49.91
>>316
gccを使う環境だと、CPPはgcc -P -tradirionalが使われる
これはANSI C以前のCPPなので#での文字列化はできない
代わりに
#define Foo(x) "x"
みたいなことができる

322 :デフォルトの名無しさん:2013/11/17(日) 01:46:05.54
>>318
cabal install --haddock-hyperlink-source

configファイルではまだ指定できないらしい
https://github.com/haskell/cabal/issues/931

323 :デフォルトの名無しさん:2013/11/17(日) 11:38:01.41
>>276
ifが関数でも構文でもBoolの値で分岐すること自体は否定されないから大差ない

オブジェクト指向だと、値で分岐するな、オーバーライドかオーバーロードで分岐しろ、
ってのが面倒臭い

324 :デフォルトの名無しさん:2013/11/17(日) 12:18:27.79
Hoogle が停止中?

325 :デフォルトの名無しさん:2013/11/17(日) 12:20:28.43
昨日からhaskell.org全体が止まってるみたい

326 :デフォルトの名無しさん:2013/11/17(日) 12:25:33.08
なんでhaskell.orgすぐ死んでしまうん?

327 :デフォルトの名無しさん:2013/11/17(日) 12:49:01.49
>>322
ありがとうございます。

コマンドラインオプションもひと通り見たはずなんですが、見落としていました。
助かりました。

328 :デフォルトの名無しさん:2013/11/17(日) 13:41:10.36
>>326
Haskellで書かれてるから

329 :デフォルトの名無しさん:2013/11/17(日) 14:10:09.21
あんちはすけらに危険視されて狙い撃ちされてるから

330 :デフォルトの名無しさん:2013/11/17(日) 14:23:07.17
haskell.orgはApacheっぽいね
まあ、単にサーバが貧弱だとか管理が適当なだけとかでしょ

331 :デフォルトの名無しさん:2013/11/17(日) 14:50:23.33
Hayooの停止頻度に比べたらHoogleはまだマシ。

Hayooは使いやすいからもっと安定してくれると助かるんだけど・・・。

332 :デフォルトの名無しさん:2013/11/17(日) 14:51:25.29
総本山のサイトが度々落ちるとか結構なマイナスイメージになるだろうにな
インフラ代恵んでやるぐらい金ある所もあるのにそれをしないというのはわけがあるんだろうな

333 :デフォルトの名無しさん:2013/11/17(日) 15:08:04.84
>>329
そうだったのか
許さんぞLisperめ

334 :デフォルトの名無しさん:2013/11/17(日) 15:35:51.59
おい、Lisper様に喧嘩売るのはやめろよ……

335 :デフォルトの名無しさん:2013/11/17(日) 15:58:35.44
Lisperが何だってんだ
待ってろよ…今からエディタの括弧ハイライトに細工してきてやる

336 :デフォルトの名無しさん:2013/11/17(日) 17:07:45.09
iPhoneで動くHaskellは1つだけ。
もっと増えないかなぁ

337 :デフォルトの名無しさん:2013/11/18(月) 08:32:35.92
スマホで動かしてどうする
それよりライブラリリファレンスをスマホからみたい
拡大縮小ちまちませずにズババババーンと表示して欲しい

338 :デフォルトの名無しさん:2013/11/18(月) 11:39:22.93
ズババババーン
Prelude.head: empty list

339 :デフォルトの名無しさん:2013/11/18(月) 12:39:38.20
テンプレの日本語サイトの情報がしょぼいんですが何故この2つがテンプレ入りしてるのですか?

340 :デフォルトの名無しさん:2013/11/18(月) 13:06:25.94
真面目に議論されないから

341 :デフォルトの名無しさん:2013/11/18(月) 14:36:13.28
自分が気に入ってるのはここ
http://www.geocities.jp/m_hiroi/func/haskell.html

342 :デフォルトの名無しさん:2013/11/18(月) 16:28:51.95
日本語サイトでしょぼくないとこなんてあるのか?

343 :デフォルトの名無しさん:2013/11/18(月) 19:51:07.62
>>341
広井氏のページは他の言語でも参考にしているよ。
個人ページ特有の調子こいた感じが全くなくて読みやすい。

344 :デフォルトの名無しさん:2013/11/18(月) 23:16:16.06
逆に調子こいたページってどんなの

345 :デフォルトの名無しさん:2013/11/19(火) 00:31:59.98
清少納言のページ

346 :デフォルトの名無しさん:2013/11/19(火) 02:00:39.83
Haskell Platform 2013.4.0.0 のリリースまだぁ〜チンチン
待ちくたびれた

347 :デフォルトの名無しさん:2013/11/19(火) 11:37:59.44
どうせそんな先進的な機能を使ったりしてないんだろ?
最新厨ども

348 :デフォルトの名無しさん:2013/11/19(火) 11:51:14.85
最新の機能は使って無くてもバグを踏むことはある

349 :デフォルトの名無しさん:2013/11/21(木) 12:53:27.66
Debug.Trace.traceEvent や traceEventIO などを使ってイベントログにメッセージを書きだしたのですが、
そのイベントログを ThreadScope で Event labels を有向にして見てみると、
自分が書きだしたメッセージ以外にもランタイムが書きだした大量のメッセージもいっしょに表示され、
自分のメッセージがその中に埋もれてしまいます。

自分が書きだしたメッセージがログのどこにあるのか、検索する方法は無いでしょうか。
あるいは、色を変えたりして目立たせる方法でもいいのですが。

今は吐き出したイベントログを Emacs で開いて、自分のメッセージを検索し、
ログ全体のどの当たりにメッセージがありそうか当たりをつけてから、
ThreadScope で開いてその辺りを探しています。
しかし、非常に効率悪く、ThreadScope 上ではどうにも見つからない場合もあります。
(無いはずはないのですが・・・)

350 :デフォルトの名無しさん:2013/11/21(木) 19:18:15.01
>>349
ghc-eventsというコマンドラインツールがある(ghc-eventsパッケージ)
ghc-events show <eventlogファイル>
でイベントの一覧がタイムスタンプ付きで出るので、grepとかで探せばいい

351 :デフォルトの名無しさん:2013/11/21(木) 19:45:28.93
>>350
ありがとうございます。
幾分楽になりました。

352 :デフォルトの名無しさん:2013/11/24(日) 11:41:09.78
qualified Data.ByteString.Lazy as B
qualified Data.List as L

この2つのモジュールに共通する関数
B.foldr と L.foldr のメモリ効率に関する質問です。

f :: B.ByteString -> B.ByteString
f = B.pack . B.foldr (\b xs -> h b : xs) []

g :: B.ByteString -> B.ByteString
g = B.pack . L.foldr (\b xs -> h b : xs) [] . B.unpack

関数 f は ByteString を直接 B.foldr で加工しています。
(たとえば暗号化したり、追加のデータを挿入したり)
一方、関数 g は一度リストに変換し、それを加工しています。

このような関数を使ったプログラムをコンパイルして、
RTS オプション -s で実行してメモリ使用量を調べました。

関数 f の方は ByteString のデータサイズに比例して
メモリ使用量も増えていました。
一方、関数 g の方は、データサイズに関わらず、
ほぼ一定のメモリ使用量で処理されました。

おそらく、リストに一度変換した方は遅延処理が働いて、
一定サイズのヒープで逐次処理されたのだと思います。
ただ、そう考えると、ByteString.Lazy の遅延性は
このプログラムでは働いていないということでしょうか。

B.ByteString 型の説明には
A space-efficient representation of a Word8 vector, ...
と書かれいているのですが・・・

353 :デフォルトの名無しさん:2013/11/24(日) 12:23:57.09
>>352
現在のByteStringのfoldrの定義がおかしいのが原因
次のリリースで直るはず

354 :デフォルトの名無しさん:2013/11/24(日) 13:55:05.79
>>353
ありがとうございます。

とりあえず今のところはリストに一度変換するようにプログラムしておいて、
修正は気長に待ちます。

355 :デフォルトの名無しさん:2013/11/24(日) 14:22:52.50
型クラス NFData のインスタンスについて質問です。

import Control.Monad.Par

data TestT a = TestD a

f x = do
 var <- new
 put var (TestD x)
 return var

この関数 f の型は f :: NFData (TestT a) => a -> Par (IVar (TestT a)) です。

TestT a 型が型クラス NFData のインスタンスであるという文脈を指定するのは分かります。
put 関数はその引数として NFData のインスタンス型(とそれを型変数としたIvar型)の値を取り、
ここでは put 関数に TestT a 型(および IVar (TestT a) 型)の値に適用しているので。

しかし、まだ TestT a 型を型クラス NFData のインスタンスとして定義してはいません。
それにも関わらず、なぜかエラーもなくコンパイルが通ってしまいます。

どうしてでしょうか?


GHC のバージョン : 7.6.3

356 :355:2013/11/24(日) 15:35:51.45
>>355
すいません、自己解決しました。


f 関数を使って、TestT a の型変数 a に具体的な型を与えるようなことをしたら、
ちゃんと NFData のインスタンスではないことを知らせるエラーが出ました。

357 :デフォルトの名無しさん:2013/11/25(月) 13:47:19.60
等式性制約(~)の実装を見たいのですがそれらしいソースが見当たりません
ghciで:infoしてもエラー吐かれるだけです
どこにあるかご存知の方いらっしゃいませんか

ghcのバージョンは7.6.3です

358 :デフォルトの名無しさん:2013/11/25(月) 14:28:16.22
ghcのソース読んだ?

359 :デフォルトの名無しさん:2013/11/25(月) 19:05:44.75
>>357
~は演算子じゃなくて構文だからソースレベルの定義はどこにもない
ghcは内部的には型構築子として扱うっぽいけど(prelude/TysWiredIn.hsのeqTyCon)

360 :デフォルトの名無しさん:2013/11/26(火) 12:06:37.60
>>357>>368
実はghcのソースを読んでてみてそれらしいコードが無かったのでもしかしたらと思っていましたが、やはりそうでしたか
ていうことは~はhaskellで実装できないのでしょうか
どうしても似たような機能を持つ演算子が欲しいのですが

361 :360:2013/11/26(火) 18:58:55.97
360です
似たような演算子というのは、例えば型リストxs::[*]と型x::* があるとします
この時「xsの中にxが含まれている」という型制約を表す演算子です
そのような演算子は論理的に実装可能でしょうか
よろしくお願いします

362 :デフォルトの名無しさん:2013/11/26(火) 20:53:14.13
{-# LANGUAGE GADTs, TypeOperators, KindSignatures, DataKinds #-}
data (a :: *) :== b where Refl :: a :== a

data List a where {
Nil :: List a ;
(:::) :: a -> List a -> List a
}

infixr 5 :::

data Exists b c where {
Here :: a :== b -> Exists a (b ::: c);
There :: Exists a c -> Exists a (b ::: c)
}

sample :: Exists Int (String ::: Int ::: Char ::: Nil)
sample = There (Here Refl)

ghcの型システムの上でそれっぽいものは作れるようだけど

363 :360:2013/11/27(水) 17:12:12.44
>>362
ありがとうございます
自分にHaskellの能力が無いためか、これを使いこなすのは難しそうです
あきらめてgeneric使います

364 :デフォルトの名無しさん:2013/11/27(水) 19:57:08.37
GHCのソースコードを調べるやる気と根性がありながら、
>>362 をものにすることを諦めると申すか

少々もったいない気もする

365 :デフォルトの名無しさん:2013/11/27(水) 21:55:26.22
haskell難しすぎる。

366 :デフォルトの名無しさん:2013/11/28(木) 01:30:16.80
>>365
↓の3ページ目「Haskellドリル」で勉強したまえ(ただし、非売品)

「Haskellは企業でも十分実用になる」、NTTデータが
ソースコード解析サービスの舞台裏を披露 2013/11/26
http://itpro.nikkeibp.co.jp/article/NEWS/20131126/520642/

367 :デフォルトの名無しさん:2013/11/28(木) 01:51:04.77
> 勉強したまえ(ただし、非売品)

NTTデータに入れなければHaskell書くなということですねやめてくださいしんでしまいます

368 :デフォルトの名無しさん:2013/11/28(木) 09:26:05.25
>>366
>30人体制のチームで、1500ファイル、35万行のツールをHaskellで開発

1人約1万1千行か・・・
半年以上かけて作ってる俺のプログラムは未だに5千行を超えてないw

35万行で1500ファイルだと平均230行/ファイル。
モジュールの粒度としては似たようなもんだな。

369 :デフォルトの名無しさん:2013/11/28(木) 11:22:35.70
質問です。
モナドを、途中で他のものに変更する、
または直接中身を取り出す事はできますか?

具体的にはIOの文脈で、他のMonad(QuickCheck.Gen)の値を、
直接取り出す方法を探しています。

初心者ですので、キーワードだけでも教えていただけると助かります。

370 :デフォルトの名無しさん:2013/11/28(木) 11:40:27.79
すみません、自己解決しました。
Test.QuickCheck.Genのsample'を見落としていました。

ちなみに、これは汎用的に取り出す方法はあるんでしょうか?

371 :デフォルトの名無しさん:2013/11/28(木) 11:47:02.68
>>368
私は全く違う言語を使っているので感覚がわからないのですが、
1ファイル平均230行というのは途方もなく大きく思えるのですが。
大規模開発だとそんなものなのですか?

372 :デフォルトの名無しさん:2013/11/28(木) 12:01:01.15
>>370
Genに関してはTest.QuickCheck.Gen.unGen使えば取り出せるよ
一般的にいえばMonad mの文脈でMonad nの値を使うには
nからmへのMonadTransformerがあればliftを使って取り出す(持ち上げる)ことができる

373 :デフォルトの名無しさん:2013/11/28(木) 12:09:35.78
chromium.git (C/C++)
ファイル数: 27551
合計行数: 6414627
平均: 232.8

374 :デフォルトの名無しさん:2013/11/28(木) 12:11:59.25
その内例外処理の行数は何パーセントですか?

375 :デフォルトの名無しさん:2013/11/28(木) 12:14:37.58
>>372
unGenの方が使えそうですね。
MonadTは名前だけは知ってましたが、そういうものだったんですね。

MonadTransformerとliftで調べてみます。
ありがとうございました。

376 :デフォルトの名無しさん:2013/11/28(木) 12:35:58.36
>>374
知らんけどC/C++で何で例外が気になるんだ?
ほとんど使われてないと思うが

377 :デフォルトの名無しさん:2013/11/28(木) 12:37:47.84
transformerとか入門書に普通に書いてあるけど、みんなプロだから読んでないのか

378 :デフォルトの名無しさん:2013/11/28(木) 12:47:28.25
>>376
例外処理とエラーって別なんですかね
初心者なんでその辺わからないんですよ

379 :デフォルトの名無しさん:2013/11/28(木) 12:56:53.98
>>378

例外処理はエラー処理方法の一つに過ぎない

380 :デフォルトの名無しさん:2013/11/28(木) 13:00:48.74
>>379
例えば壊れたり、不正なコンフィグファイルを読み込んだ時デフォルト設定に差し替えて起動したり、
起動せずに修正するようにユーザーに促したりという処理はしませんか
それとも放置なんでしょうか。プロの皆さんはどうしてます?

381 :デフォルトの名無しさん:2013/11/28(木) 13:03:02.82
>>380
C++ではそれをいちいち例外でやらない
議論したいなら別スレ立てろ

382 :デフォルトの名無しさん:2013/11/28(木) 14:20:20.85
>>371
230行はそれ程大きく感じないな。
むしろ丁度いいか、やや小さめって感じ。

今のプログラム内で最大モジュールは1千行近い。
早い段階で分割しすぎると試行錯誤が面倒になるから、
落ち着くまではそのままにしてる。

この辺は大規模開発かどうかはあまり関係ない気がするな。

ちなみに、どんな言語使ってるの?

383 :デフォルトの名無しさん:2013/11/28(木) 14:59:53.84
>>382
Prologです。述語ごとにファイルを作りますから、平均5行ですね。

384 :デフォルトの名無しさん:2013/11/28(木) 15:15:23.44
Prologは第5世代言語だからな
その立場から見たら殆ど全ての言語が古臭く冗長に見えちゃう
それこそscalaになれた人から見たjava以上の差を感じるのだろう

385 :デフォルトの名無しさん:2013/11/28(木) 17:47:04.28
第五世代コンピューター・プロジェクト

386 :デフォルトの名無しさん:2013/11/28(木) 17:55:53.45
2位じゃダメなんでしょうか?

387 :デフォルトの名無しさん:2013/11/28(木) 18:13:13.57
つーかFortranじゃなければダメでしょ。

388 :デフォルトの名無しさん:2013/11/28(木) 20:34:32.16
4GLって汎用のプログラミング言語じゃない言語(RPGとかの問題領域を特化した言語)のことじゃなかった?
ましてや第五世代言語なんて定義無いと思うけど。

389 :デフォルトの名無しさん:2013/11/28(木) 20:50:27.80
shuffle :: [a] -> IO [a]
のエレガントな実装を見せてください。

390 :デフォルトの名無しさん:2013/11/28(木) 21:14:18.64
たとえばこんな式を書いたら
sqrt $ fromInteger 15
この型は
Floating a => a
じゃないですか。

で、もうひとつ関数を追加して
floor $ sqrt $ fromInteger 15
としたらこの型は
Integer
になるじゃないですか。

このとき sqrt が返す値の型は Floating クラスに属するわけで、
floor が受け取れるんだから RealFrac クラスでもあるような型ってことになるわけです。
でも、そうなると候補は Float と Double のふたつがあることになると思うんですけど、
実際にはどちらで処理されるんですか?

391 :デフォルトの名無しさん:2013/11/28(木) 21:25:03.32
>>390
特に指定しなければDouble
http://www.sampou.org/haskell/report-revised-j/decls.html#default-decls

392 :デフォルトの名無しさん:2013/11/28(木) 22:02:39.72
>>388
http://en.wikipedia.org/wiki/Fifth-generation_programming_language

393 :デフォルトの名無しさん:2013/11/28(木) 22:29:06.51
>>389
効率やシャッフルの質を重視するなら Fisher–Yates shuffle を使いところだが、
リストでエレガントにやる方法が思いつかなかった。
俺が考えると、どうしても泥臭くなる。

代わりに、こんなのはどうだろう。

pick :: [a] -> Int -> (a, [a])
pick xs i =
 let (ys, ys') = splitAt i xs
 in (head ys', ys ++ tail ys')

shuffle :: [a] -> IO [a]
shuffle [] = return []
shuffle xs = do
 (y, ys) <- pick xs `fmap` (getStdRandom (randomR (0, length xs - 1)))
 ys' <- shuffle ys
 return (y : ys')

394 :デフォルトの名無しさん:2013/11/28(木) 22:56:28.42
>>393
fmapの辺りは何をしているのでしょうか?

395 :394:2013/11/28(木) 22:59:41.67
よく眺めたら理解できました。なかなか面白いです。

396 :デフォルトの名無しさん:2013/11/30(土) 22:16:18.65
Pythonの次にいじる言語として、Haskellってどうっすか

397 :デフォルトの名無しさん:2013/11/30(土) 22:24:15.07
Haskell は Python とは何の関連もない言語ですから、
Python の次とか前とか考えることに全く意味はないと思います。

いつでもいいので興味が向いた時にいじってください。

398 :デフォルトの名無しさん:2013/12/01(日) 00:24:53.52
Hasekllの場合は、他のコンピュータ言語を一切教えずに始めからHaskellの方がいいと思うのは俺だけか

399 :デフォルトの名無しさん:2013/12/01(日) 01:22:01.13
貴方だけかは知りませんが、少なくともHaskellの作者のひとりは
貴方とは違う意見のようです。

「言語設計者たちが考えること」という本でインタビューを受けた作者のひとりは、
他言語を学んでからという趣旨のことを言っていました。

どちらかと言えば、私も作者に同意見です。

問題の解法の表現方法が大きく違うというのをリスクとみなすならば、
それは初めにHaskellを学んだ後の次の言語にも言えることてす。

初心者にとっては他言語(特に手続き型)の方が、
問題を抽象化して解法を導くのに必要な考え方を学びやすいと思います。
また指導者も教えやすいと思います。
その考え方は、Haskellだろうと何だろうと全ての言語で通用するものです。

400 :デフォルトの名無しさん:2013/12/01(日) 01:55:03.00
>>398,399
俺もExcelシート+VBAで基本的な問題解決方法を学んでからHaskellに移った方が良いと思う。

401 :デフォルトの名無しさん:2013/12/01(日) 05:22:45.49
手続き型と干渉しないからC++と同時に教えれば良いんじゃね?

402 :デフォルトの名無しさん:2013/12/01(日) 09:05:52.82
>>401
手続き型を教えるなら、まずブロック図や回路図を見せながら16bit機の
アセンブラを教えて、その後C言語を教えた方が良いと思う。

403 :デフォルトの名無しさん:2013/12/01(日) 09:14:17.11
例えば reverse の後に再び reverse をすると何もしないのと同じなので無意味ですよね。
(無限の配列に対してだと無限ループになりますけどそれはとりあえず置いときます。)
なので、そういう場合には無かったことにするとか、そういう書き換え規則を表現することってできますか?
Common Lisp で言うところのコンパイラマクロみたいなもののことです。
GHC の拡張でそういうのがあったような気がするのですがどうにも詳しいことを重い出せなくて。

404 :デフォルトの名無しさん:2013/12/01(日) 10:34:13.84
>>402
四則演算もわからない小学生に実数の定義から教えようってことかい?

405 :デフォルトの名無しさん:2013/12/01(日) 10:34:57.93
>>403
http://big.freett.com/shelarcy/rewriterules.pdf
白石さんが昔書いたスライドにあった
RULESプラグマを使えば良いようだ

reverse . reverse = idならいけるけど
自然変換の性質を使ってreverse . f . reverse <=> f . reverse . reverse <=> f . id
みたいなのもできると面白そうだけど多分無理だろうな

406 :デフォルトの名無しさん:2013/12/01(日) 10:37:01.89
>>403
書き換え規則の RULES プラグマですね。

たとえばソースに次のように記述すれば、reverse (reverse xs) という式は
最適化コンパイルの時に id xs に書き換えられます。
(引用符で囲んだ部分は規則の名前で、適当に名付けることができます)

{-# RULES "rev/rev" forall a. reverse (reverse a) = id a #-}

[ソースの記述] f xs = reverse (reverse xs)
[コンパイル後] f xs = id xs

簡単に言えば、書き換え規則中のイコールの左辺の「形」の式がソース中にあれば右辺に書き換えられます。

ただし、わざわざ「形」と強調したように、コンパイラは構文の形しか見ません。
ソース中の関数適用の式がアルファ変換(識別子名の置換)で書き換え規則左辺に変換できれば、
規則が適用されて右辺に書き換えられます。
ソース中の関数適用の式がベータ変換(簡約)でしか書き換え規則に変換左辺できなければ、
規則は適用されず書き換えられません。

たとえば先ほどの "rev/rev" の規則が記述されいても、次の式は書き換えられません。

[ソースの記述] g xs = (reverse . reverse) xs

ベータ変換(簡約)すれば、f xs も g xs も同じ意味の式になるのですが、これは無効です。
だから、これも書き換えるには、次の書き換え規則も記述しなければなりません。

{-# RULES "rev/rev 2" forall a. (.) reverse reverse a = id a #-}

中置演算は最適化時に関数適用に変換されてから、書き換え規則が適用できるか検証するみたいです。

詳しくは http://www.kotha.net/ghcguide_ja/latest/ の「7.19 書き換え規則」の項を見てください。

407 :406:2013/12/01(日) 10:49:34.80
>>403
もっとひどい事もあります。

{-# RULES "rev/rev 2" forall a. (.) reverse reverse a = id a #-}

これを記述した場合、次のはちゃんと書き換えられます。

f = g [1..]
g xs = (reverse . reverse) xs

でも、次のは書き換えられません。

f = g [1..]
g = reverse . reverse

なかなか融通が効きませんね。


ちなみに、これは最新の GHC 7.6.3 での話です。
昔はどうだったか知りません。

408 :デフォルトの名無しさん:2013/12/01(日) 14:33:23.73
マクロはなしの方向でいきませんか

409 :デフォルトの名無しさん:2013/12/01(日) 14:48:53.82
いきません

410 :デフォルトの名無しさん:2013/12/01(日) 15:30:12.24
>>406みたいな変なことになるのは、reverseがRULESで書き換えられることを意図していないから
GHC HEADだと次のような警告がでる

rev-rules.hs:2:11: Warning:
Rule "rev/rev" may never fire because ‛reverse’ might inline first
Probable fix: add an INLINE[n] or NOINLINE[n] pragma on ‛reverse’

>たとえば先ほどの "rev/rev" の規則が記述されいても、次の式は書き換えられません。
>
>[ソースの記述] g xs = (reverse . reverse) xs

reverseに例えばNOINLINE[1]を指定すれば、この式も問題なく書き換えられるようになる
((.)をインライン化した後で規則に適合するようになるので)

411 :406:2013/12/01(日) 16:00:48.36
>>410
ご指摘ありがとうございます。

質問者さん(>>403)参考にしてください。

412 :デフォルトの名無しさん:2013/12/01(日) 17:27:02.46
>>396
Node.js

413 :デフォルトの名無しさん:2013/12/01(日) 22:52:18.23
JSはウンコすぎて話にならない

414 :デフォルトの名無しさん:2013/12/04(水) 09:16:56.71
>>408
マクロ話の方向ですね分かりました

415 :デフォルトの名無しさん:2013/12/04(水) 11:23:46.82
おさきまっくろ

416 :デフォルトの名無しさん:2013/12/04(水) 12:36:16.75
>>414
3日も経ったその返しはちょっと寒い

417 :デフォルトの名無しさん:2013/12/04(水) 17:46:08.75
誰かテンソル積を教えてください
斜めの座標じゃないシンプルな奴(添字の上下の考えなくていい)です
途中まで書いてみたのですがこんなんでいいんでしょうか

-- ベクトル
a = [1,2,3]
b = [4,5,6]
c = [7,8,9]

d = [3,3,4]
e = [5,2,1]
f = [2,3,4]

-- ベクトル3つからテンソル化(あっているの??)
abc = [[[i*j*k|i<-a]|j<-b]|k<-c]
def = [[[i*j*k|i<-d]|j<-e]|k<-f]

-- テンソル和
plus = [[zipWith (+) j m|(j,m)<-zip i k]|(i,k)<-zip abc def]

-- テンソル積
mult = ???

418 :デフォルトの名無しさん:2013/12/05(木) 00:19:13.62
まず反変ベクトルと共変ベクトルをどう構成してるか言ってくれないと

419 :デフォルトの名無しさん:2013/12/05(木) 12:11:26.62
RT @chomado はぁ〜情報系彼女たん可愛い〜hshs.hs

420 :417:2013/12/05(木) 14:13:36.53
反変/共変は直交座標では無関係だと思うのです
もうすこし調べて、上のabc/defがテンソル積だと分かりました
失礼しました

421 :デフォルトの名無しさん:2013/12/05(木) 23:06:19.73
自前でfunctorを作る場面はよくありますか?

422 :デフォルトの名無しさん:2013/12/06(金) 01:01:22.83
オーム社はおかげさまで2014年に創立100周年を迎えます。
長年のご愛顧に感謝してeStoreでは記念セールを開催中です。
(2013-12-04(水)12時から2013-12-11(水)12時まで)
http://estore.ohmsha.co.jp/titles

すごいHaskellたのしく学ぼう!
PDF版書籍データ 希望小売価格 2,800円→特別価格 1,400円
コンボパック(PDF版と紙版書籍のセット) 希望小売価格 5,600円→特別価格 4,200円

423 :デフォルトの名無しさん:2013/12/06(金) 06:43:45.00
>>421
たまに

424 :デフォルトの名無しさん:2013/12/06(金) 07:05:22.77
>>421
「functorを作る」の意味がよく分かりませんが、
Functorクラスのインスタンスを作るという意味でしょうか。

であれば、私はよくあります。
data で自前の型を作り、その値に対して map を施す必要があるなら、
map*** などその型用の別名 map 関数を作ったりはせず、
その型をFunctorクラスのインスタンスに fmap 関数を定義します。

もし、「functorを作る」が Functorクラスに相当するクラスを自作するという意味なら、
私はそのようなものは作りません。

425 :デフォルトの名無しさん:2013/12/06(金) 07:56:19.81
オーム社9時まで玄箱クラウド増強中か

426 :デフォルトの名無しさん:2013/12/06(金) 09:26:05.13
思い出したErlangの本だしてたのもω社だったか

427 :デフォルトの名無しさん:2013/12/06(金) 11:06:00.00
Platform 2013.4.0.0 コネ━━('A`)━━!!!
timetableの更新だけでもしていただければありがたいのですが...

428 :デフォルトの名無しさん:2013/12/06(金) 12:43:09.27
Platformに頼ってるからそうなる

429 :デフォルトの名無しさん:2013/12/06(金) 12:57:18.22
ω社は Haskell に力を入れているのか

430 :デフォルトの名無しさん:2013/12/06(金) 13:13:41.52
宣伝乙

431 :デフォルトの名無しさん:2013/12/06(金) 21:00:47.09
>>424
ありがとうございます。
質問の意図は前者でした。

432 :デフォルトの名無しさん:2013/12/06(金) 21:21:01.16
>>406
> コンパイラは構文の形しか見ません。

それは Common Lisp (というか他の Lisp でも同じだと思うけど) と同じですね。
もっと踏み込んで関係を表現する方法とかも GHC ならこっそり入ってそうな気がしたけど、それは過大評価かな。

433 :デフォルトの名無しさん:2013/12/06(金) 22:04:59.54
>>432
「もっと踏み込んで関係を表現する方法」って例えばどういうの?

「こっそり入れる」ってどういうこと?
リリースノートに記載がないってこと?

今まで何かこっそり入ってたことってあったっけ・・・

434 :デフォルトの名無しさん:2013/12/06(金) 22:34:58.09
>>422
書籍版半額にしろや

435 :デフォルトの名無しさん:2013/12/06(金) 22:37:41.09
すごいH本に関して言えば電子版の方がカラフルで良いぞ

436 :デフォルトの名無しさん:2013/12/07(土) 16:37:02.17
モジュールをインポートする方法について謎な挙動に遭いました。

repa を使っているのですが、次のように記述すれば問題なくコンパイルにパスします。

import Data.Array.Repa (Z, (:.), DIM2)
import Data.Array.Repa.Index

しかし、次のように Index の方をインポートしないと、

import Data.Array.Repa (Z, (:.), DIM2)

次のエラーが出ます。

Not in scope: data constructor `:.'
Not in scope: data constructor `Z'

次のように記述しても、同様のエラーが出ます。

import Data.Array.Repa
import Data.Array.Repa.Index (Z, (:.), DIM2)

また次のように記述しても、同様のエラーが出ます。

import Data.Array.Repa (Z, (:.))
import Data.Array.Repa.Index (DIM2)


Data.Array.Repa のソースを見ると、
そこから module Data.Array.Repa.Index がエクスポートされているように見えます。

なぜ import Data.Array.Repa の方の記述だけではエラーが出るのでしょうか。

437 :デフォルトの名無しさん:2013/12/07(土) 21:11:15.24
(:.) (..)

438 :436:2013/12/07(土) 21:53:52.95
>>437
ごめんなさい、レスの意図がよく分かりませんでした。

もう少し詳細に説明していただけると助かります。

439 :デフォルトの名無しさん:2013/12/07(土) 21:56:00.72
(^ ^;)

440 :デフォルトの名無しさん:2013/12/07(土) 22:19:01.83
>>438
import Data.Array.Repa (Z,(:.)(..),DIM2)  ってことじゃね?

441 :436:2013/12/07(土) 22:45:35.92
>>437 >>440
アドバイスの意図がやっと分かりました。

そして、Haskell 2010 Language Report の [5.3 Import Declarations] を調べてみて、
アドバイスの意味も分かりました。

つまり私は、型構築子 Z と (:.) をインポートしたが、
それぞれの値構築子の方はインポートしていなかったために、
ソース中でそれらを使っている箇所でエラーが報告されていたわけですね。

たまたま型構築子と値構築子が同名なので、質問してレスされるまで気づけなかった、と。

ありがとうございました。

442 :デフォルトの名無しさん:2013/12/08(日) 22:41:17.52
GHCは悪くないよ
悪いのは大抵ぼくの方だ(´・ェ・`)

443 :デフォルトの名無しさん:2013/12/09(月) 04:10:09.61
「:? とタイプして幾つかのヘルプを表示させなさい」と本に書いてあるけど、
ghciで画面が流れてしまって見れなくて困っている。

また、コマンドや関数を調べたい時にはどうすればよい?

444 :デフォルトの名無しさん:2013/12/09(月) 04:24:46.05
> 443
> コマンドや関数を調べたい時にはどうすればよい?

それが :? で出てくるわけだが。
画面が流れるのはターミナルの設定をいじれば履歴を残す行数はいくらでも増やせるだろう。
個人的には Emacs 使えと思う。

445 :デフォルトの名無しさん:2013/12/09(月) 06:19:20.21
>>443
ghciにはあまり親切なヘルプ機能がないからwebを参照するのが良い

GHCマニュアル、ghciコマンドの節
http://www.haskell.org/ghc/docs/7.6.3/html/users_guide/ghci-commands.html

関数名からドキュメントを検索
http://holumbus.fh-wedel.de/hayoo/hayoo.html

446 :デフォルトの名無しさん:2013/12/09(月) 14:05:38.48
ありがとう。解決できた。

ghciコマンドについてはスクロールで
w3mでwebを参照して、関数名は w3m あたりで http://holumbus.fh-wedel.de/hayoo/hayoo.html?query=検索する関数名
で助かった。

447 :デフォルトの名無しさん:2013/12/11(水) 16:41:44.81
新しいgtk2hsが一発でインスコできて感動した
二年前にはクソ苦労した記憶があるんだよな・・・

448 :デフォルトの名無しさん:2013/12/11(水) 20:08:46.77
windowsならその勢いでyiもインストールしてみて欲しい
そして絶望しろ

449 :デフォルトの名無しさん:2013/12/12(木) 00:55:14.10
もうWindows 2000 でHaskell は楽しめない
Haskell は僕らを見放したんだ(´・ェ・`)

450 :139:2013/12/12(木) 05:20:27.80
>>449
Windows捨てろ。

451 :デフォルトの名無しさん:2013/12/12(木) 07:27:00.62
マゾヒストなんだよ

452 :デフォルトの名無しさん:2013/12/17(火) 13:08:09.15
モジュールのインポートについて質問というか疑問があるんですけど
比較的汎用に使えそうな自作のモジュールってどこに置いてどうアクセスするのが普通なんでしょうか?
というのも自分としては、
./HaskellProg/
 /util/
 /project1/
 /project2/
 ...
みたいな感じでHaskellProgフォルダ以下にサブフォルダを作って
汎用モジュール用のutilフォルダと個別プロジェクトフォルダとを置いていこうと考えていたんですが、
util以下に置いたモジュールファイルにproject1フォルダの中から読む手段が、ぐぐっても全然わからないんです
自分のサブフォルダにある分にはスラッシュをドットに置き換えてimportすればいいというのは分かるんですけど…
コンパイラーのオプションに -i dirsとやれば探索パスを追加出来るという情報も見たのですが、
これもやはり上の階層へは辿れないみたいです
上の階層にアクセスする方法がちゃんとあるのか、それともそもそもアプローチが間違ってるのか、
アドバイスよろしくお願いします
環境は Haskell Platform 2013.2.0.0 for Windows、 OSはWin7 Pro 64bitです

453 :デフォルトの名無しさん:2013/12/17(火) 16:02:58.87
cabal install

454 :デフォルトの名無しさん:2013/12/17(火) 16:09:59.27
モジュール表記を、
module Util.Lib where ...
module Project1.Main where ...
みたいにしてHaskellProg直下からコンパイルすれば良いような

455 :デフォルトの名無しさん:2013/12/17(火) 17:21:41.10
上の階層は..で辿れないか?

456 :デフォルトの名無しさん:2013/12/17(火) 21:31:51.00
cabalでパッケージとしてまとめてsandbox add-sourceする

457 :デフォルトの名無しさん:2013/12/17(火) 22:45:31.16
cp ../project1/* -t .
rm -R ../project1/

458 :デフォルトの名無しさん:2013/12/18(水) 08:10:45.70
Haskell Platform 2013.4.0.0 マダーマチクタビレタ
幻になってしまうのか

459 :デフォルトの名無しさん:2013/12/18(水) 08:22:19.44
何故待ち望んでいるの?

460 :デフォルトの名無しさん:2013/12/18(水) 11:41:29.00
64bit対応してくれるからじゃなかったっけ

461 :デフォルトの名無しさん:2013/12/18(水) 12:37:38.11
何度でも言うが、最新のGHCをインストールして使え

462 :デフォルトの名無しさん:2013/12/18(水) 13:41:12.55
json形式のデータをSocket(Stream)を使って送受信したいのですが、
お薦めパッケージがあれば教えてください。

463 :デフォルトの名無しさん:2013/12/18(水) 15:37:27.38
jsonとHaskellの型を合わせるのが大変だったんで二度とやりたくない
お薦めパッケージは特にないごめんよ

464 :デフォルトの名無しさん:2013/12/18(水) 16:39:40.01
>>463
ぐぬぬ...jsonやめてxmlにします。

レスありがとうございました。

465 :デフォルトの名無しさん:2013/12/18(水) 16:40:56.36
っYAML

466 :デフォルトの名無しさん:2013/12/18(水) 16:55:39.34
json schema広まらなかったね・・・

467 :デフォルトの名無しさん:2013/12/18(水) 17:13:19.77
>>465
ありがとうございます。

msgpack-rpc
http://hackage.haskell.org/package/msgpack-rpc

開発者が日本人のようなので、これにしようかと思います。

468 :デフォルトの名無しさん:2013/12/18(水) 17:51:45.34
aeson一択

469 :デフォルトの名無しさん:2013/12/18(水) 19:06:52.96
>>467
https://gist.github.com/repeatedly/5011298

470 :デフォルトの名無しさん:2013/12/19(木) 15:20:47.51
>>468
aesonは通信周りの面倒は何もみてくれませぬ・・・

>>469
情報、ありがとうございます。
一読しましたが、問題無さそうです。

471 :デフォルトの名無しさん:2013/12/23(月) 00:57:37.05
hoge >>= \[x] -> 〜
do { [x] <- hoge; 〜
って微妙に違うのね 〜

472 :デフォルトの名無しさん:2013/12/23(月) 11:22:11.39
型定義をみていたら、値コンストラクタのフィールドで
型の前に「!」ついてたりするのを見るんだけど、
どういう意味なのか教えてください。

473 :デフォルトの名無しさん:2013/12/23(月) 11:30:58.36
>>472
正格評価になる。

474 :デフォルトの名無しさん:2013/12/23(月) 11:43:39.05
bang pattern って名前が付いてる
http://www.haskell.org/ghc/docs/7.4.1/html/users_guide/bang-patterns.html

475 :デフォルトの名無しさん:2013/12/23(月) 11:58:09.14
>>473
>>474

ありがとう。

haskell !

とかググって困ってたので、助かりました。

476 :デフォルトの名無しさん:2013/12/23(月) 13:00:45.48
Control.Concurrent モジュールの MVar を使った簡単なデッドロックなんだが、

main = newEmptyMVar >>= takeMVar

これ、ハングアップするんじゃなくて、
例外 BlockedIndefinitelyOnMVar が投げられるんだな

便利でいいんだが、どういう仕組みでデッドロックを検知してるんだろ
けっこう単純な仕組みなのかな

477 :デフォルトの名無しさん:2013/12/23(月) 15:48:22.24
例外というかシグナルを投げてるのはrts側だな
MVarもrts側にプリミティブありそれとGCの機構を利用して上手くデッドロック起こしてるスレッドを回収してそのタイミングでシグナル投げる
みたいな仕組みになってるようだ
ただどうやってこのコードによて到達不可能なスレッドオブジェクトになるかっていうのはちょっとコード見ただけじゃわからなかった

478 :476:2013/12/23(月) 16:21:49.77
>>477
結構複雑なことしてるっぽいね
プログラム側からGCの機構にアクセスできるんだね、初めて知った
それとも、アクセスしてるんじゃなくて、たまたま上手く利用できてるだけかな

当然、全てのデッドロックを検知してくれるとは思えんが、
どこまで賢いのか、暇があったら検証してみるよ

ところでこれ、-O2 でコンパイルしてもデッドロックを検知してくれる
この場合は余計な処理をしないで、処理速度の最適化に専念して欲しいんだがなぁ・・・

479 :デフォルトの名無しさん:2013/12/23(月) 20:38:43.45
GHCだとスレッドがGCの回収対象になってる
ブロックしてるスレッドのスタックはGCのルートにならなくて、
他から参照されなくなった時点でGCされる
(他から参照というのは、ブロックしてるMVarを他スレッドが持ってたり、
ThreadIdオブジェクトを持たれてる場合)

スレッドがGCされるとき、黙って消されるんじゃなくてrtsが例外を投げてくれる

480 :476:2013/12/23(月) 23:00:30.74
>>479
> スレッドがGCされるとき、黙って消されるんじゃなくてrtsが例外を投げてくれる

>>476 の例でも、スレッドがGCされるから、その際にMVarがブロックされ続けている事が分かり、
だから例外 BlockedIndefinitelyOnMVar が投げられるってこと?

ブロックされているのにスレッドがGCされるの?

仕組み以前に、挙動もイマイチ分からんから、別の例を作ったんだが、

main :: IO ()
main = do
m <- newEmptyMVar
forkIO (takeMVar m >> return ())
forever $ print 1

これだと、例外が投げられることもなく、永遠に 1 が印字され続けるが、また別の例

main = do
m <- newEmptyMVar
forkIO (takeMVar m >> return ())
print [1..10000]
_ <- takeMVar m
print [20000..30000]

これだと、10000まで印字されて、20000以降が印字される前に例外が投げられる

要するに、ブロックされているMVarに「全てのスレッドがアクセスしようとした時点」で、
例外が投げられるということなのかな?

481 :デフォルトの名無しさん:2013/12/24(火) 00:06:17.06
>>480
>ブロックされているのにスレッドがGCされるの?
される。そのMVarが他のスレッドから参照されていないなら
永遠にブロックされ続けることが保証されるからGCして問題ない

>これだと、例外が投げられることもなく、永遠に 1 が印字され続けるが
実際にはそのコードでも例外が投げられてる
メインスレッドじゃないから何も表示されてないだけ
明示的にprintしてやれば分かる

import Control.Concurrent
import Control.Exception
import Control.Monad

main :: IO ()
main = do
 m <- newEmptyMVar
 _ <- forkIO $
  takeMVar m `catch` \e ->
   putStrLn ("Exception: " ++ show (e :: SomeException))
 forever $ do
  print (1::Int)
  threadDelay 10000

482 :デフォルトの名無しさん:2013/12/26(木) 21:56:11.68
newtype T = D Int

こういう型の値 x があったとして、newtype で宣言してあるから

let D i = x ってやって値構築子を外すのも、
逆に let y = D i ってやって値構築子をかぶせてやるのも、
オーバーヘッドなしで実行されると考えていいんだよね?

483 :デフォルトの名無しさん:2013/12/27(金) 00:06:31.65
コンパイル時に除去されるんだっけ?

484 :デフォルトの名無しさん:2013/12/27(金) 06:13:27.23
>>482
いいよ

485 :デフォルトの名無しさん:2013/12/27(金) 06:55:17.65
ありがと、安心して使うよ

486 :デフォルトの名無しさん:2013/12/31(火) 11:24:40.65
cabal でパッケージのドキュメントだけインストールって、どうやったらできる?
ライブラリごと再インストールしかない?

487 :デフォルトの名無しさん:2013/12/31(火) 12:39:02.88
ハドックオプションでキャバるだけでしょ

488 :デフォルトの名無しさん:2013/12/31(火) 12:40:01.59
あ、何でもない。

489 :486:2013/12/31(火) 13:10:43.55
--hahhock-hyperlink-source オプションを付けて cabal install したんだが、
hscolour プログラムがインストールされていなかったことにあとから気づいたんだ。

これがインストールさけていないと、--hahhock-lhyprtink-source オプションを付けても
html ドキュメントが生成できずにインストールされない。
(ライブラリ自体は問題なくインストールされる)

で、hscolour プログラムをインストールしたんで、
ライブラリだけ後からでもインストールできないかなと思った次第。

パッケージを cabal unpack で落としてきて、
そこから cabal haddock でドキュメントを作ることはできた。
でも、それを正しくインストールする方法がわからない。


まぁ、まだ4、5個くらいしかパッケージをインストールしていない状態だから、
今なら全部はじめから再インストールでもいいんだけどね。

490 :デフォルトの名無しさん:2013/12/31(火) 13:43:22.59
*.haddockを再生成せにゃならんからな
となると通常の方法ではソースコードも見ないとならんわけで再インストールしか無いのではなかろうか
cabalやhaddockのAPI叩けばhaddock関連をやるだけのcabal-installみたいなものも作れるとは思えるが
わざわざそんなものを作るほどの事でもないのだろう

491 :486:2013/12/31(火) 13:55:05.49
>>490
> わざわざそんなものを作るほどの事でもないのだろう

まぁ、今回はね。
さっさと再インストールすることに決めた。

ただ、今後ドキュメントだけを再インストールしたい、
あるいは一部のドキュメントだけアンインストールしたいなんてことがあった時のために、
方法があれば備忘録に書き留めておこうかなと。

(前に、OpenGL系のライブラリを依存性の関係で2バージョンインストールしたことがあって、
その時もドキュメントは片方だけでいいのに、それも2つ表示されて目障りなこどあったし)

492 :デフォルトの名無しさん:2014/01/01(水) 11:59:21.25
正規表現で、"abccdddefddddes" という文字列に、
dが3回以上続く文字列があるかどうか調べたいんだけど、
どうやってやればいいの?

regex-posix パッケージだけで事足りる?

493 :デフォルトの名無しさん:2014/01/01(水) 12:05:11.75
Prelude Text.Regex.Posix> "abccdddefddddes" =~ "ddd" :: Bool
True

494 :デフォルトの名無しさん:2014/01/01(水) 12:06:22.78
sed -ne '/d\{3,\}/p'
の要領じゃないか?
{3,}
で回数制限。

495 :デフォルトの名無しさん:2014/01/01(水) 12:56:23.35
>>493
>>494
regex-posix パッケージをインストールし、

"abccdddefddddes" =~ "ddd" :: Bool
"abccdddefddddes" =~ "d{3,}" :: Bool

の両方ともできることを確認しました。

ありがとうございました。

496 :デフォルトの名無しさん:2014/01/01(水) 13:08:25.00
すいません、もうひとつ質問。

Char型のリストだけでなく、任意の型のリストで正規表現はできない?

たとえば [True, False, False, True, True, False, True] の中に、
False の後 True が n 回続くサブリストがあるか、みたいな。

497 :デフォルトの名無しさん:2014/01/01(水) 13:11:01.14
ParseCか、showで文字列にして連結してから正規表現使う方法しか思いつかない

498 :デフォルトの名無しさん:2014/01/01(水) 13:22:40.52
toChar :: Bool -> Char
toChar True = 'a'
toChar False = 'b'

ghci> map toChar [True, False, False, True, True, False, True]
"abbaaba"

499 :デフォルトの名無しさん:2014/01/01(水) 13:40:53.50
>>497
>>498
やはり、一度 Char 型にマップしないといけないのか。

そして、正規表現にヒットしたサブリストを得るのなら、
更に Char 型から元の型にマップする、と。

直接できればよかったが、もう探している時間も無いので、
今回はこの方法で乗り切ることにするよ。

二人共ありがとう、助かったよ。

500 :デフォルトの名無しさん:2014/01/01(水) 14:11:20.99
正規表現を使う以上は文字に変換するしかないと思います
文字に変換しているのをユーザーに意識させないような関数は
あるかもしれませんが

501 :デフォルトの名無しさん:2014/01/01(水) 14:22:21.24
任意のリストに対する正規表現を書くことは可能だけど、良いライブラリがあるかは知らね
http://hackage.haskell.org/package/harp
とか

502 :デフォルトの名無しさん:2014/01/01(水) 14:58:26.21
オートマトンを実装すればいいんじゃね?そんな難しくないし

503 :デフォルトの名無しさん:2014/01/02(木) 02:03:42.61
>>502
オートマトンはデバッグで発狂する

504 :デフォルトの名無しさん:2014/01/02(木) 06:13:38.29
Haskellで状態遷移を持つオートマトンって、どうやって書くの?

505 :デフォルトの名無しさん:2014/01/02(木) 06:34:57.71
iを入力の型、oを出力の型、sを状態の型とすると、
i -> s -> (o, s)
という型の関数と(初期状態::s)の組でオートマトンを表現できる
実際には問題によって良い表現が違うけど

506 :デフォルトの名無しさん:2014/01/02(木) 09:18:23.38
正規表現は美しくないと思うからそのくらいは自力で関数作りたいな

507 :499:2014/01/02(木) 10:01:45.56
すまん、せっかくのアドバイスだが、もう時間がないんで文字列経由で実装した。
(オートマトンも実奏している余裕がない)

ただ、>>501 が紹介してくれた harp は興味あるから、
来週ぐらいにも腰を据えていろいろ実験してみようと思う。

ただ、そのパッケージダウンロードページから飛べる Home page の URL が死んでるんだが・・・
ドキュメントを見ても、使い方が分からん。

おそらく Match e a が正規表現のパターンで、これとテストしたいリストに
runMatch 関数を適用することで結果が得られるのだと思うが、
Match e a の作り方がよく分からんな。

あと、We have implemented HaRP as a pre-processor to ordinary Haskell.
この一文も気になる。

508 :デフォルトの名無しさん:2014/01/10(金) 23:31:04.34
Persistent でデータベースにアクセスする方法を調べてるんだが、よく分からん。

share [mkPersist sqlSettings, mkMigrate "migrateAll"] [persistLowerCase|
TestTable
 number Int
 name String
|]

というテーブルで、number 列を PRIMARY KEY にしたいんだが、どうすればいい?

509 :デフォルトの名無しさん:2014/01/11(土) 00:59:19.01
persistent-templateを使うならサロゲートキーにしないといけないからそれは無理

510 :デフォルトの名無しさん:2014/01/11(土) 15:44:07.63
>>509
なるほど、そういうことか

ありがと

511 :デフォルトの名無しさん:2014/01/11(土) 15:53:53.92
type Adapt1 f t1 = Adapt f t1 (IO CInt) -> t1 -> String -> IO()
ってどういう文法しょうか?
->のこんな使い方を初めて見たのでどういう文法なのかさっぱりわかりません。

512 :デフォルトの名無しさん:2014/01/11(土) 15:55:51.06
>>511
ふつうの型シノニムじゃね?
Adapt1 f t1
は、
Adapt f t1 (IO CInt) -> t1 -> String -> IO ()
という型の略記

513 :デフォルトの名無しさん:2014/01/11(土) 16:50:25.39
>>511
a -> b は aをとってbを返す関数 を表す"型"
型だから型シノニムを使ってそういう風に別名を定義できる

514 :デフォルトの名無しさん:2014/01/11(土) 20:12:41.93
>>512>>513
型シノニムを書く時に、型シグニチャが入っていていいんですか?
Adapt f t1 :: (IO CInt) -> t1 -> String -> IO()
type Adapt1 f t1
なら分かるのですが。

515 :514:2014/01/11(土) 20:20:46.14
いや、上の投稿はおかしかったです。
>>513
よく読んだら、
a->bが型そのもので、型シグニチャではないんですね。なんとなく分かりました。

516 :デフォルトの名無しさん:2014/01/11(土) 23:38:22.92
>>515
ghciで:i (->)ってやってみるともう少し理解できるかも

517 :デフォルトの名無しさん:2014/01/13(月) 20:12:50.25
コンソールアプリで Tab キーによる文字列補完能力を持つ入力機能がほしいんだが、
自前で getChar で Tab の文字コードを拾って、とかやらないといけないのかな。

なにか良いライブラリはある?

518 :デフォルトの名無しさん:2014/01/13(月) 20:36:59.21
haskeline

519 :デフォルトの名無しさん:2014/01/13(月) 21:25:13.69
ありがと

520 :デフォルトの名無しさん:2014/01/13(月) 21:27:10.40
\ハスケリーン/

521 :デフォルトの名無しさん:2014/01/15(水) 19:08:08.48
ガリガリとオートマトンやパーサーを実装するときって、どんな図を描いてコーディングするの?

522 :デフォルトの名無しさん:2014/01/15(水) 19:59:41.79
オートマトンを実装するときに状態遷移図を書くことはある
パーサのために図を書いた経験はない

523 :デフォルトの名無しさん:2014/01/15(水) 20:03:56.00
パーサはコードが一番分かりやすいもんな

524 :デフォルトの名無しさん:2014/01/16(木) 10:42:46.31
構文図?

525 :デフォルトの名無しさん:2014/01/16(木) 23:56:25.55
>>523
パーサは正規表現があると途端に読めなくなる

526 :デフォルトの名無しさん:2014/01/17(金) 21:44:15.09
Persistent の select 系関数って、
SQL でいう SELECT * FROM のタイプしかできないの?

全体じゃなくて特定の列のみ読み取るってのは、
select 系関数の戻り値から取捨選択するしか方法ない?

527 :デフォルトの名無しさん:2014/01/18(土) 22:38:41.17
>>526
その方法と、SQLを書くことになるけどrawSqlを使う方法もある

528 :デフォルトの名無しさん:2014/01/19(日) 17:23:25.23
main::IO()
main = do cs <- getContents
putStr $ lastNLines 10 cs
lastNLines::Int -> String -> String
lastNLines n cs = unlines $ taleLast n $ lines cs
--takeLastの関数の引数の型、返り値の型がわかりません
takeLast n ss = reverse $ take n $ reverse ss

529 :デフォルトの名無しさん:2014/01/19(日) 20:47:40.83
>>528
ghciにロードして
:t takeLast

530 :デフォルトの名無しさん:2014/01/20(月) 04:27:32.23
tupleに対するfmapが第二要素にしか関数を適用しないのはなぜ?

instance Functor ((,) a) where
fmap f (x,y) = (x, f y)

http://hackage.haskell.org/package/base-4.6.0.1/docs/src/GHC-Base.html#fmap

531 :デフォルトの名無しさん:2014/01/20(月) 04:33:53.86
ええとfmap f (x, y) = (f x, f y)じゃだめなのかという意図の質問です

532 :デフォルトの名無しさん:2014/01/20(月) 04:47:48.71
型が合わないじゃん

533 :デフォルトの名無しさん:2014/01/20(月) 05:05:18.81
あっ、すいませんボケてました
f :: b -> a
(,) :: a -> b -> (a, b)

534 :デフォルトの名無しさん:2014/01/20(月) 19:22:13.68
>>527
そっか

今のところ select 系関数の戻り値から取捨選択する方法で困ってるわけではないから、
本当に rawSql が必要な場合以外は今の方法でやっていくことにするよ

ありがと

535 :デフォルトの名無しさん:2014/01/20(月) 20:48:18.36
pearls of Functional Algorithm Design

これの和訳ってどうなったんだろ
頓挫してないよね?

536 :デフォルトの名無しさん:2014/01/20(月) 23:00:10.07
main = do cs <- getContents
putStr $ expand cs
expand :: String -> String
expand cs = concat $ map expandTab cs
expandTab :: char -> String
expandTab c = if c == '\t' then " " else [c]
expandTabの引数の型がStringではなく、Charであるのは何故ですか
[Char]ならわかるのですが
教えてください。よろしくお願いいたします

537 :デフォルトの名無しさん:2014/01/20(月) 23:12:36.31
>>536
それはちょっと基本的すぎる見落としだな。
map の型を見よ。

538 :デフォルトの名無しさん:2014/01/20(月) 23:12:41.79
cs が[Char]だからじゃね?

539 :デフォルトの名無しさん:2014/01/20(月) 23:17:46.22
mapの型は (a -> b) -> [a] -> [b]
csがStringなんだからaはCharだよね

540 :デフォルトの名無しさん:2014/01/20(月) 23:18:57.04
>>537
第一引数が、aを引数にとり、bを返す関数と、第二引数がリストですよね…

541 :デフォルトの名無しさん:2014/01/20(月) 23:24:53.70
>>539
ここではaがChar、bがStringということでしょうか

542 :デフォルトの名無しさん:2014/01/20(月) 23:26:00.70
だめだ、Haskell難しすぎます
Rubyに帰ろうと思います
みなさんありがとうございました

543 :デフォルトの名無しさん:2014/01/20(月) 23:27:06.95
>>541
そう。それをconcatしてるから
expandの型は String -> String

544 :デフォルトの名無しさん:2014/01/20(月) 23:28:02.58
Rubyのほうがよっぽど難しいと思うがなあ…

545 :デフォルトの名無しさん:2014/01/20(月) 23:34:55.82
mapはexpandTabとcsを引数にとる
cs(String(リスト))は[a]にあたるから、aはCharである
こういうことでしょうか

546 :デフォルトの名無しさん:2014/01/20(月) 23:35:13.68
そういう態度だから普及しないんだよ

547 :デフォルトの名無しさん:2014/01/20(月) 23:39:11.46
良いモノは普及させる
本当に良いモノは普及させない

548 :デフォルトの名無しさん:2014/01/20(月) 23:43:01.52
csはString、すなわちCharのリスト
mapの第二引数[a]は、[Char]に置き換えられるから、aはChar

549 :デフォルトの名無しさん:2014/01/21(火) 00:02:37.95
map :: (a -> b) -> [a] -> [b]

map :: (Char -> [Char]) -> [Char] -> [[Char]]
a = Char
b = [Char]

-- Stringは[Char]と同じ
type String = [Char]

map :: (Char -> String) -> String -> [String]

550 :デフォルトの名無しさん:2014/01/21(火) 00:03:10.55
つか>>536の定義って変ですよね?

551 :デフォルトの名無しさん:2014/01/21(火) 00:05:06.46
型はとりあえず置いておいて、適当な例で動かしてみれば分かるんじゃない?

expand "ab¥tc"
expand ['a','b','¥t','c']
concat $ map expandTab ['a','b','¥t','c']
concat [expandTab 'a',expandTab 'b',expandTab '¥t',expandTab 'c']
concat ["a","b"," ","c"]
"ab c"

552 :デフォルトの名無しさん:2014/01/21(火) 00:09:08.45
あ、スペースが潰れてたのか。自己解決しました。

553 :デフォルトの名無しさん:2014/01/21(火) 08:09:27.66
>>547
そんなつまんない理由なのか。
あたくしのなんか普及したら人類が滅んでしまうから公開してないのに。

554 :デフォルトの名無しさん:2014/01/21(火) 16:03:34.10
>>553
おい、そんなこといっていいのか?
お前のプログラム、闇プログラマに狙われるぞ

555 :デフォルトの名無しさん:2014/01/21(火) 16:38:21.70
おまいら何処でハスケル使ってんのよ。
実務で使ってる人数人しか知らんのだけど。
つかどんな仕事してんの

556 :デフォルトの名無しさん:2014/01/21(火) 16:39:30.41
ttp://janestreet.com/

557 :デフォルトの名無しさん:2014/01/21(火) 17:21:40.39
>>554
ロシアのハッカーとかですか?
あたくしは不用意に>>556などを踏んでIP抜かれたりしませんし。
それにあたくしのタワゴトを信じる人は皆無でしょ?

558 :デフォルトの名無しさん:2014/01/21(火) 17:28:35.51
https://www.sc.com/sg/

559 :デフォルトの名無しさん:2014/01/21(火) 18:20:35.59
>>557
闇プログラマもjanestreetもしらんとは、精進しろ

560 :デフォルトの名無しさん:2014/01/21(火) 19:32:39.42
スレの知能レベルから推測するに、去年からHaskellが中学校の必須科目にでもなったのかな?

561 :デフォルトの名無しさん:2014/01/21(火) 19:34:50.15
正誤表

x スレ

o 板

562 :デフォルトの名無しさん:2014/01/21(火) 23:33:07.70
>>560
英語が小学校、関数型とデータマイニングが中学での履修範囲になったよ

563 :デフォルトの名無しさん:2014/01/21(火) 23:47:39.49
小学生向けの習い事教室にならないから不思議

564 :デフォルトの名無しさん:2014/01/21(火) 23:48:37.66
>>562
マジで。手続き型が許されるのは小学生迄よねwwwとか言われる時が来るのか(´・_・`)

565 :デフォルトの名無しさん:2014/01/21(火) 23:58:29.57
四半世紀後には、大学の専門必修でgrassとbrain f*ckを教えるらしいよ
もっとも、今だってムダしか教えてないけど

566 :デフォルトの名無しさん:2014/01/22(水) 12:16:46.00
大学とかの悪口は結局自虐にしかならないぞ
学習しないんだな

567 :デフォルトの名無しさん:2014/01/22(水) 13:49:13.76
学習しないんだな(キリッ

568 :デフォルトの名無しさん:2014/01/22(水) 16:48:50.61
ほとんどの大学は情報学科でhaskellなんてならわない
むしろ数学科のほうが学ぶ可能性が高い
名大は数学科だと定理証明系を習うみたいだね

569 :デフォルトの名無しさん:2014/01/22(水) 17:53:08.43
定理証明系の使い方を習うのか、定理証明系を作るための理論を習うのか

570 :デフォルトの名無しさん:2014/01/22(水) 18:00:35.02
情報学科って、prolog、schemeが標準?
パッと見、定理証明の方が開発に役立ちそうなんだけど

571 :デフォルトの名無しさん:2014/01/22(水) 18:01:47.48
>>566
Youtubeに上がってる動画の方がマシってな講義してんじゃねーよカス共

572 :デフォルトの名無しさん:2014/01/22(水) 18:04:39.66
prolog、schemeなんてやるのはいい大学だけ
中堅私大ぐらいだとせいぜいjava

573 :デフォルトの名無しさん:2014/01/22(水) 18:46:06.82
そろそろ中堅私大でも計算機学科はHaskell教えてるんじゃない?

情報と称してるだけで計算機科学をろくにやってないようなとこならともかく。

574 :デフォルトの名無しさん:2014/01/22(水) 18:55:27.03
中堅私大のカリキュラムはある程度でオブジェクト指向を教える
それにhaskellは向いてないから微妙だと思うが
haskell教えてる大学があるなら具体的にどこだよ

575 :デフォルトの名無しさん:2014/01/22(水) 19:14:42.22
某旧帝の数学科だけど授業で触れたことあるのはRubyとCくらいだなー あとOctaveとか
ちなみにRubyは完全にただの手続き型言語として使われていた

576 :デフォルトの名無しさん:2014/01/22(水) 19:52:34.73
エディンバラ

577 :デフォルトの名無しさん:2014/01/22(水) 20:36:57.60
haskell site:ac.jp でググると研究室レベルでやってるとこは山ほどあるな

578 :デフォルトの名無しさん:2014/01/22(水) 20:45:50.61
習ったことしかできないのがエリートω

579 :デフォルトの名無しさん:2014/01/22(水) 20:48:49.86
習ってすらいないのがボンクラ

580 :デフォルトの名無しさん:2014/01/22(水) 20:52:26.31
>>568
おみゃーさん、大学名の略称は格好悪いでよ。

581 :デフォルトの名無しさん:2014/01/22(水) 21:14:15.22
ある程度でオブジェクト指向を教えるようなところなら関数プログラミングも教えるだろ。

582 :デフォルトの名無しさん:2014/01/22(水) 21:25:13.32
>>572
出身大学の偏差値なんて50きってたがPrologならやったぞ

583 :デフォルトの名無しさん:2014/01/22(水) 21:28:11.02
行き遅れのアホ教授と思っていたけど、Erlangのおかげで飯ウマかしら

584 :デフォルトの名無しさん:2014/01/22(水) 21:51:48.49
prologは推論の基本を学ぶにはちょうどいい。他の言語は全部ダメ。

585 :デフォルトの名無しさん:2014/01/22(水) 22:52:17.73
DFS、BFS、宣教師と人喰い土人までProlog
HaskellでAPI叩いてるだけのヤツらはアホに見える

586 :デフォルトの名無しさん:2014/01/22(水) 23:07:17.89
計算機科学でHaskellとか何の冗談だよ

587 :デフォルトの名無しさん:2014/01/22(水) 23:17:34.96
computer science > programming language > Haskell

588 :デフォルトの名無しさん:2014/01/22(水) 23:25:08.49
高卒から見ると計算機科学=プログラミングなのか?

589 :デフォルトの名無しさん:2014/01/22(水) 23:39:14.18
原始時代?

590 :デフォルトの名無しさん:2014/01/22(水) 23:52:08.15
ソフトウェアデザインの最新号がまた関数型言語の特集だな

591 :デフォルトの名無しさん:2014/01/23(木) 00:40:17.78
>>588
そんなバカバカしい言葉にプライドを持っているのなんて、
せいぜい学科にいる教授と学生ぐらいだろう

592 :デフォルトの名無しさん:2014/01/23(木) 02:02:48.58
なんだ、大学院生(博士課程)というものになんか幻想を持ってるのか?

計算機科学とHaskellにつながりがないとか、それこそ酷い冗談だな。
なにか計算機科学というものを根本的に勘違いしてるだろ。

593 :デフォルトの名無しさん:2014/01/23(木) 06:33:04.45
>>588
Haskellに関する海外の論文に、こういう分類がされてたの。
もしかして日本だと違ったりするの?w

594 :デフォルトの名無しさん:2014/01/23(木) 08:58:13.85
>>593
すまん>>587へのレスじゃ無いんだ
計算機学科で特定のプログラミング言語を教えてるなんてアホなレスがあったからさ

595 :デフォルトの名無しさん:2014/01/23(木) 10:27:52.88
> 計算機学科で特定のプログラミング言語を教えてるなんてアホなレスがあったからさ

不特定の言語を教えてる学科があるなら教えてくれ。

計算機学科の学部レベルのプログラミング教育が、言語を指定せず、
任意の言語を使って教育できる、ということを示せたらチューリング賞も夢じゃないからな。

596 :デフォルトの名無しさん:2014/01/23(木) 10:50:07.91
「特定のプログラミング言語を教える」が「特定のプログラミング言語を使ってプログラミングを教える」にすり替わってて笑う

597 :デフォルトの名無しさん:2014/01/23(木) 11:38:55.01
結局デタラメを言ってるだけじゃねーか

598 :デフォルトの名無しさん:2014/01/23(木) 11:40:21.82
> 計算機科学でHaskellとか何の冗談だよ
って発言したおバカさん。いつまでバカを言い続けるのかねぇ。

599 :デフォルトの名無しさん:2014/01/23(木) 11:55:20.33
そこまで粘着するほど悔しかったのか……。

600 :デフォルトの名無しさん:2014/01/23(木) 12:01:11.00
両者ともに何の根拠も示さずに罵倒しているだけなのが美しいな

601 :デフォルトの名無しさん:2014/01/23(木) 12:02:11.49
証拠が無いのはどう見ても片方だけだが

602 :デフォルトの名無しさん:2014/01/23(木) 12:11:24.23
おっ、Haskellerらしい話題で盛り上がってんね

603 :デフォルトの名無しさん:2014/01/23(木) 12:50:31.76
>>602
Haskellらしいってより2chらしい話題だと思うw

604 :デフォルトの名無しさん:2014/01/23(木) 13:21:24.00
>>595 チューティング賞と間違ってるぞ

605 :デフォルトの名無しさん:2014/01/23(木) 14:26:49.99
坊主憎けりゃ袈裟まで憎い
まあ最初何を憎んでいたのか忘れちゃってるんじゃないの

606 :デフォルトの名無しさん:2014/01/23(木) 19:51:24.62
流れをぶった切って申し訳ないが、質問させてくれ。

関数の型シグネチャのコンテキストの部分でチルダが使われているのはどういう意味?

こんな感じ f :: (C a ~ D) => ...

607 :デフォルトの名無しさん:2014/01/23(木) 20:05:37.30
ttp://stackoverflow.com/questions/10376963/why-doesnt-this-haskell-typeclass-code-work
これかな?

608 :デフォルトの名無しさん:2014/01/23(木) 20:05:47.76
>>606
equality constraintというGHC拡張で、(C a ~ D)なら(C a)とDが同じ型だという制約
http://www.haskell.org/ghc/docs/7.6.3/html/users_guide/equality-constraints.html

609 :606:2014/01/23(木) 20:10:38.47
ありがと

>>607
すまん、それは違うな。
それは r という型変数を Int に解釈するようにプログラムされてるが、
そんな解釈はできんぞ、というエラーの方だね。

>>608
知りたかったのはこっちの方だ。
きっと拡張機能だろうなとは思ったが、名前が分からず途方に暮れてた。
リンク先調べてみるよ。

610 :606:2014/01/23(木) 20:14:07.15
>>607
いや、チルダ記号が持つ意味は >>608 と同じか。

無下にしてすまんかった。

611 :デフォルトの名無しさん:2014/01/23(木) 20:15:11.80
どそまい

612 :デフォルトの名無しさん:2014/01/24(金) 00:57:43.67
ゴミみたいな話題と質問しか無いな

613 :デフォルトの名無しさん:2014/01/24(金) 01:10:18.40
JavaScriptで学ぶ関数型プログラミング
http://www.amazon.co.jp/dp/4873116600/

なんか面白そう

614 :デフォルトの名無しさん:2014/01/24(金) 04:22:34.27
す・れ・ち

615 :デフォルトの名無しさん:2014/01/24(金) 07:57:39.64
javascriptで学びたくねえw

616 :デフォルトの名無しさん:2014/01/24(金) 08:48:37.91
頭おかしいよな

617 :デフォルトの名無しさん:2014/01/24(金) 09:07:57.72
Joy of Clojure の人のやつか

618 :デフォルトの名無しさん:2014/01/25(土) 19:21:44.82
Listをimportしようとすると、
fgrep.hs:2:8
Could not find module 'List'
It is a member of the hidden package 'haskell98-2.0.0.1'.
Use -v to see a list of the files searched for.
とエラーを吐かれるのですが、どうしたらListをimportできますでしょうか

619 :デフォルトの名無しさん:2014/01/25(土) 19:30:45.09
Data.Listじゃないの?

620 :デフォルトの名無しさん:2014/01/25(土) 20:16:23.87
高階関数mapを自作してみました。mapの第一引数にはsquareを渡そうと思います。
map(f, list)
 int (*f)(int);
 char *list;
{
 char x = *list;
 char *xs = &list[1];
 if (x) {
  (*f)(x - 0x30);
  map(f, xs);
 }
}

square(n)
 int n;
{
 return n * n;
}

main(argc, argv)
 int argc;
 char **argv;
{
 map(square, "123");
}

621 :デフォルトの名無しさん:2014/01/25(土) 20:26:36.02
そうですか

622 :デフォルトの名無しさん:2014/01/25(土) 20:30:47.61
そのプログラミング言語、戻り値の型ってどうなってんの? 型推論?

623 :デフォルトの名無しさん:2014/01/25(土) 20:41:30.93
返り値はdefaultではint型ですよ

624 :デフォルトの名無しさん:2014/01/25(土) 20:43:27.19
(*f)(x - 0x30); これ何やってるの?

625 :デフォルトの名無しさん:2014/01/25(土) 20:48:50.90
関数(*f)に引数(x-0x30)を渡して呼んでる

626 :デフォルトの名無しさん:2014/01/25(土) 20:49:36.79
関数ポインタfを使って、square()の呼び出し
(x - 0x30)は引数で、0x30引いてるのはアスキーコードの引き算
結果として、数値の1、2、3が得られる

627 :デフォルトの名無しさん:2014/01/25(土) 20:51:39.40
C言語だから、スレチかな?

628 :デフォルトの名無しさん:2014/01/25(土) 21:00:51.51
import System
import List
main = do args <- getArgs
cs <- getContents
putStr $ fgrep (head args) cs
fgrep :: String -> String -> String
fgrep pattern cs = unlines $ filter match $ lines cs
where
match :: String -> Bool
match line = any prefixp $ tails line
prefixp :: String -> Bool
prefixp line = pattern 'isPrefixOf' line
>>618のエラーが出るのは何故でしょうか
GHCのバージョンは7.4.1です

629 :デフォルトの名無しさん:2014/01/25(土) 21:02:09.47
きくまでも なかろうよ!

630 :デフォルトの名無しさん:2014/01/25(土) 21:02:56.19
関数(*f)に引数(x-0x30)を渡して呼んで、その戻り値はどうなってるの?

631 :デフォルトの名無しさん:2014/01/25(土) 21:05:00.83
この例じゃ、その値は捨ててるね

632 :デフォルトの名無しさん:2014/01/25(土) 21:05:18.35
関数の書き方、古くね?

633 :デフォルトの名無しさん:2014/01/25(土) 21:06:24.30
>>628

>>619 を無視か

というか、それなら import System でもエラーじゃないのか?

634 :デフォルトの名無しさん:2014/01/25(土) 21:12:04.08
Systemのほうはエラーになりませんでした
ListをData.Listに書き換えたところ、今度はSystemのほうがエラーになりました

635 :デフォルトの名無しさん:2014/01/25(土) 21:21:16.61
>>634
じゃあ、System を System.Environment に変えろ

636 :デフォルトの名無しさん:2014/01/25(土) 22:01:10.28
Persist + Conduit について質問。

Conduit のソース側で、Persist を使ってデータベースから行を読み取りデータ型Aのリストを流し、
Conduit のシンク側で、そのデータ型Aを使って print 関数なんかで表示する

ということをやってみようとしてて、本当はモデルビューアーキテクチャで分けたいんだけど、
ソース側とシンク側が強く結びついてしまって、なかなかうまく分離できない。
(もちろん、ソース側をモデルに、シンク側をビューに置く)

ソース側の型は (PersistMonadBackend m ~ SqlBackend, PersistQuery m) => Int -> Source m A
シンク側の型は (MonadIO m) => Int -> Sink A m ()

これだけなら綺麗に分けられそうだけど、
ソース側とシンク側を繋げる関数を分ける関数の型が
(PersistMonadBackend m ~ SqlBackend, PersistQuery m) => m IO
となってしまう。

つまり、PersistMonadBackend m ~ SqlBackend, PersistQuery m この制約が、
モデルだけに限らず、ビュー側(あるいは間を取り持つところ)にまで影響する。

なので、もしモデルのソース側を Persist を使わず、別のなにか、
たとえばただのファイル読み取りにしようとすると、
ビュー側(あるいは間を取り持つところ)の型まで変えなければならない。


Conduit が表現しようとしているモデル(紛らわしいがMVのモデルの意味ではない)は、
モデルビューアーキテクチャには向かないのかな?

637 :636:2014/01/25(土) 22:04:29.69
ごめん、ソース側とシンク側それぞれの型の第1引数にある Int は質問には不要だった
無視してくれ

638 :636:2014/01/25(土) 22:16:12.56
>>636
グダグダしててスマん

モデルビューアーキテクチャじゃなくて、
モデルビューコントロールアーキテクチャね

あるいはドキュメントビューアーキテクチャ

639 :デフォルトの名無しさん:2014/01/25(土) 23:59:34.02
>>636
>これだけなら綺麗に分けられそうだけど、
>ソース側とシンク側を繋げる関数を分ける関数の型が
>(PersistMonadBackend m ~ SqlBackend, PersistQuery m) => m IO
>となってしまう。
これの意味が分からん
「ソース側とシンク側を繋げる関数を分ける関数」って何?

640 :636:2014/01/26(日) 09:26:01.57
>>639
一晩開けて読みなおしてみたら、確かに意味不明だな、ごめん。

MVC アーキテクチャにおいて、ユーザーからの要請で
モデルで管理しているデータをビューへ表示することを考える。

[Model] は次の関数を公開する。
recordsSource :: (PersistMonadBackend m ~ SqlBackend, PersistQuery m) => Source m A

[View] は次の関数を公開する。
recordsSink :: (MonadIO m) => Sink A m ()

[Control] は次の関数内でソースとシンクを繋げる。
viewRecords :: (PersistMonadBackend m ~ SqlBackend, PersistQuery m) => m ()
viewRecords = recordsSource $$ recordsSink

ごく簡単にエッセンスだけ抽出するとこんな感じ。
(実際は表示方法やデータの個数などいろいろ制御するための引数があったり、
関数の定義ももう少し複雑だったりする)

本当は [Control] は [View] がどのような仕組みで
データを管理しているのか知らなくても良いようにしたいのだが、
今現状では [View] が persistent パッケージのライブラリを使っている影響が、
[Control] 側にも及んでいる(型シグネチャのコンテキストという形で)。
よって、MVC アーキテクチャなのに、[Model] と [Control] が強く結びついている。

これをちゃんと分離したいのだが、Persist + Conduit でやっている限りでは
実現は難しいのだろうか。


あれから考えてみたのだが、Persist + Conduit に限らず、
モナドを使っている限りついて回る問題ではないかと少し思えてきた・・・

641 :デフォルトの名無しさん:2014/01/26(日) 11:13:00.62
recordsSourse内でrunしてMonadIOで返すようにすればいいんでないの?

642 :636:2014/01/26(日) 11:41:40.10
>>641
実はそれ考えてプログラムしてみたんだ。
確かにちゃんと分離できる。

が、データベースの制御について本やネットで調べてみると、
オープンとクローズは頻繁に行わない方が良いらしい。

今回のアプリはデータの表示、書き換えがユーザーの手によって頻繁に起こるから、
オープン/クローズは Main 関数内で一度ずつ行って、
その間で Conduit を使ってデータや、削除などの制御情報を流そうかと。

そうすれば、[Model] の表現方法が変わっても、
[Model] と、全体を取り持つ Main 関数の2つだけ変えればいいはず。

もし改善策が思いつかなければ、

(1) データベースを制御するごとにオープン/クローズするように諦めるか、
(2) Persist + Conduit の組み合わせを諦めるか、
(3) データベースを使うのを諦めるか

の3択になって、まぁ仕方ないかなと思ってる。

Persist + Conduit はもともと Yesod で開発されたものだけど、
Yesod のモデルではもしかしてオープン/クローズは繰り返すものなのかな。

643 :デフォルトの名無しさん:2014/01/26(日) 12:00:35.71
>>642
ならModelでPersist関連のラッパーモナドとrun関数を用意して、それを返すようにするとか
実装は必要に応じてModel内で差し替えればいい

644 :デフォルトの名無しさん:2014/01/26(日) 12:25:07.08
>>640
ControlがModelとViewを直接参照してるのがおかしいように見える
この二つを引数として取るようにできる?

645 :636:2014/01/26(日) 13:14:58.54
>>644
できるが、そもそもこの二つ(ソースとシンク)を引数として取る関数が ($$) だよ。

というか、MVCアーキテクチャって、C が M と V の間を取り持つんじゃないの?
C がユーザーとのインターフェースを担当して M に仕事を依頼、必要なら V にも更新を依頼。


こういうストリームが Conduit でできると理想なんだけど

[ユーザーからデータ変更依頼] -> C ==> M ==> C ==> V

まぁ 2 つ目の C は要らんかもしれんが。
C ==> M のストリームは制御信号を流す(この例の場合はデータ変更依頼信号)。
M ==> C ==> V のストリームで実際のデータを流す。

無理なら、C を Conduit のソースにするのではなく、ソースはあくまで M にして、
C は M ==> (C) ==> V のストリームを発火させるだけにする。

データベースのオープ/クローズを1回で済ますために、
Main 関数で MVC全体を囲うように Prtsist の run をしているんだけど、

>>643
> ならModelでPersist関連のラッパーモナドとrun関数を用意して、それを返すようにするとか

このような状況で run を M 側に持ってくることができるのなら大満足だ
ちょっと考えてみるよ

646 :デフォルトの名無しさん:2014/01/26(日) 14:27:15.14
>>645
>できるが、そもそもこの二つ(ソースとシンク)を引数として取る関数が ($$) だよ。
うん、このケースでは($$)そのものがコントローラに対応すると考えればいいと思う
単にデータを転送するより複雑なことがしたいなら、そういう関数を書けば良い
あるいはコントローラをConduitとして書けるならそれでもいい

いずれにしても、コントローラがPersistMonadBackend云々の制約を
知らなくても良いようにするには、コントローラが直接recordsSourceに言及しなくて
良いようにするのが一番手っ取り早い

647 :636:2014/01/26(日) 14:44:13.86
>>646
> いずれにしても、コントローラがPersistMonadBackend云々の制約を
> 知らなくても良いようにするには、コントローラが直接recordsSourceに言及しなくて
> 良いようにするのが一番手っ取り早い

その方法を質問してたつもり

なかなか上手く質問できず誤解させてしまったようだ、すまん

648 :デフォルトの名無しさん:2014/01/26(日) 15:08:03.29
>>647
>その方法を質問してたつもり
何が分からんのか分からん

> C ==> M ==> C ==> V
これをConduit式で素直にやるなら、最初のCがSource、
Mと二番目のCがConduit、VがSinkになる
もっと柔軟性が欲しければ、CがMとVを受け取ってm ()でも返すようにする
でmainでmを特定のデータベースバックエンドに実体化する

完全な(コンパイルできる)ソースを貼ってくれた方が伝わりやすいかも

649 :デフォルトの名無しさん:2014/01/26(日) 16:33:41.14
HaskellでMVCを実現するなんて面白いね
このあたりを勉強したいのだけれど、おすすめのリソースがあれば教えて下さい

650 :636:2014/01/26(日) 17:13:39.03
無いから自分で考えるしかない

651 :636:2014/01/26(日) 17:18:53.86
>>648
> これをConduit式で素直にやるなら、最初のCがSource、
> Mと二番目のCがConduit、VがSinkになる

それは分かるが、そのモナドの型が
(PersistMonadBackend m ~ SqlBackend, PersistQuery m)
というコンテキストでなければならなくなる。
>>640 の viewRecords 関数のように。

> でmainでmを特定のデータベースバックエンドに実体化する

>>645 でも言ったが、現状そうしてる。

で、これも >>645 で言ったが、
run を M 側に持ってくることができるのなら大満足だから、
それを考えている。

652 :デフォルトの名無しさん:2014/01/26(日) 18:20:15.03
>>651
>それは分かるが、そのモナドの型が
>(PersistMonadBackend m ~ SqlBackend, PersistQuery m)
>というコンテキストでなければならなくなる。
いや、そうやって分ければMVCが全部同じコンテキストを持ってる必要がなくなるだろ
Mでは(PersistMonadBackend m ~ SqlBackend, PersistQuery m)
Vでは(MonadIO m)
Cでは(Monad m)か(MonadIO m)

653 :636:2014/01/26(日) 19:13:29.23
>>652
> Cでは(Monad m)か(MonadIO m)

これが今のところ俺の力ではできなくて、うーんって唸ってるところ。

MVC では制御の起点は C になる(ここの認識が間違ってたら全てやり直しだけど)。
データの表示という処理なら、C が M からデータを取ってきて、V へ渡す。
データの書き換えなら、C が M へ書き換えを指示し、結果を受けて V へ渡す。

C の中にはデータ変項関数 changeRecords やデータ表示関数 viewRecords などがあり、
またユーザーからの入力を受け付ける関数 input もある。
関数 input の中に、例えばユーザーがデータ変更ボタンを押したら関数 changeRecords を呼び、
ユーザーが最新データ表示ボタンを押したら関数 viewRecords を呼ぶ、などの処理がある。

この関数 changeRecords や関数 viewRecords の型は、
M が公開しているソース関数と同じコンテキストが必要になる。
(PersistMonadBackend m ~ SqlBackend, PersistQuery m) => ...

なぜなら、たとえば関数 viewRecords の定義は recordsSource $$ recordsSink だから。
この辺りは勉強中だから、本当にそうなのかと言われれば自信はない。

ただ、俺は viewRecords = recordsSource $$ recordsSink という関数は、
MVC の役割から言って C に書くのが相応しいと思ってる。
(だからコンテキストの問題で困ってる)

もしかして、この考え方を改めようというアドバイス?

654 :デフォルトの名無しさん:2014/01/26(日) 19:14:35.32
ん?その場合どこでDBをrunするの?

655 :デフォルトの名無しさん:2014/01/26(日) 19:16:04.86
>>654>>652宛て

656 :636:2014/01/26(日) 19:16:26.86
>>654
俺は Main 関数内で run してる。

657 :デフォルトの名無しさん:2014/01/26(日) 19:20:19.03
>>653
>なぜなら、たとえば関数 viewRecords の定義は recordsSource $$ recordsSink だから。
そこにrecordsSourceを直接書く代わりにCへの引数として受けとるようにする
という話を>>644からずっとしてるつもり

658 :デフォルトの名無しさん:2014/01/26(日) 19:20:48.91
>>654-655
mainを想定してる

659 :636:2014/01/26(日) 19:28:50.76
>>657
飲み込みが悪くてすまんが、Cへの引数として受けとるというのが今ひとつ分からない。

もしかして、viewRecords 関数ではなく

f :: (MonadIO m) => Source m A -> m ()
f src = src $$ recordsSink

という関数を C に作れってこと?
で、viewRecords 関数の定義は f recordsSource にしろと?

もしそうなら、viewRecords 関数はどこに書く?

勘違いしてたらごめん

660 :デフォルトの名無しさん:2014/01/26(日) 19:41:14.64
>>659
たとえば、メインループを行う関数がCにあるなら、それを

loop :: (MonadIO m) -> Source m A -> Sink A m () -> m ()
loop source sink = input >>= \case ...

みたいに定義して、main内で、

runSqlite $ loop viewRecords recordsSink

みたいに呼ぶ

メインループがmain側にある場合も基本は同じで、mainが
viewRecordsを渡してやる

661 :636:2014/01/26(日) 21:56:54.92
>>660
あぁ、やっと言いたいことが分かったような気がする。

C の loop 関数では、具体的な viewRecords 関数などを内部で呼ぶ代わりに、
「データを流す役割のソース」や「データを変更する役割のシンク」や「データを表示する役割のシンク」
などといったソース群とシンク群を引数で受け取るようにして、それを使う。

で、main 関数内などの MVC を統括する部分で、実際に C の loop 関数に、
具体的なソースやシンクを渡すのか。

なるほど、とても参考になった。

662 :636:2014/01/27(月) 19:04:10.08
>>643
こっちも意味がわかった。

SQLへのアクセスに関わる部分(runSqlConn や runResourceT なども含めて)は
すべて M の中に閉じ込めることができてスッキリしたよ。

二人共ありがと

663 :デフォルトの名無しさん:2014/01/27(月) 19:31:00.47
FP Haskell Center

こういうIDEがクラウドじゃなくて普通にインストールアプリとして欲しいのだが

664 :デフォルトの名無しさん:2014/01/27(月) 23:06:17.38
試しに使ってみたけど、リアルタイム構文チェック凄いな
エディタの構文チェッカープラグインよりこっちの方が速いって一体w
このIDEもサーバ側も全部Haskell製(前者はFayでJSにしてあるけど)なんだなー、面白い

関係ないけど、Vim使いならSyntasticとghcmod-vim,neco-ghcあたりを入れればかなりIDEっぽく使えるのでお勧め

665 :デフォルトの名無しさん:2014/01/30(木) 00:57:48.91
arrowを使うと仕様変更に強くなるって聞いたんですけど本当ですか?

666 :デフォルトの名無しさん:2014/01/30(木) 01:24:35.69
>>665
誰に聞いたのそれ

667 :デフォルトの名無しさん:2014/01/30(木) 01:31:03.56
>>665
本当だよ
君も今すぐ使った方がいい

668 :デフォルトの名無しさん:2014/01/30(木) 08:28:54.39
銀の弾丸

669 :デフォルトの名無しさん:2014/01/30(木) 22:21:37.65
>>665
本当だよ。
みんなもう使ってるよ。

早く使わないと取り残されるよ。

670 :デフォルトの名無しさん:2014/01/30(木) 23:34:25.95
>>665
というかモナドは時代遅れだよ

671 :デフォルトの名無しさん:2014/01/31(金) 06:55:03.48
というか、みんなまだArrow使ってるのか

672 :デフォルトの名無しさん:2014/01/31(金) 07:28:57.24
一人ぐらいArrowとは何ぞやと語ってくれる事を期待した自分が馬鹿だった

673 :デフォルトの名無しさん:2014/01/31(金) 08:28:25.16
あれだよ。矢だよ。矢

674 :デフォルトの名無しさん:2014/01/31(金) 09:11:29.00
>>672
もっと煽らないと……。

675 :デフォルトの名無しさん:2014/01/31(金) 09:27:02.89
a...arrowってなんですか?

676 :デフォルトの名無しさん:2014/01/31(金) 09:38:49.58
arrow使ってるのに関数をカジュアルにuncurryされると萎える

677 :デフォルトの名無しさん:2014/01/31(金) 10:01:43.74
uncurryのなにがまずいの?

678 :デフォルトの名無しさん:2014/01/31(金) 11:08:55.55
>>672
なんで最初にそう聞かないの? いくらでも教えてあげたのに
おっとそろそろ出勤だ

679 :デフォルトの名無しさん:2014/01/31(金) 14:22:14.08
>>676
これは
uncurry (+) <<< (*100) &&& (*10) $ 2
こうすればいいですか><
app <<< (+) . (*100) &&& (*10) $ 2

680 :デフォルトの名無しさん:2014/01/31(金) 19:11:40.60
この書き込みを真に受けて質問したんですが、レスを見る限りこの人がおかしいだけなんですかね。

haskell-jaより引用:
(ikegami氏)
Arrow でつくると、疎結合の疎の具合がさらにゆるゆるになるので、多少の仕様変更にもすぐに対応できるかわりに
さらにスピードが低下する
仕様変更に対する強さ <-> スピード という両軸で見ると
Arrow <<< State/Reader/Writer monad << ST monad
http://www.haskell.org/ghc/docs/latest/html/libraries/base/Control-Monad-ST.html
ST は黒魔術なので、はっきりいっておすすめできない (が、スピードのために必要になるかもしれないので老婆心で)

681 :デフォルトの名無しさん:2014/01/31(金) 19:14:56.12
文脈を知らないけどそれだけ見ると支離滅裂だな

682 :デフォルトの名無しさん:2014/01/31(金) 19:21:47.20
まさかSTが黒魔術だったとは

683 :デフォルトの名無しさん:2014/01/31(金) 19:52:15.51
あー、そんな書き込みもあったな
例えばIOモナド版と純粋関数版の二つを作らなければならないはずのところを
arrowで抽象化しておけば一つだけ作ればすむ
だからIOで使うつもりだった関数を急に純粋に変えたくなった
みたいな状況で仕様変更に強くなるか、と聞かれたらyesなのでは
もうarrowのことあまり覚えてないので間違ってたらゴメンネ

684 :デフォルトの名無しさん:2014/01/31(金) 20:15:10.55
なるほど、参考になります……

685 :デフォルトの名無しさん:2014/01/31(金) 20:44:32.50
初めから全部モナドで抽象化しておいて
純粋にしたいところだけidentityモナド使えばいい気がしてきた
やっぱarrowいらんわ。arrowは糞。

686 :デフォルトの名無しさん:2014/01/31(金) 22:15:36.30
モナドはdo記法があまりにも的確すぎて、数学の歴史を愚弄している

687 :デフォルトの名無しさん:2014/01/31(金) 22:19:11.97
最近どこかで聞いたフレーズ…

688 :デフォルトの名無しさん:2014/01/31(金) 23:29:19.00
>>686
愚弄?kwsk

689 :デフォルトの名無しさん:2014/01/31(金) 23:55:35.64
歴史を愚弄でググレ

690 :デフォルトの名無しさん:2014/02/01(土) 23:27:57.78
HSpec を使ったテストコードを cabal で自動実行したいのだが、
テストコードの書き方が分からん。
(参考資料 : https://github.com/kazu-yamamoto/unit-test-example/blob/master/markdown/ja/tutorial.md

Exceptoin の bracket 関数を使って、
メイン処理の前後でリソースの確保と開放を行う関数 useResource(仮名)がある。

メイン処理サブ関数 f1、f2、..., fn があって、
メイン処理関数 f :: Resource -> IO a の中でそれらが呼ばれ、処理される。
もちろん、f1、f2 らはそれぞれ useResource 関数で確保したリソースを使う。

本来なら f に useResource を適用して一連の処理を行うのだが、
今は個々の f1、f2、..., fn をテストしたい。

こういう状況の場合、HSpec 用の t :: Spec 関数はどう書くのが一般的なのかな。

describe "〜〜〜"
 it "〜〜〜" $ do
  [ここ]

[ここ] に useResource を書いて f1 や f2 などをそれぞれぶち込んで
結果を正常値と比較したり、例外の発生をテスしたりすると、
個々のテスト毎にリソースの確保と開放が発生するよね。

cabal で自動テスト実行するなら、これは仕方ないのかな?

もしリソースがデータベースとかで、テストで QuickCheck を使ってたら、
けっこう悲惨なことにならない?

691 :デフォルトの名無しさん:2014/02/02(日) 13:25:55.74
一般的な自動テストの話で恐縮だか、
時系列で変化するものは、一般的に考慮が必要。

単体テストなら
・関数的な結果を返すモックにする
・DBの中身が変わらないことを前提に、トランザクションで囲んで、rollbackさせる
(comitされる処理は対応出来ない、serialやoid消費される前提)
現在時間などの変数に注意。

結合やシナリオということであれば、
・DB初期化、シード投入、実行
・組み込みDBなら、スナップショット切り替え、実行

quickcheckに組み合わせるのは、基本モックなのではという気がする。

692 :デフォルトの名無しさん:2014/02/02(日) 13:53:47.77
>>691
あぁ、なるほど、こういう場合にモックを使うのか

ありがと、やってみるよ

693 :デフォルトの名無しさん:2014/02/02(日) 14:56:44.18
hspec-test-framework パッケージを入れて、
HSpec に test-framework をかぶせて使ったのだけど、
テスト結果を Jenkins で使える XML 形式で出力するにはどうすればいい?

694 :693:2014/02/02(日) 15:44:56.64
hspec-test-framework パッケージのTest.Framework.defaultMainのソース見て分かった

現状無理だったわ

スレ汚してすまんかった

695 :693:2014/02/02(日) 16:10:21.20
テスト時にモックを使う方法で基本的なことを確認させてほしい。

>>690 の状況をシンプルにすると、
モジュール A の中でデータベースを使っていて、
データを出したり書き込んだりする関数が公開されている。
このモジュール A が公開している関数をテストしたい。

もちろん、モジュール A は変更を一切加えること無く。

データベースの接続などはコストが高いのでテスト時はモックを使う、となると、
そもそもモジュール A はデータベースへ直接アクセスしていてはダメだということか?

例えば、データベースへのアクセスを抽象化した型クラスを作り、
そのインスタンス型の値を外部からもらって、それを使ってアクセスするようにしておかないと、
データベースのモック化はできない、という認識でいいのかな?

696 :デフォルトの名無しさん:2014/02/02(日) 22:11:50.43
クラスの定義において、関数の引数や戻り値の部分を型変数でパラメータ化するように、
コンテキストの部分をクラス変数みたいなのでパラメータ化できないでしょうか。

たとえば

class C c where
 f :: (??? t) => Int -> t

のようなクラス宣言があったとして、この ??? の部分を
型クラス C のインスタンス型毎に変えたいです。

{-# LANGUAGE InstanceSigs #-}

instance C X where
 f :: (ClassA a) => Int -> a
 f v = ...

instance C Y where
 f :: (ClassB b) => Int -> b
 f v = ...

このようなことは可能でしょうか。

697 :696:2014/02/02(日) 22:18:14.41
>>696
すいません、関数 f を使う時に
コンテキスト制約に使ったクラス ClassA から型 X のものであること、
コンテキスト制約に使ったクラス ClassB から型 Y のものであることが推論できるように
ということです。

そのような推論ができなければ、クラス C の定義において
関数 f の引数か戻り値に c を入れておくことで対処しますが、
とにかく >>696 のような使い方ができるクラス変数なるものはあるか、という質問です。

698 :デフォルトの名無しさん:2014/02/02(日) 22:18:19.82
>>696
{-# LANGUAGE ConstraintKinds, TypeFamilies #-}
class C c where
 type Constr c :: * -> GHC.Exts.Constraint
f :: (Constr c t) => Int -> t

699 :698:2014/02/02(日) 22:19:52.53
ごめんインデントみすった
{-# LANGUAGE ConstraintKinds, TypeFamilies#-}
import GHC.Exts
class C c where
 type Constr c :: * -> GHC.Exts.Constraint
 f :: (Constr c t) => Int -> t

>>697
>コンテキスト制約に使ったクラス ClassB から型 Y のものであることが推論できるように
具体的にどういうコードでどういう推論が起こって欲しい?

700 :696:2014/02/02(日) 23:19:48.44
>>699
ありがとうございます。
そのやり方で、インスタンス毎にコンテキスト部分をかえることができました。

ついでに、ConstraintKinds や TypeFamilies を調べている特に、
次の方法でも似たようなことができる事が分かりました。

{-# LANGUAGE MultiParamTypeClasses, ConstraintKinds, TypeFamilies #-}

class C c p where
 f :: (p t) = Int -> t

instance C A X where
 f :: (X t) => Int -> t
 f v = ...

instance C B Y where
 f :: (Y t) => Int -> t
 f v = ...


> 具体的にどういうコードでどういう推論が起こって欲しい?

今回挙げた例で言えば、

g :: (X t) => t
g = f 7

という使い方をすれば B の f ではなく、A の f だとみなされると嬉しいです。

701 :デフォルトの名無しさん:2014/02/03(月) 06:07:38.67
>>700
>次の方法でも似たようなことができる事が分かりました。
そのコードならTypeFamilies拡張要らないな
>>699の場合ではConstrという関連型を宣言するのに必要だった

>g :: (X t) => t
>g = f 7
>
>という使い方をすれば B の f ではなく、A の f だとみなされると嬉しいです。
これは無理だと思う。fの型は
f :: (C c p, p t) => Int -> t
だけど、gの型シグネチャからは(X t)から(p t)が言えることが要請されるだけで、
p=Xが確定する訳じゃないので、情報が足りない

702 :696:2014/02/03(月) 07:09:51.19
>>701
あの後いろいろ試してみたのですが、自分で見つけた方法の方は、
今回の目的に関して言えば、どうも使い勝手が悪いです。

> これは無理だと思う。fの型は ・・・

このことと関連しますが、自分のやり方だとクラス内の全ての関数で、
class C c p where の c と p をシグネチャのどこかに入れないと推論できない。
class C c p where 程度ならまだなんとかなりますが、
class C c x y z ... where と少し増えただけでとても不便になりました。

その点 >>699 の方法は柔軟性があるので使いやすかったです。

> gの型シグネチャからは(X t)から(p t)が言えることが要請されるだけで、
> p=Xが確定する訳じゃないので、情報が足りない

やはりそのようですね。
こちらの方は諦めます。

703 :デフォルトの名無しさん:2014/02/08(土) 10:15:20.05
こういう事ってできますか?(実際はもっと複雑ですが要約するとこんな感じです)

f :: a という関数シグネチャがあって、この関数 f の定義として、
a が Int 型だった場合のみ特別な事をして、そうでない型の場合は一般的な事をする。

f :: Int
f = 特別な何か

f :: a
f = 一般的な何か

みたいな。

704 :デフォルトの名無しさん:2014/02/08(土) 10:28:07.17
>>703
「特別な何か」と「一般的な何か」が意味的に同じ(違うのは効率だけ)なら、
書き換え規則で後者を前者に書き換えるのがおすすめ
意味的に違うならOverlappingInstancesしかないけど、
いろいろ厄介なので、使わないで済むなら使わないのを勧める

705 :デフォルトの名無しさん:2014/02/08(土) 10:32:45.93
>>704
ありがとうございます。
調べてみます。

706 :デフォルトの名無しさん:2014/02/08(土) 11:20:08.66
ghci 上での書き換え規則について質問です。

予め ghc でコンパイルして *.hi ファイルを作っておくことで、
対となる *.hs ファイルをロードすれば ghci 上でも書き換え規則が適用されるんですが、
*.hi ファイルの無い *.hs ファイルのロードのみでも適用する方法って無いでしょうか。

ちょっとだけ不便です。
「そう言えば忘れてた」と思って *.hs の内容をちょっと変更して、
ghci 上で再ロードした時に、書き換え規則が適用されず「あれ?」となり、
*.hi ファイルを出していなかったことを思い出すまで時間がかかったり・・・

ghci 上でちょっとした修正と実行テストを繰り返す場合など、なかなか面倒だったりしますよね。

707 :デフォルトの名無しさん:2014/02/08(土) 15:23:45.64
>>706
書き換え規則は最適化の一種なのでghciでは使えないっぽいね

708 :デフォルトの名無しさん:2014/02/09(日) 10:07:53.53
>>707
やはりそうですか。
これは我慢するしか無いですね。

将来のバージョンでは書き換えなど
最適化してロードされるオプションも付けて欲しいです。

709 :デフォルトの名無しさん:2014/02/09(日) 13:16:16.81
>>708
要望はglasgow-haskell-usersへ

710 :デフォルトの名無しさん:2014/02/09(日) 13:48:25.21
>>709
英語が書けないから、要望を出すのは諦めました。

711 :デフォルトの名無しさん:2014/02/09(日) 14:16:48.51
その程度の簡単な英語もわからないんじゃ Haskell 使うのつらくない?

712 :デフォルトの名無しさん:2014/02/09(日) 15:01:31.44
>>711
今のところ全く問題ないです。
読むことはできるので。

713 :デフォルトの名無しさん:2014/02/09(日) 15:17:42.32
東南アジアの留学生がHaskell使うために日本語の勉強しなおしたとか言ってたのを思い出した

714 :デフォルトの名無しさん:2014/02/09(日) 15:28:59.34
HUnit で、実装が正しければ必ず例外が発生することをテストするにはどうすればいい?

例外が発生しない状態だとテストに失敗しとたとみなす、という意味だけど。

715 :デフォルトの名無しさん:2014/02/09(日) 15:42:38.26
>>714
例外が投げられたら捕捉してTrueを返し、そうでなければFalseを返すようなアクションを書いて、
それを(@?)かなにかを使ってテストにすればいいと思う

716 :デフォルトの名無しさん:2014/02/09(日) 15:57:11.06
>>715
やっぱそういう事になるのか
例外をテストする関数か何かライブラリにあっても良さそうなもんだが・・・

ありがと

717 :デフォルトの名無しさん:2014/02/09(日) 21:06:40.67
test-framework でテストを構築してるんだけど、たとえば

testGroup "Test Group1"
 [ testCase "Test1" test_something1
 , testCase "Test2" test_something2
 ]

というテストグループがあったとして、
test_something1 のテストに成功した場合のみ
test_something2 のテストを行う、ということはできる?

試しに test_something2 のテストを testGroup で囲ってみたが、
何も変わらなかった(普通にテストされる)。

718 :デフォルトの名無しさん:2014/02/09(日) 21:51:36.15
Haskellでコンソールの好きな場所に好きな色で文字を表示する方法を探しています。

やりたいことは、コンソールの一部領域だけスクロールするように見せたり、
プログレスバーを表示させたりするような CUI アプリを作ることです。

719 :デフォルトの名無しさん:2014/02/09(日) 22:13:31.77
>>718
個人的に使っているのは、この二つ。
CUIフレームワークなら: http://hackage.haskell.org/package/ncurses
自分で細かく制御したいなら: http://hackage.haskell.org/package/ansi-terminal

720 :デフォルトの名無しさん:2014/02/09(日) 23:38:28.96
tasty-rerun
じゃあかんの?

721 :717:2014/02/10(月) 20:05:23.49
>>720
俺へのレスだったか、すまん気づかんかったわ

あかんも何も、tasty というテストフレームワークの存在を初めて知ったから、まだ分からん
tasty-ant-xml 使って jenkins とも連携できそうだから、ちょっと試してみるよ

722 :717:2014/02/10(月) 20:35:59.86
>>720
使ってみたが分からんかった
tasty-rerun でどうやれば >>717 を実現できる?

--rerun-filter オプションで指定できる 4 つのオプションを組み合わせるってこと?

723 :デフォルトの名無しさん:2014/02/10(月) 22:58:24.76
>>719
調べてみたところ、出力なら ansi-terminal で十分であることが分かりました。

ただ入力側も扱いたいので ncurses を使おうとしましたが、
パッケージのインストール時に外部ライブラリとして ncursesw/ncurses.h が必要です。
私の使っている ArchLinux ではどうもこの ncursesw を使うのに一手間かかるようで、
その一手間がどういったものか情報が得られませんでした(ncurses.h 自体はある)。
正確に言えば、私が理解できる情報が得られなかったわけですが。

もう少し調べてたところ、vty というパッケージがあることが分かりました。
"vty is terminal GUI library in the niche of ncurses." とのことです。
これで行けそうな気がします。

アドバイスありがとうございました。

724 :デフォルトの名無しさん:2014/02/12(水) 02:04:22.00
ConduitのドキュメントがHoogleで引っかからないです。
でもHayooでは引っかかる。
みんなHayoo使ってるんですかね?

725 :デフォルトの名無しさん:2014/02/12(水) 07:16:28.78
(^o^)/ おHayoo-

726 :デフォルトの名無しさん:2014/02/12(水) 08:33:32.47
>>724
Hayooメインで使ってる。
でも、サービスがよく止まってるから、結果的にHoogleも併用してる。

727 :デフォルトの名無しさん:2014/02/12(水) 15:23:24.76
Hoogleはローカルで動かすもんだろ

728 :デフォルトの名無しさん:2014/02/12(水) 21:51:44.15
~.cabal/config 編集して
documentation: True
にしてから
cabal install world --reinstall
すると、ドキュメントもローカルに落とせるんですね、、知らなかったです。
これをhoogleコマンドから引けたらもっといいんですけど、どうすればいいのかよくわからない…

729 :デフォルトの名無しさん:2014/02/12(水) 22:37:44.60
自分の環境では"hoogle data"と打ち込むだけでHoogleのインデックスが作られるけど、確かcabal側の操作が他にも必要だった気がする

730 :デフォルトの名無しさん:2014/02/13(木) 12:02:34.01
Haskellでゲーム作って(真似て)みたよ。
字幕をONにして見てね。
http://www.youtube.com/watch?v=ABsutPSLuqQ

731 :デフォルトの名無しさん:2014/02/13(木) 23:18:36.85
*>とか<*の使いどころって、どこ?

732 :デフォルトの名無しさん:2014/02/13(木) 23:43:40.46
すごいなー 1500行でつくれちゃうのかー
本家はjavaだっけ?処理速度的にどうなのか気になる

733 :デフォルトの名無しさん:2014/02/14(金) 00:52:31.90
Haskell は純粋関数型で、副作用が排除されてるから融合変換はかなり豪快に出来るって聞いた。
ただ細かな部分での最適化はそれほどでもないみたい?

734 :デフォルトの名無しさん:2014/02/14(金) 00:58:45.26
親父から授かった遺言は、haskellを極めろ

735 :デフォルトの名無しさん:2014/02/14(金) 01:00:44.40
>>730
コード見たい

736 :デフォルトの名無しさん:2014/02/14(金) 01:11:56.29
>>735
完成したら公開する予定って G+ で言ってる

737 :デフォルトの名無しさん:2014/02/14(金) 08:25:47.90
>>732
書きなぐった感じで作ってもそれぐらいだったよ。
偉い人が書くと余裕で半分以下になると思う。

処理速度は他言語で似たようなもの作ったことないから
比較できない・・・。

ただ、直感的にFortranと比べると若干遅い気がする。
表面に出るブロックだけピックアップして描画してるんだけど、
ピックアップするときに50万ブロックの走査したら数秒かかったw

>>733
今回のコードは8割以上IOモナドに浸食されてるんで・・・。

>>735-736
動画の最後でも言ってるんだけど、やはり大方の人に
最後まで見てもらえてなさそうだなw

738 :デフォルトの名無しさん:2014/02/14(金) 12:28:32.57
>>737
動画最後まで見たけど、早送り気味で見たから。

739 :デフォルトの名無しさん:2014/02/14(金) 13:05:58.50
>>738
そっか。
最後までみてくれてありがとう。

740 :デフォルトの名無しさん:2014/02/14(金) 13:09:34.88
>IOモナドに侵食
それでも別に融合変換は出来るのでは?

741 :デフォルトの名無しさん:2014/02/14(金) 13:56:47.97
>>740

>>733の副作用に条件反射して答えちゃいました

そもそも融合について名前程度しかしらなかったので
「関数プログラミングの楽しみ」やRWHの該当箇所を
流し読みしてみた。

でも、アドレス変換して値を参照してるところを直値を
直接参照して計算するようにプログラムを変換してくれ
るのかな・・・程度にしかわからなかった orz

もしその理解で正しいなら、この技法を取り入れたら
かなり早くなりそう。

難しいことは避けてきたけど、そろそろ真面目にHaskell
を勉強します・・・ m(_ _)m

742 :デフォルトの名無しさん:2014/02/14(金) 23:45:37.62
え、融合変換って最適化コンパイル時のコード置き換えでごにょごにょやって高速化する奴じゃないの?

直接参照云々はUNPACKのことかな。これも確かに高速化に繋がるけど、融合変換とか副作用とかとはあんまり関係ない

743 :デフォルトの名無しさん:2014/02/15(土) 00:33:12.68
>>742
説明の仕方が悪かったです。

中間のデータ構造を省いて必要な値を直接参照するように変換するような
もののような気がします。
例えば、以下のようなデータ構造があって、ある関数が特定の箇所を
走査する場合に以下のように変換するようなイメージだと理解しました。

data Aaa = Aaa { bb :: Double, cc :: Bool}

func :: [Aaa] -> Double
func aaa = foldl (\ s (Aaa {bb=d}) -> s + d ) 0 aaa

この関数を以下のように変換してくれる?

func aaa = foldl (+) 0 aaa'
where
aaa' = map (\ Aaa {bb=d}) -> d) aaa

UNPACKとの違いはよく分かりません・・・。

744 :デフォルトの名無しさん:2014/02/15(土) 00:43:05.59
補足。

>>743では変換後もリストを使ってますが、そのリストが直値の配列
になってるような感じだと思いました。

上手く説明できずスミマセン。

コンパイラの最適化で自動的にやってくれることのような気もします・・・。
ただ、副作用の有無は最適化時に重要になってくるような気もします・・・。

745 :デフォルトの名無しさん:2014/02/15(土) 01:02:57.59
副作用に汚染されてても融合変換ってうまくはたらくんだっけ?

746 :デフォルトの名無しさん:2014/02/15(土) 08:14:19.73
>>743
逆じゃね?

747 :デフォルトの名無しさん:2014/02/15(土) 12:55:05.47
>>745
結局のところ、どうなんでしょう・・・。
ただ、副作用があると難しそうですよね。

>>746
言わんとしてることは分かります。
たぶん、会話が噛みあってないだけだと思います。

748 :デフォルトの名無しさん:2014/02/15(土) 13:12:05.42
総合政策学部みたいなヤツがHaskellコード書いてるのを見ると、
よっぽど暇な学科なんだろうなって思う

749 :デフォルトの名無しさん:2014/02/15(土) 13:26:34.99
世界をコードで動かそうとしてるんだろ

750 :デフォルトの名無しさん:2014/02/15(土) 13:41:28.47
なんかかっこよさそうだから、そのうちHaskelやってみようつと。
「僕、今ハスケルで君の美を表現してるんだ」
これで芸大女ともやれるな
よぉぅしっ

751 :デフォルトの名無しさん:2014/02/15(土) 13:49:04.85
嫌味ね

752 :デフォルトの名無しさん:2014/02/15(土) 13:58:18.44
もちろん青春は遅延評価です

753 :デフォルトの名無しさん:2014/02/15(土) 14:00:19.63
大学で微積や応用数学の演習問題をガリガリ解いたのが、すっごく無駄な時間に思えてきた

754 :デフォルトの名無しさん:2014/02/15(土) 15:01:07.79
ムダでしょ(~_~;)
いまどきスマホのCASでもできちゃうから

755 :デフォルトの名無しさん:2014/02/15(土) 15:07:39.86
A4のノートを2ダース以上消費したのに、今では全く使わない

756 :デフォルトの名無しさん:2014/02/15(土) 16:13:38.94
数学の楽しい演習問題は無駄な時間だと言うのに、スーパーマリオのノーミスプレイのためのトレーニングを無駄な時間だと言わない

どっちも同じなのに

757 :デフォルトの名無しさん:2014/02/15(土) 16:18:37.08
数学の演習問題をノーミスプレイして、ニコ動に上げれば良い。
そうすりゃ、予備校が潰れてメシウマ。

758 :デフォルトの名無しさん:2014/02/15(土) 16:19:44.09
>>753
日本の教育がオカシイと思う。

微積も大事だけど、もっと代数・幾何や統計に力を入れないと
実社会の問題を解く時に役に立たないと思う。

759 :デフォルトの名無しさん:2014/02/15(土) 16:33:50.91
日本の企業の7割が赤字なんだから、実社会では足し算と引き算すらも役に立ってない

もう算数教育やめるべき
無駄

760 :デフォルトの名無しさん:2014/02/15(土) 16:37:53.56
微積と統計をガリガリと解きつつ、関数型言語と金融業でFA
制御理論は不要

761 :デフォルトの名無しさん:2014/02/15(土) 16:40:44.86
制御理論、熱力学、電磁気学、信号処理、ロボット工学が不要
確率微分方程式のような金になりそうなものに全力を出すべき

762 :デフォルトの名無しさん:2014/02/15(土) 16:54:36.93
NTTデータ「社内公用語をHaskellにする。奴隷どもJavaやPHPやCで書いた古いシステムは今すぐ書き直せ」
http://blog.livedoor.jp/itsoku/archives/34270447.html

さすがNデーは頭のいい奴が多いな。
底辺じゃHaskellなんてクイックソート書くもの無理だろw

763 :デフォルトの名無しさん:2014/02/15(土) 17:32:14.70
Prologでクイックソート書くより楽

764 :デフォルトの名無しさん:2014/02/15(土) 17:34:35.96
NTTデータの企業ロゴって、フリーメイソンのピラミッドと目玉にソックリ

765 :デフォルトの名無しさん:2014/02/15(土) 17:35:37.55
そもそもNTTデータって、もうなにも生産してないでしょ

766 :デフォルトの名無しさん:2014/02/15(土) 17:37:44.48
生産する人間を生産する。メタ生産。

767 :デフォルトの名無しさん:2014/02/15(土) 17:39:17.05
アウトソーシングメタプログラミング

768 :デフォルトの名無しさん:2014/02/15(土) 17:57:49.28
>>766
Lispっぽくてかっこいいなw

769 :デフォルトの名無しさん:2014/02/15(土) 18:00:07.69
今もう、自称ハッカーの黒歴史を抱えた闇プログラマたちは、皆、Haskellぐらい習得してるだろ

770 :デフォルトの名無しさん:2014/02/15(土) 18:03:24.33
ってか、言語とかどうでもいいよ。
プログラミングは中国人の仕事だよ

771 :デフォルトの名無しさん:2014/02/15(土) 18:06:54.09
中国に投げる前に終わるような仕事は、中国にまで投げない
つまり、PHPとHaskellを極めておけば安心

772 :デフォルトの名無しさん:2014/02/15(土) 18:29:15.97
>>753
むだではない
天才ならいざ知らず、非天才には意味がある
ま、機械的に形式操作として解いていたなら

むだ!

だけどな

773 :デフォルトの名無しさん:2014/02/15(土) 18:37:21.92
>>772
Webでつかわねーだろカス

774 :デフォルトの名無しさん:2014/02/15(土) 18:40:51.96
WRYYYYYYYYYYーッ

775 :デフォルトの名無しさん:2014/02/15(土) 18:42:04.07
金融関係の数学まで到達するかしないかが損益分岐点
下手なメーカーへ行くぐらいならWebの方がマシ

776 :デフォルトの名無しさん:2014/02/15(土) 18:46:47.20
i番目の引数を返すprojection関数
例えば
(projection 1) 1 2 3 4 === 1
(projection 2) 1 2 3 4 === 2
(projection 3) 1 2 3 4 === 3
(projection 3) 1 2 3 4 5 6 === 3

となるようなものを作ろうとしましたが、うまくいきません。
コードとエラーは下のURLのとおりです
ttps: //ideone.com/uQueJq

どうにかしてこれのコンパイルを通す方法はないでしょうか?
のような

777 :デフォルトの名無しさん:2014/02/15(土) 18:48:50.46
可変長引数なのかダメなんじゃ

778 :デフォルトの名無しさん:2014/02/15(土) 18:55:25.47
projectionW (Right n) _ = projectionW (Right n)
左辺の型が違うと思う
projectionW :: Either Int Int -> ProjFunc n

779 :デフォルトの名無しさん:2014/02/15(土) 18:55:49.70
template haskell 使えばできる

780 :デフォルトの名無しさん:2014/02/15(土) 19:07:00.61
>>775
>金融関係の数学まで到達するかしないかが損益分岐点

本当に純粋数学的な能力が生かせる仕事って金融とか保険のアクチュアリー以外に
なんかあるの?

あとJavaとかしか使わないプログラマでも、Haskell勉強するとレベルアップするとか言われる
けどさ、実際どういう能力が上がるのよ?
発想とか頭の回転ならパズルでも解いた方が効率いいんじゃね?

781 :デフォルトの名無しさん:2014/02/15(土) 19:16:52.21
抽象化能力が増すとか?てきとうだけど。

782 :デフォルトの名無しさん:2014/02/15(土) 19:27:05.63
>>780
パズルを解くのにJavaを使いたいと思う変態がいるのか?

783 :デフォルトの名無しさん:2014/02/15(土) 19:29:06.99
>>781
[1,2] ++ [3,4]
これと同じことをJavaで書くのは超面倒

784 :デフォルトの名無しさん:2014/02/15(土) 19:32:16.20
アルゴリズムの洗練化や検証をHaskellでやって、それからJavaなどに置き換えることはあるね。

785 :デフォルトの名無しさん:2014/02/15(土) 19:33:34.37
clojureでやれよ。

786 :デフォルトの名無しさん:2014/02/15(土) 19:36:12.34
>>776
ttps://ideone.com/Ki2fYH

元のコードだと、たとえばInt -> IntとFunc nが等しいという情報から
n=S Zを推論できない(全く無関係なnでもInt -> Int ~ Func nになるかもしれない)

787 :デフォルトの名無しさん:2014/02/15(土) 19:40:11.74
変な人が増えてるな

788 :デフォルトの名無しさん:2014/02/15(土) 19:58:57.95
>>784
IBMがマシンの設計にAPLを使ったようなもんか。

789 :デフォルトの名無しさん:2014/02/15(土) 19:59:04.06
>>785
それ、Haskell並の型推論できんの?

790 :デフォルトの名無しさん:2014/02/15(土) 20:01:11.74
>>755
修士程度まで数学を真面目にやってないと「使える」ようにはならない.

ピアノやバイオリンみたいなもんだよ.この手の古典楽器は十年以上
やらないと人前で見せられるレベルにならない.

791 :デフォルトの名無しさん:2014/02/15(土) 20:16:27.99
>>789
Haskell並みの型推論は必要なのか?

無くても特に問題ないだろ?

792 :デフォルトの名無しさん:2014/02/15(土) 20:20:52.63
絵の方面のソフト作ると高校数学使いまくりだけどな。

793 :デフォルトの名無しさん:2014/02/15(土) 20:35:14.35
どうせショボい行列演算だろ

794 :デフォルトの名無しさん:2014/02/15(土) 20:38:55.78
行列はリアルタイムレンダリングだとよく使うけど
オフラインレンダリングだとほぼ使わない

795 :デフォルトの名無しさん:2014/02/15(土) 21:20:37.78
>>780
純粋数学の力と、複数の言語を使う力は正反対だから、人により全く逆方向に成長する

796 :デフォルトの名無しさん:2014/02/15(土) 21:56:00.02
>>793
んなことはない。高校数学フル動員だぜ。
一例としてパラメトリックベジェ曲線の分割や交点を求めるときに
3次関数の解の公式が使えないのでニュートン法を使うわけだが
初期値によっては振動してしまうので、初期値を決めるために微分で極値を求めるとか。

797 :デフォルトの名無しさん:2014/02/15(土) 22:04:02.55
パラメトリックベジェ曲線が捻れて「よ」の字の交点みたいなのがあるときに
それを求めるのは偏差値55くらいの高校数学の問題だと思う。

798 :デフォルトの名無しさん:2014/02/15(土) 22:48:28.60
x=a*t^3+b*t^2+c*t+d
y=A*t^3+B*t^2+C*t+D
で表されるパラメトリックベジェ曲線がねじれてできる交点を求めよ
(難易度:難 範囲:高校数学)
多分おまえらの知能じゃ解けない。

799 :デフォルトの名無しさん:2014/02/15(土) 22:55:36.53
それが解けても仕方ない
それが解けるプログラムを書いてくれ

800 :デフォルトの名無しさん:2014/02/15(土) 22:57:46.49
解はシンプルでエレガントなのでこれをプログラムで解くのは効率が悪い。

801 :デフォルトの名無しさん:2014/02/15(土) 23:09:51.93
最近の高校生すげーな
素直に感心するわ

悔しいが俺には解けん

802 :デフォルトの名無しさん:2014/02/15(土) 23:10:45.82
出来る出来ないを必要不必要にすりかえるカス

803 :デフォルトの名無しさん:2014/02/15(土) 23:18:27.19
>>801
気になって他のことに手が付けられなくなってしまったではないか
>>798 を解きたいからヒントをくれ

交点は、あるとしたら一箇所しかできんなよな
そのシンプルでエレガントな式には、
a b c d A B C D の判別式が含まれてたりするのか

804 :デフォルトの名無しさん:2014/02/15(土) 23:25:17.26
出題者自身が正解知らないからw

805 :デフォルトの名無しさん:2014/02/15(土) 23:30:47.65
>>803
交点が1つというのはセンスがいいな。
これに加えてヒントを二言うと解けちゃう。
ヒント
 変数の置換を3回やれば解ける。まずtをuとおき辺々差をとる

806 :803:2014/02/15(土) 23:39:27.90
>>805
ちょっと待って

変数の置換を3回とか、tをuとおき辺々差をとるとかは、
究極にシンプルにエレガントにした最終結果だよな

そうじゃなくて、なんで3回の置換をする必要があるのか
なぜ辺々差をとるのかをちゃんと理解しないと、解けたとは言わん

>>805 がそのシンプルな式に至った思考の経緯から(たぶん紆余曲折を経たのだろう)、
何かヒントを出してほしいのだが

何か書籍かテキストかを見て学んだのなら、それを紹介してくれてもいい
(というか、そっちの方が有難いが)

807 :デフォルトの名無しさん:2014/02/15(土) 23:45:14.22
受験数学で腕を研いてれば方法論は人それぞれの中に形成されるもんだよ。
解く方法ではなく解く方法の方法というメタ論理を教えることは無理。

808 :デフォルトの名無しさん:2014/02/15(土) 23:47:46.05
偉そうなこと言ってるけど要は解法を知ってるだけと
居るよね、クイズの答え知ってるだけでドヤ顔するやつ

809 :803:2014/02/15(土) 23:54:12.21
>>807
すまん、大学には行ったことがない
つまり受験数学で腕を研いた経験がないのだが

これを自力で解くには受験数学をこなすところからやる必要があるのか・・・

810 :デフォルトの名無しさん:2014/02/15(土) 23:54:58.34
数学センスのあるやつなら対称形をみつけたら方法を直観できるはず(キリッ
つまり辺々差をとるとはそういう方法のうちの一つ。
直観できないやつはもはやセンスがない。

なお「自分のセンスがない」のと「数学は不要」とがイコールになってしまったやつはカス

811 :デフォルトの名無しさん:2014/02/16(日) 00:00:21.55
交点が1個というHint利用すると綺麗にとけたっぽいけど
最後に交点が1つだけであることを保証する照明要求されると自分だと詰む。

812 :803:2014/02/16(日) 00:05:23.89
>>810
なんかものすごいヒントを与えられたような気がするが、
その意味が分からないのが悔しすぎる

これを当たり前に解く受験生の力ってすげーな

今は解けそうもないから、ここで訊くのはもう諦めるよ
そろそろいい加減スレチだしな

その代わり、その「対称形」と「辺々差をとる」の繋がりが学べる数学の分野を教えてくれ
入門書からじっくり読んでものにしたい

813 :デフォルトの名無しさん:2014/02/16(日) 00:08:45.28
へりくだり方がわざと過ぎるな

814 :803:2014/02/16(日) 00:11:51.11
>>813
じゃあもっとフランクに聞こうか


答えはもういいよ
それだけ知ったところで何の意味もないしね

それより、「対称形」と「辺々差をとる」の繋がりが学べる数学の分野を教えてくれ
誰でもいいよ

815 :デフォルトの名無しさん:2014/02/16(日) 00:14:32.22
センスは研くもんであって教えてもらうもんじゃないという人生哲学論まで教えなきゃいけんのか?

816 :デフォルトの名無しさん:2014/02/16(日) 00:19:20.61
要は解法を知ってるだけと

817 :デフォルトの名無しさん:2014/02/16(日) 00:20:29.16
>>814
仕事で使わない数学学んでも時間の無駄
どうしてもやるなら競技プログラミングでもやっとけ

818 :デフォルトの名無しさん:2014/02/16(日) 00:22:18.52
アホは解法が載ってるサイトとか教科書を永遠に探してろよ。

819 :803:2014/02/16(日) 00:23:04.22
>>817
それ言うなら、仕事で使わんHaskell学んでも時間の無駄になんだが?

俺は完全に趣味だよ、知りたいというだけ
仕事はプログラムとは何の関係もないし

820 :デフォルトの名無しさん:2014/02/16(日) 00:26:59.10
>>818
おまえがインテリぶってるだけのアホに思える
つっこまれると屁理屈ばかり

821 :デフォルトの名無しさん:2014/02/16(日) 00:30:17.08
普通に大学受験で使う問題集解いていけばいいんじゃない
でも完全に趣味だと味気無くてモチベ維持がきついかもしれん

822 :デフォルトの名無しさん:2014/02/16(日) 00:47:27.59
目的がなければ餅餅が続かないが、受験も目的とは言えない
ある問題が解けることと受験合格には、解けた問題が得点に変換されるという意味しかない
数学には壮大が目的があるが、それと目の前の問題を結び付けるにはあまりに迂遠過ぎる

823 :デフォルトの名無しさん:2014/02/16(日) 00:51:06.54
センスとか経験はコスパを測定できないのでコストカッターの反感を買いやすい

824 :デフォルトの名無しさん:2014/02/16(日) 01:00:57.20
>>822
数学の前に国語勉強した方がいいよ

825 :デフォルトの名無しさん:2014/02/16(日) 02:51:39.18
受験数学にセンスもなにも、、、

826 :デフォルトの名無しさん:2014/02/16(日) 02:52:10.22
受験数学なんて暗記

827 :デフォルトの名無しさん:2014/02/16(日) 09:20:11.08
受験数学なんていってるやつ数学できないんだろ
東大二次試験以外の受験数学なんて「解法のパターン」対応でしかない。
ああいのは数学とは言わない。
数学ができるというのは数学的な空間を作り出せることであって、受験数学問題を解く、つまり、所詮演繹的帰結を得るのが数学じゃないんだよ

828 :デフォルトの名無しさん:2014/02/16(日) 09:30:13.73
たのしいさんすう(こうさん)

829 :デフォルトの名無しさん:2014/02/16(日) 09:33:50.67
やはり関数プログラムは無駄だな。みんなもそう言ってるな。おれはC♯とVBひとすじの王道!みんなも王道になろう!

830 :デフォルトの名無しさん:2014/02/16(日) 10:02:42.13
受験数学の質問はここでいいの?

831 :デフォルトの名無しさん:2014/02/16(日) 10:06:20.15
スレチ

832 :デフォルトの名無しさん:2014/02/16(日) 10:27:17.88
>>829
ふたすじじゃねーか

833 :デフォルトの名無しさん:2014/02/16(日) 10:31:15.17
「C♯とVB」っていう名前の自作言語だろ

834 :デフォルトの名無しさん:2014/02/16(日) 10:39:07.29
C♯とVBという2つの丘の間にひとすじ(王道)が通ってるとか

835 :デフォルトの名無しさん:2014/02/16(日) 10:51:02.56
えっちー

836 :デフォルトの名無しさん:2014/02/16(日) 11:01:59.18
え?

837 :デフォルトの名無しさん:2014/02/16(日) 11:03:46.08
VBとDelphiを暗記していた人はC#がトラウマになって二度と暗記ができない体質になる
またはオープンソースしか信じなくなる

838 :デフォルトの名無しさん:2014/02/16(日) 11:32:19.30
意味が分からん

839 :デフォルトの名無しさん:2014/02/16(日) 11:44:57.29
>>830
おう、いつでもこい

840 :デフォルトの名無しさん:2014/02/16(日) 11:56:51.48
スレチ

841 :デフォルトの名無しさん:2014/02/16(日) 12:25:44.41
Delphi
懐かしいぜ

842 :デフォルトの名無しさん:2014/02/16(日) 12:47:27.13
円馬鹿出ろ

843 :デフォルトの名無しさん:2014/02/16(日) 14:46:42.76
Fusion について質問。

計算の中で、次のように同じ代数データ型の [分解] と [構築] の組が続けて起こる場合に、

[引数投入] ---> [分解 1] ---> [構築 1] ---> [分解 2] ---> [構築 2] ---> [結果取得]

これを次のように中間の無駄な [構築] ---> [分解] を排除する

[引数投入] ---> [分解 1] ---> [構築 2] ---> [結果取得]

これが Fusion だという認識で合ってる? (その方法は手計算とかコンパイラ最適化とか色々あるが)
それとも、Fusion は Fusion でも、Stream Fusion の事?

844 :デフォルトの名無しさん:2014/02/16(日) 15:09:26.07
>>843
Stream fusionはそういう形だけど、一般にはもうちょっと広いと思う

[構築1] --(中間データ)--> [分解1]

を、

[構築1+分解1]

のように、中間データを生成しないコードに変形する

845 :デフォルトの名無しさん:2014/02/16(日) 15:18:47.34
flipは引数の1番目と2番目を入れ換えた関数を得るけど
1番目と3番目を入れ換えた関数を得たい場合はどうすんの?

846 :デフォルトの名無しさん:2014/02/16(日) 15:45:57.73
>>845
flip $ (flip .) . flip $ (flip.) . flip $ (flip .) . flip

847 :デフォルトの名無しさん:2014/02/16(日) 16:01:37.03
え?そんなややこしいことしないとダメなの?(@_@;)

848 :デフォルトの名無しさん:2014/02/16(日) 16:23:13.65
そこで、>>846を Fusion すると..... /* 続きは、誰かタノム */

849 :デフォルトの名無しさん:2014/02/16(日) 16:57:54.12
自作すれば済む話だと思うが

850 :デフォルトの名無しさん:2014/02/16(日) 17:22:33.34
真面目な奴ほど、一年に一つ新しいプログラミング言語を覚えよう、とかいうのを
真に受けちゃって、やっぱり今は関数型言語だよね、Haskellって奴がなんかすごいらしい、
とオーム社の買って、カリー化あたりで良い加減面倒になって、新しい発想が身に付いた、
とか勘違いしてるけど、結局やってる仕事や書いてるコードに何も変化はありませんでした、
となってしまうのかな?

851 :デフォルトの名無しさん:2014/02/16(日) 17:27:50.19
自己紹介、乙

852 :デフォルトの名無しさん:2014/02/16(日) 18:15:39.39
>>850
再帰的思考や高階関数の概念は比較的わかりやすい上に効果は大きい

853 :デフォルトの名無しさん:2014/02/16(日) 18:42:17.43
Haskellの背景にある数学の概念は強力だよな
モナド則みたいな性質とそういった性質を満たしていることの証明って、スキルとして応用範囲広いと思う
デザインパターンとか原則を見つけたり策定する力が養えそう

まだまだ分からないところ多いけど、プログラミングをメタな視点で考察しやすくなるんじゃないかって思うよ

854 :デフォルトの名無しさん:2014/02/16(日) 18:47:59.73
使えるところまで行かなくたっていいじゃない
にんげんだもの(誤用)

855 :デフォルトの名無しさん:2014/02/16(日) 18:55:18.89
Haskellに触って何も得ることがないってのは
よほどすごいプログラマか
よほど理解力がないプログラマか
どっちなのか

856 :デフォルトの名無しさん:2014/02/16(日) 19:03:47.86
Haskellを知ってるらしいのに、Haskellには型が無い、という超絶トンチンカンなことを
書き込んだ奴がいたからな。すごく理解力がないプログラマは実在すると思う。

857 :デフォルトの名無しさん:2014/02/16(日) 19:07:12.04
千恵子はHaskellに型が無いという

858 :デフォルトの名無しさん:2014/02/16(日) 19:08:08.75
>>856
書き方を知っているだけで、型推論を知らなかったんだろうなぁ
理解力というか、バックグラウンドの知識が乏しいんだろうね

知識が無い人がトンチンカンなことを言うのは、いつの時代もどこでも同じだな
頭を下げて教えてください、と言えないやつは裸の王様になっていくのさ

859 :デフォルトの名無しさん:2014/02/16(日) 19:16:28.31
ろくでなし ろくでなし なんてひどい いい型

860 :デフォルトの名無しさん:2014/02/16(日) 19:55:27.91
>>850
コードが変化するとしたら、classが減ってlambdaが増えるとか
キャストを使わなくなってテンプレートメタプログラミングを使うとか

861 :デフォルトの名無しさん:2014/02/16(日) 19:55:40.28
haskellの型を一切意識せずに正しい動作をするコードを書いていたとすれば逆にすごいんじゃないだろうか

862 :デフォルトの名無しさん:2014/02/16(日) 20:07:31.40
matlabを叩く制御理論の研究室にいくべきだった。
統計は流石にウマでもシカでも出来るようになってしまった

863 :デフォルトの名無しさん:2014/02/16(日) 20:13:06.47
>>817
俺は趣味で金融工学を学んで夜の麻布で帝王になると定められている。
シュプリンガーの本を読み続けるには、そのぐらいの信仰心が必要。

864 :デフォルトの名無しさん:2014/02/16(日) 20:19:43.87
実務で使うから、仕事で使いそうだから、つぶしが効きそうだから。
こういう理由で物事を学ぶと、結局のところ何も成し遂げることはできない。
ピンクドンペリを注いだり、シャンペンタワーを立てたりなど夢のまた夢

865 :デフォルトの名無しさん:2014/02/16(日) 21:36:03.97
Haskellスレってこんなんだったっけ。何というか、いかにも"2chの"プログラミングスレっぽい。大学の春休みか?

866 :デフォルトの名無しさん:2014/02/16(日) 21:39:57.98
おれの見てるスレここ数日全部こんな感じでウンザリしてるんだけど
大学生の春休みって今頃だっけか

867 :843:2014/02/16(日) 21:44:31.82
>>844
こういうこと?

f :: データA -> データB
g :: データB -> データC

という関数に対する g (f データA) という計算で、
途中の「f によってデータBを作る部分」と「g によってデータBを消費する部分」を取り除き、
データAを消費して直接データCを作る。

これが Fusion で、これをストリームに対して行うのが Stream Fusion?

868 :デフォルトの名無しさん:2014/02/16(日) 21:50:47.43
> おれの見てるスレここ数日全部こんな感じでウンザリしてる

同意w なーんか最近妙だよ。しばし静観だな。

869 : ◆QZaw55cn4c :2014/02/16(日) 21:52:24.40
>>863
>金融工学
ここ笑うところですか?

870 :デフォルトの名無しさん:2014/02/16(日) 22:51:26.30
>>866
ちょうど卒論の提出が終わったあたり

871 :デフォルトの名無しさん:2014/02/17(月) 00:45:35.06
>>865
少なくとも二年ほど前からはずっとこんなスレだぞ

872 :デフォルトの名無しさん:2014/02/17(月) 07:25:08.96
俺のチンチンがでかいから仕方ないんだよ

873 :デフォルトの名無しさん:2014/02/18(火) 00:07:12.86
俺のニシキヘビを見てくれ

874 :デフォルトの名無しさん:2014/02/18(火) 02:52:29.13
ニシキヘビの質問はここでいいの?

875 :デフォルトの名無しさん:2014/02/18(火) 06:10:18.66
>>867
そんな感じ
細かいことを言うと、Stream Fusionが取り除いてる中間データは
Streamじゃなくてvectorやリストだと思う

876 :デフォルトの名無しさん:2014/02/19(水) 21:39:45.84
Text.Regex.Posixって,もしかして日本語が入ってるとちゃんと処理できない?
たとえば
"= abcアイウ" =~ "^=.*" :: (Int, Int)
ってやったら(0, 5)になる
"= abcあいう"だとちゃんと(0, 8)になるのに

全部UTF-8だから大丈夫かと思ったんだけどなあ

877 :デフォルトの名無しさん:2014/02/21(金) 07:50:03.44
とりあえずutf8-string使って試してみた

878 :デフォルトの名無しさん:2014/02/21(金) 12:44:53.95
Sublime Text に課金するか、emacsに戻るか…
Sublimeいいけど、flymakeがないのが辛いんだよなぁ。

みんなはエディタなに使ってるのん?
vi
FP Complete Haskell
Yi
(聞くところによると、ghci内で全部完結してる人もいるらしい…)

879 :デフォルトの名無しさん:2014/02/21(金) 14:00:35.11
Emacs以外ではLeksahがわりといい感じ
でもやっぱりEmacs

880 : ◆QZaw55cn4c :2014/02/21(金) 19:07:44.87
>>879
お前は vi/vim 野郎に殺されるかもしれないことを覚悟しておくがいい

881 :デフォルトの名無しさん:2014/02/21(金) 19:11:21.53
vimにもghc-modとかあるけどEmacsだと何がそんなに良いの?

882 :デフォルトの名無しさん:2014/02/21(金) 19:49:39.10
ttp://leksah.org/
格好いい画面だのう

883 :デフォルトの名無しさん:2014/02/21(金) 20:01:07.75
おれもEmacsだな

べつにviやyi、Leksahなど他のエディタに比べてどうだとかいう問題じゃない

単に昔からEmacsに慣れ親しんでいるから

884 :デフォルトの名無しさん:2014/02/21(金) 21:32:51.01
2013.4.0.0 しんでしまったん?

885 :デフォルトの名無しさん:2014/02/21(金) 22:04:07.51
俺はvimだな上の人と同じで慣れてるからって理由だけと
javaみたいな言語ならideやないとあれやけど
haskellなら別にエディタでええかな

886 :デフォルトの名無しさん:2014/02/21(金) 22:15:33.77
普通型の強い言語の方がIDE便利だよな
その流れで行くとHaskellは超IDE向きなはずなんだが
leksahとか昔触った感じだと完成度がイマイチ

887 :デフォルトの名無しさん:2014/02/21(金) 22:34:51.27
超強力なデバッガが欲しいな

スペースリークの発見を支援してくれたり
弱頭部正規化の様子をビジュアライズしてくれたり

888 :デフォルトの名無しさん:2014/02/21(金) 23:36:18.66
curryでも使えるんかな>leksah

889 :デフォルトの名無しさん:2014/02/22(土) 00:27:01.33
emacs、vimより優れた環境に出会ったことがない

890 :デフォルトの名無しさん:2014/02/22(土) 00:30:29.73
何かの開発環境を作る機会が出来た日には、
emacs,vimでは実現が不可能な機能だけ作ろうと思う

891 :デフォルトの名無しさん:2014/02/22(土) 00:31:01.02
メモ帳+コマンドプロンプト 最強伝説

892 :デフォルトの名無しさん:2014/02/22(土) 01:21:33.92
たまにはメモ帳使ってみるか > ちょw 改行されないオワタ

893 :デフォルトの名無しさん:2014/02/22(土) 01:46:30.05
>>881
Emacsのhaskell-modeはインデントが超超超強力
カーソルのある行を評価したり、ghciとの連携も快適


ところで、vimのインデントをマシにしてくれるプラグインない??

894 :デフォルトの名無しさん:2014/02/22(土) 02:53:52.68
Eclipse FPが抜けとるぞ!

あと次世代IDEを作るぞ!って
lamdu
っていうのがある

895 :デフォルトの名無しさん:2014/02/22(土) 09:10:08.70
>>893
あのインデント、時々ウザい

どうやってコンフィグするんだっけ?

896 :デフォルトの名無しさん:2014/02/22(土) 11:44:16.92
Emacsで実現てきない機能ってなんだよ
3D表示にでもするのか?

897 :デフォルトの名無しさん:2014/02/22(土) 12:16:28.20
>>890
MSみたいな奴だな

898 :デフォルトの名無しさん:2014/02/22(土) 12:17:54.74
案の定石の投げ合いが始まった

899 :デフォルトの名無しさん:2014/02/22(土) 13:14:00.53
定石の投げ合い?

900 :デフォルトの名無しさん:2014/02/22(土) 13:21:36.27
「本当に欲しかったもの」の風刺画に出てくるイカした空中ブランコがIDE

901 :デフォルトの名無しさん:2014/02/22(土) 13:33:55.31
IDEなんて不要って結論出てるだろ

902 :デフォルトの名無しさん:2014/02/22(土) 13:57:47.17
IDEあると便利だよなと何気なく思ってたが、今まで書いたプログラムを顧みてみたところ、
IDEが必要な規模のアプリをHaskellで作ったことがないことに気づいた

というわけで、IDEが喉から手が出るほど欲しくなるようなアプリを作ってみたいが、
何がいいだろう?

903 :デフォルトの名無しさん:2014/02/22(土) 14:06:05.44
>>902
スーパーIDE

904 :デフォルトの名無しさん:2014/02/22(土) 14:09:23.68
>>903
今まで簡単なテキストエディタ作ったことあるが、
コードに色を付けてくれるエディタライブラリをペタと貼るだけで、
ほとんど希みの機能が実現されてしまったからなぁ

IDEってあれの延長だろう?
果たしてIDEが欲しくなるようなアプリだろうかと・・・

905 :デフォルトの名無しさん:2014/02/22(土) 14:37:53.32
本人が気づかない場所で気付かないことをしくさるのがIDE
本人がやらないとバックアップとるくらいしかしてくれないのがemacs

私?
私はもちろん、メモ帳+コマンドプロンプトです
部下に勧めるのももちろんメモ帳+コマンドプロンプト
なぜなら彼らもまた特別な存在だからです

906 :デフォルトの名無しさん:2014/02/22(土) 14:40:51.75
Haskellってなんかかっこいいね
そのうちやれたらいいな
今はLispで忙しい

907 :デフォルトの名無しさん:2014/02/22(土) 15:36:26.62
lispって型チェックしてくれるんだっけ?

908 :デフォルトの名無しさん:2014/02/22(土) 15:39:42.64
します。しすぎます。

909 :デフォルトの名無しさん:2014/02/22(土) 15:52:15.66
動的言語じゃないの?

910 :デフォルトの名無しさん:2014/02/22(土) 16:02:22.23
>>904
今もう、エディタ用のコンポーネントって出来上がってるんだっけ?
それをツギハギしたところで、プログラマとして優れているとは思わないけど

911 :デフォルトの名無しさん:2014/02/22(土) 16:32:17.32
>>910
> 今もう、エディタ用のコンポーネントって出来上がってるんだっけ?

たとえば GtkScintilla とか

> それをツギハギしたところで、プログラマとして優れているとは思わないけど

無様でも目的のアプリが完成することが一番大事
最後までやりきって完成させることができない人は、
Haskellに精通していようが、知識経験豊富だろうが、カスでしかない

と自分に言い聞かせて、今日も家計簿アプリをちまちまと作ってます

912 :デフォルトの名無しさん:2014/02/22(土) 16:50:06.43
プログラマとして優れてるかは知らんが、既存の部品を組み合わせて素早く目的のものが作れるのはエンジニアとして優秀だよな

913 :デフォルトの名無しさん:2014/02/22(土) 16:54:16.97
>>904
なら難しいテキストエディタ作ればいいだけのこと
行を表示するところから始めるんだ

914 :デフォルトの名無しさん:2014/02/22(土) 18:20:59.01
>>911
viやnanoみたいに、行レベルのバッファから作る必要あるんだっけ?
そういった部分を作らないでコンポーネントとして利用するのが、どのあたりが難しいの?

915 :デフォルトの名無しさん:2014/02/22(土) 18:21:43.52
>>912
APIからコンポーネント作るヤツの方が優秀

916 :デフォルトの名無しさん:2014/02/22(土) 18:24:06.58
>>911
動的言語や、cやc++では、アプリケーションが完成する気がしない

917 :デフォルトの名無しさん:2014/02/22(土) 18:31:47.95
世の中って分野によって必要な技術が全く違うのに、
既に出来合いの劣化版家計簿つくるのに時間を使って何が楽しいんだろう

918 :デフォルトの名無しさん:2014/02/22(土) 18:32:22.07
完成できない理由は2つ

・自分のレベルと比較して目標が高すぎる
・小さなアプリを作る前からくだらないと思ってる

どちらも自惚れからくるが、この2つが同時に満たされると「どんな言語でも」アプリは完成しない
逆にこの2つを同時に乗り越えられれば「どんな言語でも」アプリは完成させられる

919 :デフォルトの名無しさん:2014/02/22(土) 18:36:03.77
>>917
小さなことからコツコツとアプリ作りの技術を磨いていくのです

劣化版家計簿でも、完成するとかなり嬉しいものですよ
(既に出来合いのものでは嬉しくないです、あくまで自分で設計して自分で作る)

完成したら、少し改良してみようと、次のステップへの意欲が湧く

920 :デフォルトの名無しさん:2014/02/22(土) 18:38:26.69
アホでしょ。だいたい、全てのアプリケーションは高度なわけで、
簡単に作れるものって、メモ帳かGUIのボタンを並べただけのものぐらい

921 :デフォルトの名無しさん:2014/02/22(土) 18:39:32.71
どの言語のスレでも××で何作ってんのと訊く奴がいて
最終的にお前らはプログラマとして駄目だという話へ持っていきたがっている

922 :デフォルトの名無しさん:2014/02/22(土) 18:40:47.68
日常的には、パーサーかアルゴリズムぐらいしか記述するものがない。
そもそも、設計が必要な時点でプログラミングから離れるだろ。

923 :デフォルトの名無しさん:2014/02/22(土) 18:44:20.58
>>920
アホだから、「小さなものからコツコツ」です

たしかに、小さなものばかりを作り続けても意味無いですけどね
ひと通り感慨にふけった後、ソースや実行ファイルを含め完成したものを省みると、
不満に思うとところが必ず出てくるので、それを次に活かすのです

そのうち、自分の中で簡単だと思うレベルが上がることを期待して

924 :デフォルトの名無しさん:2014/02/22(土) 18:52:10.95
多分、API使い回せないなら、家計簿作りなんてやるだけ無意味

925 :デフォルトの名無しさん:2014/02/22(土) 18:54:57.13
GUIエディタのコンポーネントを作るのと、
コンポーネント使って家計簿を作るのでは、
山を歩いて登るかケーブルカーで登るかぐらい別次元の問題。

926 :デフォルトの名無しさん:2014/02/22(土) 19:11:08.28
スレ違い

927 :デフォルトの名無しさん:2014/02/22(土) 19:15:10.86
初心者がもの作ってるのに対して上から目線で
すでにあるもの作ってなにになるんだよ?
みたいなこと言う人でまともなもの作ってる人を見たことがない

928 :デフォルトの名無しさん:2014/02/22(土) 19:34:53.15
ttp://livedoor.blogimg.jp/netamichelin/imgs/b/3/b3eb6252.jpg
これ思い出した

929 :デフォルトの名無しさん:2014/02/22(土) 20:00:04.14
>>927
その初心者が、明らかに口だけにしか見えないんだけど

>>928
そういう世界じゃないから。

930 :デフォルトの名無しさん:2014/02/22(土) 20:06:49.64
(´-`).oO(うるさいなぁ)

931 :デフォルトの名無しさん:2014/02/22(土) 20:10:32.33
こういう時idあればngにできて便利

932 :デフォルトの名無しさん:2014/02/22(土) 21:09:53.57
Haskellでまともなアプリ作ってるやつなんて居るわけないだろ

933 :デフォルトの名無しさん:2014/02/22(土) 21:50:13.79
たしかに
>>929←はNGにしたい

934 :デフォルトの名無しさん:2014/02/22(土) 21:50:58.53
最初期のminecraftと同等のもの作ってる人はいるぞ

935 :デフォルトの名無しさん:2014/02/22(土) 21:52:47.78
>>932
本家のサイトを見たら、Haskellでアプリを作っている人なんて沢山いることが分かる
それも帳票みたいなウドでもヘチマでも作れるようなものじゃない

936 :デフォルトの名無しさん:2014/02/22(土) 22:16:45.53
個人的には Darcs を作った人に憧れます

全くヒットしなかったけど(正確には初めヒットしてすぐ衰退した)、考え方が論理的で、
あぁHaskell(関数型)のアプリってこういうものを言うんだと思いました

937 :デフォルトの名無しさん:2014/02/22(土) 22:51:51.02
Haskellで生産するのはアプリじゃなくて論文です

938 :デフォルトの名無しさん:2014/02/22(土) 23:07:14.16
darcsってgitとくらべて何がすごいの?

939 :デフォルトの名無しさん:2014/02/22(土) 23:40:51.97
べつに

940 :デフォルトの名無しさん:2014/02/22(土) 23:46:45.88
車輪の再発明っていう論法は、逃げだよなあ
やんなきゃできるようになるわけないもの

941 :デフォルトの名無しさん:2014/02/22(土) 23:49:36.55
自分が使うか興味のあるもの以外、作る必要がない

942 :デフォルトの名無しさん:2014/02/23(日) 00:08:20.66
お前が作りたくないなら作らなくていいから黙ってろよ

943 :デフォルトの名無しさん:2014/02/23(日) 00:17:15.81
ひとつのアプリケーションを作るのに、どれだけの時間が掛かってるか調べたら?

944 :デフォルトの名無しさん:2014/02/23(日) 00:39:27.99
車輪の再発明はプロダクトに価値がないのであって経験はプライスレス

945 :デフォルトの名無しさん:2014/02/23(日) 02:30:25.64
そうそう、車輪作るの楽しいし、作って始めて分かることもある

946 :デフォルトの名無しさん:2014/02/23(日) 06:38:51.77
みんな、いしきたかいなー

947 :デフォルトの名無しさん:2014/02/23(日) 08:43:33.49
電気がためられないこともわからずに太陽光を連呼してみたり、二酸化炭素25%で嘲笑された過去も忘れて火力増やせばいいとか、いろいろと言ってることが軽薄すぎるんだよなあ。
安定した電力供給がどれだけ重要なのかというのは、もはや停電すらまれにしか起こらない日本の都市部に住んでいては

948 :デフォルトの名無しさん:2014/02/23(日) 08:45:01.74
電気代はくっそ高くなってるけど、まあ、なんも考えてない人は、企業努力しろとかわめくわけだけども。

949 : ◆QZaw55cn4c :2014/02/23(日) 09:01:40.94
>>947
事故さえ起こさなかったらそれは正論だね

950 :デフォルトの名無しさん:2014/02/23(日) 10:21:43.54
>>947
どこからのスレッドだ。

951 :デフォルトの名無しさん:2014/02/23(日) 10:37:06.51
事故さえ起こらなければ正論だよね

952 :デフォルトの名無しさん:2014/02/23(日) 11:37:56.80
いずれ戦争が起こるわけですが、勝負になる程度まで軍備を進めると
原発が狙われるんじゃないでしょうか。
逆に日本は原発を狙うことなく負けることができるでしょうか。

953 :デフォルトの名無しさん:2014/02/23(日) 11:40:26.72
なんでこのスレこんな気持ち悪い感じになってんの?

954 :デフォルトの名無しさん:2014/02/23(日) 11:41:36.42
>>936
何かを実現したい時、大抵はアプローチ候補が複数有る。
Haskellは、複数のアイディア実装間の比較が楽なので、端から見てると入れ替わりが激しいように見えてしまう。

955 :デフォルトの名無しさん:2014/02/23(日) 11:44:48.58
諸君、議論をしたまえ(代理)

956 :デフォルトの名無しさん:2014/02/23(日) 12:03:17.57
>>954
> 複数のアイディア実装間の比較が楽なので

何を基準にどう比較する場合の話?

処理速度やメモリの使われ方を基準にするなら、C言語などの方が測りやすいと思うから、
たぶんもっと別の基準だと思うが・・・

957 :デフォルトの名無しさん:2014/02/23(日) 13:12:25.55
954はいつもの人だろ

958 :デフォルトの名無しさん:2014/02/23(日) 14:14:30.22
>>956
cは不動の地位。HaskellはPython、Rubyの座を奪う。
というより、PythonやRubyで何かを書きたくない。

959 :デフォルトの名無しさん:2014/02/23(日) 14:24:45.75
>>958
何を基準にどう比較するかを説明して欲しいんだけど


> ythonやRubyで何かを書きたくない
単なる個人的な感情は今はどうでもいい

960 :デフォルトの名無しさん:2014/02/23(日) 15:34:55.75
QuickCheck で要素が自然数のリストをテストデータとして生成したいのだけど、
これは生成器を自作しないとできない?
それとも、Test.QuickCheck モジュール内の関数を組み合わせて作れる?

961 :960:2014/02/23(日) 15:38:46.97
>>960
念の為、生成器のデータ型を [Data.Word.Word32] にするという話ではなくて

生成器のデータ型は [Integer] です

962 :デフォルトの名無しさん:2014/02/23(日) 16:27:52.13
>>960
[NonNegative Integer]型の生成器を使えば良い

963 :960:2014/02/23(日) 17:43:08.33
>>962
こんな型が Test.QuickCheck モジュールにあったのか
完全に見落としてたわ

ありがと

964 :960:2014/02/23(日) 17:56:31.74
ところで、NonNegative の Arbitrary インスタンスの
arbitrary 関数の定義がこんなことになってるんだが

 arbitrary =
  (frequency
    -- why is this distrbution like this?
    [ (5, (NonNegative . abs) `fmap` arbitrary)
    , (1, return (NonNegative 0))
    ]
  ) `suchThat` ge0
  where ge0 (NonNegative x) = x >= 0

これは、一様分布に対して 0 が現れる割合を増やしてるんだよね
なんか意味あるんかな?

わざわざ suchThat で 0 以上を保証する意味も分からん
もともと abs で0以上の値を生成しているのでは?

965 :デフォルトの名無しさん:2014/02/23(日) 20:02:09.91
自然エネルギーとか、原発止まってるけど大丈夫じゃん、とか言ってるけど、現状LNG燃やすしかないんですよ。即時停止とはこういうことだ。

966 :デフォルトの名無しさん:2014/02/23(日) 20:23:15.35
>>965
だったら燃やせよ
ロンドン条約締結後に堂々と放射性物質をみんなの海にばらまいた日本国に、何か、燃やしちゃいけない理由でもあるの?

967 :デフォルトの名無しさん:2014/02/23(日) 20:26:57.82
     ;:;:;.
     ;:;:;              ,、-ー-、              ど
     ;:;:            ,r'"´ ̄`ヾ、             明  う
     ;:;:.            リ ,,, ニ ,,,_ ヾト、            る  だ
     :;:;:;.             ,ハ ^7 ,^   !.:.\          く
     ;:;:;:           /.:.:.V,r''''''ゞyイ.:.:.:.:..ヽ       な
     ;:;:.         ノ.:!:.:.:.:`ゞ-<7.:〉.:.:.:i.:.:}   ろ  っ
     从 __  _,,,/.:.:/:.:.:.:.:.:| }-{/i.:/.:.:.:.:|.:/     う  た
      从从百円}と_」.:/!.:.:.:.:.:.:.!  ̄ リ.:.:.:.:.:り     ?
         ̄ ̄    ̄  |.:.:.:.:.:./_ :__ヽ.:.:.:.:\
                \/.:.::..:.:.:.:.:.:..:\:.::./
                /.:.:.:.:.:.:.「^Y.:.:.:.:.:.:|´
                 {.:.:.:.:.:.:.:.| ,!.:.:.:.:.:.:|
                  \.:.:.:.:.:.V.:.:.:.:.:.:.:|
                  \.:.:.::|.:.:.:.:.:.:.:!
                    > 'ゝ─‐イ、
                    `ー' ``''ー‐'

968 :デフォルトの名無しさん:2014/02/23(日) 22:03:29.07
>>964
確かに謎だな
前者は0が明らかなコーナーケースだからかも
後者はabsが0未満を返すような変なNumインスタンスへの対応?

969 :968:2014/02/23(日) 22:05:43.08
変な、というかIntがそうだった
Prelude> abs (-9223372036854775808::Int)
-9223372036854775808

970 :デフォルトの名無しさん:2014/02/23(日) 22:44:32.21
有害な物質が1粒でも入ってると危険だと思ってしまう科学音痴。それが日本人。

971 :デフォルトの名無しさん:2014/02/23(日) 22:47:00.21
ベクレルってのがなんの物理量かもわかってない輩が、わあこの食品からnベクレルも検出されたんですって!
こわい!とか言いながらラジウム温泉につかるのが日本の原風景

972 :デフォルトの名無しさん:2014/02/23(日) 22:47:50.10
消えろカス

973 :デフォルトの名無しさん:2014/02/23(日) 22:56:30.12
>>970
日常に有害に物質があふれてて、そこに加わる有害物質を入れるかどうか、という前提をなぜ抜かす?

974 :デフォルトの名無しさん:2014/02/23(日) 23:47:54.71
俺は結構電力会社の安全PRとか信じてた方だから、5重の壁とか、何十もの
安全装置とかあるから大丈夫と思ってたので、あんなにあっさり停電で冷却装置
止まってメルトダウンしたり、建物が大爆発したのは結構ショックだったな。
子供の頃から見せられてたアレはいったいなんだったのという。

975 :デフォルトの名無しさん:2014/02/23(日) 23:54:20.67
ここで床屋政談してる人なんなの…
ちょっと不気味なんだけど

976 :デフォルトの名無しさん:2014/02/24(月) 00:29:07.30
電力会社は放射性物質の代金を請求してもいい頃合い。
今まで無料だと思って浴びまくってた人は青くなれ。

977 :デフォルトの名無しさん:2014/02/24(月) 05:43:22.06
>>970
すごくお馬鹿な詭弁の入り口

978 :968:2014/02/24(月) 06:33:45.41
スレ違い

979 :デフォルトの名無しさん:2014/02/24(月) 09:25:42.85
ああすれ違い

980 :デフォルトの名無しさん:2014/02/24(月) 11:27:37.92
>>966
燃料の価格高騰で倍以上のコストかかってるし、
結果的に (原発を持たない) 後進国に燃料がまわらず、
かなり反感をもたれてしまってる。

981 :デフォルトの名無しさん:2014/02/24(月) 12:11:39.04
>>980
だから・・・
を連想させようとする
あったま悪いやりかただな

大衆相手にしたろカス

982 :デフォルトの名無しさん:2014/02/24(月) 12:14:57.46
>>980
で?

983 :デフォルトの名無しさん:2014/02/24(月) 13:55:37.97
「毎年交通事故でたくさんの人が死んでいます
なので車は廃止しましょう」ぐらいの意見と思われているのかな

984 :デフォルトの名無しさん:2014/02/24(月) 14:24:31.02
みんな自己責任が大好きだから自家用車がよく売れるんだよ
原子力が嫌われないためには自家用原子炉を売るか自己責任システムを廃止するしかない

985 :デフォルトの名無しさん:2014/02/24(月) 17:13:19.43
つまり、静的型のコンパイラは大きすぎて自己責任で保守できるレベルを超えていると

986 :デフォルトの名無しさん:2014/02/24(月) 17:14:43.53
全く関係ないHaskellスレに政治の話を持ち込むような異常者がみんな死ぬまでは、あらゆる問題を棚に上げといた方が人類の為になりそうだな

987 :デフォルトの名無しさん:2014/02/24(月) 18:17:31.94
Haskellは原発会社から資金を貰っているから仕方ない

988 :960:2014/02/24(月) 19:55:26.04
>>969
どうも、Int の Num クラスのインスタンス定義の negate が原因っぽい

より正確に言えば、

instance Num Int where
 negate (I# x) = I# (negateInt# x)
 abs n = if n `geInt` 0 then n else negate n

の negateInt# 関数がおかしいみたい(それ以外に怪しいところが見当たらない)
ただ、残念ながら negateInt# の定義が追求できなかった

ちなみに、Int32 や Int16 なども negate の定義に negateInt# を使ってるから、
たとえば以下のようになる

> -2^31 :: Int32
> -2147483648
> negate (-2^31 :: Int32)
> -2147483648

これはバグなのか仕様なのか・・・

クソ、英語をちゃんと身につけておくべきだった
バグにしろ仕様にしろ、報告できるのに

989 :デフォルトの名無しさん:2014/02/24(月) 20:01:02.78
>>980
後進国が原発を持てないのは、日本がウランを買ってるからですよ

990 :デフォルトの名無しさん:2014/02/24(月) 20:07:20.12
>>988
仕様だろ
2^31はInt32では表現できないから、オーバーフローして-2^31になる
Intでも同様

991 :960:2014/02/24(月) 20:13:50.11
>>990
あぁ、そういうことか、納得

おかしいのは俺の頭だった
穴があったら入っとくわ


後は、0 が現れる割合を増やしてる理由だが、
これは何故か作者本人も why って言ってるもんなぁ
どうしようもないか

992 :960:2014/02/24(月) 20:17:13.36
>>968
ごめん、0が明らかなコーナーケースだと、なんで割合を増やすの?

993 :960:2014/02/24(月) 20:20:31.06
>>992
あぁ、分かった

これ単なる汎用的な非負整数型ではなくて、
あくまで QuickCheck のテストに使うための非負整数型だから、
「0がコーナーケースとなりうる」 --> 「0がよくテストされるように頻度をあげとこう」
ということか

0が出まくっても問題だから、まぁだいたいこの割合にするよ、と


すっきりた
半分以上一人で騒いでいたような気もするが、
アドバイスくれた人たちに感謝するよ、ありがと

994 :デフォルトの名無しさん:2014/02/24(月) 20:30:16.39
普通は境界から叩きます

995 :960:2014/02/24(月) 21:02:21.24
>>994
だよね、忘れてた


何が境界となりうるかはテストによって変わるから、
QuickCheck のデフォルト100回のテスト中に、
あるリスト内のテストデータは必ずテストされる(あとはランダム)
ということが簡単にできる仕組みがライブラリにあっても良さそうだが・・・

996 :デフォルトの名無しさん:2014/02/24(月) 22:26:30.10
id $ id $ id $ id $ 1 -- (1)
id id id id 1 -- (2)

上のidのように適用順(1)(2)の評価結果が同じになる
任意の関数fは作れますか?できないならそれはなぜですか?

997 :996:2014/02/24(月) 22:45:53.53
あ、評価結果は同じじゃなくて大丈夫です。コンパイルできればおkです

998 :デフォルトの名無しさん:2014/02/24(月) 22:48:14.86
もうすぐ1000

999 :デフォルトの名無しさん:2014/02/24(月) 23:17:05.94
次スレは?

1000 :デフォルトの名無しさん:2014/02/24(月) 23:17:56.25
1000なら原発再稼働

1001 :1001:Over 1000 Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。

246 KB
★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.00 2017/10/04 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)