関数型プログラミング言語Haskell Part24
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2013/10/25(金) 21:54:29.92前スレ: 関数型プログラミング言語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/
0002デフォルトの名無しさん
2013/10/25(金) 21:55:57.09,,イ`" 、-' `;_' ' ..::::::::::::::...
,-、 _.._ ( (,(~ヽ'~ ..:::::::::::::::::::::::
)'~ レー' 〉 ヽ i`'} .:::::::::::::::::::::::
~つ '-ー、 i | i' ...:::::::::::::::::::::::
/ < / 。/ ! ......::::::::::::::::::::::::: これは>>1乙じゃなくて
/ ~^´ /},-'' ,●::::::::::::::::::::::::::::::::::::
i、 ,i' _,,...,-‐-、/ i :::::::: .:::::::::::::
..ゝ <,,-==、 ,,-,/ .::::::::::: 放射能がうんたら
) {~''~>`v-''`ー゙`'~ ..::::::::: ........::.
{ レ_ノ ..::::::::. ......:::::::::
ノ '' ..::::::: ...::.:...:::::::::
.::::::::: ...:......:::::::::::: .
.:::::::::::. ..... .. ..:::::::::::::::::::::::: :::.
::::::::::::::::.::::::....:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::.. :: ::..
.:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::: ::.
::::::::::::::::: :::::::::::::::::::::::::::::: :::::
.:: ::. :::
0003デフォルトの名無しさん
2013/10/25(金) 21:57:45.35Part23 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/
0004デフォルトの名無しさん
2013/10/26(土) 03:58:23.29http://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
0005デフォルトの名無しさん
2013/10/26(土) 19:26:01.370006デフォルトの名無しさん
2013/10/26(土) 21:50:44.570007デフォルトの名無しさん
2013/10/26(土) 21:56:56.30C#←空中戦艦
Haskell←ソルジャー
C++が最弱!ありえん!なんで自転車!
0008デフォルトの名無しさん
2013/10/26(土) 22:32:02.64他の言語と同じだよ。
1. まず Hello World 含むトイプログラムを何十個と書いては実行し、
主な文法や機能を身に付ける。
2. 次にそれらのプログラムの実行がなぜ意図した結果になるのか、
中でどのような処理が行われているのか、その意味を理解する。
ただし、Haskell の場合は C や Java などと違ってここが難解なので、
具体的にコンパイラがどのようなコードを吐くかまでは理解しなくてもよい。
もっと抽象的に、プログラムを順に弱頭部正規形に簡約して評価していく様子が
頭に思い浮かべることができれば十分。
3. 何か小さなアプリをいくつか作り上げてみる(完成させるのがポイント)。
linux の echo コマンドや cat コマンドの簡易版でも良い。
完成したら、いくつか機能を付け加えてみる。
4. いくつか作ってみるうちに、ボイラープレートを何とかしたいなとか、
もっと簡単に機能を加える方法はないものかとか、
なんかプログラムが汚くてかっこ悪いなとか、いろいろ思うところが出てくる。
そうしたら、他人のコードを見たり、BBSで質問したり、
問題を解決してくれそうなライブラリを探したりすればいい。
実際はこんな綺麗にステップアップ式に学べるものではなく、
おそらく 2 3 4 を行ったり来たりすることになるが、
概ねこのような順で学ぶといいのではないか。
コストを時間と捉えるなら、私はこの順を勧める。
0009デフォルトの名無しさん
2013/10/26(土) 22:53:59.43一種のサバン症候群だから日本語は苦手
0010デフォルトの名無しさん
2013/10/26(土) 23:07:12.23これはありがたい
0011デフォルトの名無しさん
2013/10/27(日) 01:47:21.690012デフォルトの名無しさん
2013/10/27(日) 03:31:14.010013デフォルトの名無しさん
2013/10/27(日) 05:04:16.170014デフォルトの名無しさん
2013/10/27(日) 05:05:09.54こんにちは、世界 = 文字列を出力して改行する "こんにちは、世界"
0015デフォルトの名無しさん
2013/10/27(日) 07:28:10.870016デフォルトの名無しさん
2013/10/27(日) 08:23:51.44へー(、)という演算子が定義できるのか
0017デフォルトの名無しさん
2013/10/27(日) 08:39:05.13コミュ障が多いけど
0018デフォルトの名無しさん
2013/10/27(日) 11:21:51.690019デフォルトの名無しさん
2013/10/27(日) 11:55:53.910020デフォルトの名無しさん
2013/10/27(日) 12:02:52.38関数マニュアル見ただけでかけるほどマニュアルはちゃんとかけてないし、
そもそも関数自体がそんな風にできてない
とすればどういう使い方を想定して関数があるのかをサンプル見て知るしかない
0021デフォルトの名無しさん
2013/10/27(日) 13:11:39.80これのこと?
ttp://www.sampou.org/haskell/tutorial-j/index.html
結構古いけどhaskell98って今のhaskellと違う部分とか無いのかな
0022デフォルトの名無しさん
2013/10/27(日) 13:49:51.27http://www.haskell.org/haskellwiki/Haskell_2010#Changes_since_Haskell_.2798
0023デフォルトの名無しさん
2013/10/27(日) 15:22:18.34でもやっぱりそのサイトの日本語分かりづらかったから本買おうかな
Lispから本格的にHaskellに入信しようか迷う
0024デフォルトの名無しさん
2013/10/28(月) 02:49:05.040025デフォルトの名無しさん
2013/10/28(月) 10:14:58.65qtもあるけど長いこと更新されてないと思う
0026デフォルトの名無しさん
2013/10/28(月) 14:33:22.790027デフォルトの名無しさん
2013/10/29(火) 02:23:58.080028デフォルトの名無しさん
2013/10/29(火) 07:39:36.24Xサーバでも、Xqartz、Xmingで動けばいちおうクロスプラットフォームになるのか。
0029デフォルトの名無しさん
2013/10/29(火) 07:54:11.48インストーラ作ってハードル下げればクロスプラットフォームになるんじゃ
0030デフォルトの名無しさん
2013/10/29(火) 10:16:35.03いや、Haskell+GLFWだね
0031デフォルトの名無しさん
2013/10/29(火) 15:02:10.030032デフォルトの名無しさん
2013/10/29(火) 15:25:23.97そういうのも綺麗にシャレオツに書ける言語ないかな。
0034デフォルトの名無しさん
2013/10/29(火) 17:47:43.200035デフォルトの名無しさん
2013/10/29(火) 17:51:23.930036デフォルトの名無しさん
2013/10/29(火) 21:06:32.890037デフォルトの名無しさん
2013/10/30(水) 00:49:38.580038デフォルトの名無しさん
2013/10/30(水) 00:50:18.810039デフォルトの名無しさん
2013/10/30(水) 01:29:12.39純粋関数だけでどうせプログラム組めないし
0040デフォルトの名無しさん
2013/10/30(水) 02:00:26.33一番成功している関数型言語がC言語というオチ
0041デフォルトの名無しさん
2013/10/30(水) 06:50:46.69プリプロセッサで頑張る話?
0042デフォルトの名無しさん
2013/10/30(水) 07:08:58.55Haskellが第一言語の俺達とは相容れない運命なのさ…
0043デフォルトの名無しさん
2013/10/30(水) 09:04:47.620044デフォルトの名無しさん
2013/10/30(水) 09:36:55.63別にプリプロセッサだけで頑張る必要ないだろ。
純粋性を保つようにコードを書けばいいんじゃね?
0045デフォルトの名無しさん
2013/10/30(水) 12:31:19.74あいや、Cで関数型と聞いて思い当たったのがプリプロセッサを純粋関数型言語として使うという話しかなかったので
Cの #define を駆使するとプリプロセッサだけで案外ちゃんと計算ができるんだけど、代入が表現できないので純粋関数型言語の作法で書かざるを得ないというネタ(思い出してみたらネタだったけど煽る意図ではなかった)
0046デフォルトの名無しさん
2013/10/30(水) 12:31:45.13保証がない
0047デフォルトの名無しさん
2013/10/30(水) 12:39:29.520048デフォルトの名無しさん
2013/10/30(水) 12:40:37.22本当はループ欲しいんじゃないの?
0049デフォルトの名無しさん
2013/10/30(水) 13:20:22.69unsafePerformIOだって保証ないじゃん
0050デフォルトの名無しさん
2013/10/30(水) 19:04:39.77無理に穴を見つけようとしないで、もっと気楽に素直になれ
0051デフォルトの名無しさん
2013/10/30(水) 19:29:28.28心の底から要らない。あっても使わない
0052デフォルトの名無しさん
2013/10/30(水) 19:50:42.76ループはいらんかもね。
俺は再帰よりもmapとかを多用するようになった。
0053デフォルトの名無しさん
2013/10/30(水) 20:12:40.70最初から完璧な最終的なコード書けるならいいけど
実験的なコード書いてるときはどうしてもゆるい書き方が欲しくなるのだよ
0054デフォルトの名無しさん
2013/10/30(水) 20:24:55.77戻り値として 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 ではないにも関わらず、です。
0055デフォルトの名無しさん
2013/10/30(水) 20:30:34.85コンパイラーさんがいいと言ってるんだから、細けぇことはいいんだよ!
0056デフォルトの名無しさん
2013/10/30(水) 23:20:41.330058デフォルトの名無しさん
2013/10/30(水) 23:53:13.23名前空間が違うだけで、型は同じ。
0059デフォルトの名無しさん
2013/10/30(水) 23:54:53.51List->Listなら、再起でもスタック消費しない。
それ以外は基本、末尾再帰。
0060デフォルトの名無しさん
2013/10/31(木) 00:08:02.05http://hackage.haskell.org/package/text-0.11.3.1/docs/src/Data-Text.html
0061デフォルトの名無しさん
2013/10/31(木) 17:03:37.760062デフォルトの名無しさん
2013/10/31(木) 19:51:29.640063デフォルトの名無しさん
2013/10/31(木) 20:11:50.440064デフォルトの名無しさん
2013/10/31(木) 20:37:46.69こちらで
http://toro.2ch.net/test/read.cgi/tech/1383219359/
0065デフォルトの名無しさん
2013/10/31(木) 20:42:14.31006654
2013/11/01(金) 07:51:27.23>>60
「名前空間が違うだけで、型は同じ」 そういうことなんですね。
でも、どうしてわざわざ Internal の方の名前空間を使うのでしょうか。
"Internal" というモジュールは他のライブラリでもありますが、
基本的にはより低レベルの内部的な処理のためのものだと思います。
ライブラリを利用する側の者が使うのはあまり好ましいことではないような気がしますが、
Data.Text.Internal の説明には
Modules which extend the Text system may need to use this module.
とあるように、むしろ Data.Text ではなくこちらを使うよう促していますよね。
なぜなんでしょうか?
0067デフォルトの名無しさん
2013/11/01(金) 09:24:55.23それ以上は言語とは関係ないライブラリ固有の話題だからドキュメント調べろよ
0068デフォルトの名無しさん
2013/11/01(金) 09:47:45.58>Modules which extend the Text system
ってライブラリを拡張する場合だから、ただの利用者じゃないでしょ。
0069デフォルトの名無しさん
2013/11/01(金) 10:16:27.59その上、その後ろに、こう書いてあるしな。
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]
007054
2013/11/01(金) 12:52:36.75ghci の :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
0071デフォルトの名無しさん
2013/11/01(金) 14:11:44.510072デフォルトの名無しさん
2013/11/01(金) 14:30:43.39牛丼屋に入って調理場に向かって”並・たまご”と言うか、
カウンターで注文取りにきた人に”牛丼並盛・たまご1つ”
と言うかの違い。
基本的には出てくるものは同じだが、掟破りの注文方法がずっと通用する
保証はどこにもない。
0073デフォルトの名無しさん
2013/11/01(金) 16:53:11.20007454
2013/11/01(金) 17:57:01.12今回の件で言えば、どれのことを「掟破り」と喩えているのでしょうか。
Data.Text.Internal.Text 型を使うのが掟破りで、
Data.Text.Text 型を使うのが通常の方法という意味でしょうか。
それだと、やはり ghci の :t では掟破りかどうかを判断できないということでしょうか。
それとも、型を調べるのにソースを参照するのが掟破りで、
ghci の :t を使うのが通常の方法ということでしょうか。
それだと今回のように正しい判断ができなくなります。
0075デフォルトの名無しさん
2013/11/01(金) 18:10:20.33型を調べる正しい方法はドキュメントやソースを読むことであって、
:t を使うのは調理場の中に入って自分でご飯をよそうようなことだと思うけど。
0076デフォルトの名無しさん
2013/11/01(金) 18:27:57.28内部実装はいつ変更されても文句言えない
0077デフォルトの名無しさん
2013/11/01(金) 18:38:30.23食べログで確認したとおりに二郎で注文したのに「うちはマシマシ禁止です」って
怒られたことがある
0078デフォルトの名無しさん
2013/11/01(金) 18:39:25.32・Data.Textは、Data.Text.Internalで定義されたTextという型を再エクスポートしている
・再エクスポートしても実体は一つ。同じ型
・textパッケージの作者から見ると、TextがInternalで定義されているというのは実装の詳細で、
普通の利用者にはData.Textからインポートして欲しいと思っている
・ghciから見ると、作者の意図など知ったこっちゃないので、:tでは
Textが実際に定義されているInternalモジュールを提示する
0079デフォルトの名無しさん
2013/11/01(金) 18:53:41.07型の定義とか、関数の型とか。
ドキュメントは古かったり間違ってたりするよね。ってのは偏見かなぁ。
0080デフォルトの名無しさん
2013/11/01(金) 18:54:58.270081デフォルトの名無しさん
2013/11/01(金) 19:01:34.11もうとっくに消えたかと思った。
C言語が流行ったときのパスカルみたいな存在だよねw
0082デフォルトの名無しさん
2013/11/01(金) 19:04:07.57008354
2013/11/01(金) 19:07:11.31たとえば Text.XML.Cursor モジュールのドキュメントの content :: Cursor -> [Text] の項を見ると、
Text のリンクは Data.Text.Text ではなく、Data.Text.Internal.Text へ飛びます。
それが本当は Data.Text.Text を指していることは、今回ソースを読んだ >>69 の指摘でわかりました。
やはり型を知るにはソースを読まないといけないのが現状だと今回の件で認識しました。
それとも、もしかしてドキュメントのリンクがこのようになっているのは私だけでしょうか。
たとえば、ライブラリ(ドキュメント)のインストール順序によってはリンクがおかしくなるとか・・・
0084デフォルトの名無しさん
2013/11/01(金) 19:34:26.81>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で自動生成されるドキュメントも同じこと。
0085デフォルトの名無しさん
2013/11/01(金) 19:39:14.03>やはり型を知るにはソースを読まないといけないのが現状だと今回の件で認識しました。
極論を言えば、そういう場合もあるけど、今回の場合は”.Internal.”をみて、ユーザが
作者の意図を察してあげるのがプログラマ社会のルールだと思う。
0086デフォルトの名無しさん
2013/11/01(金) 19:43:32.97haddockドキュメントの中でで、英語で書いてある部分は全部無視して型情報だけ見ればいい
そこは自動生成なので古くならない
008754
2013/11/01(金) 21:15:01.08> もしかして、Data.Text.Internal.TextとData.Text.Textが違うものだと
> 思ってる?
初めはそう思っていましたが、皆さんの指摘を受けて同じものだと知りました。
>>66 の時点で同じものだと知りましたが、ghci の :t を疑わなかったので、
同じ物のうちで TextとData.Text ではなく Data.Text.Internal の方を公開している
という勘違いをずっとしていました。
その勘違いも理解できました。
> 今回の場合は”.Internal.”をみて、ユーザが
> 作者の意図を察してあげるのがプログラマ社会のルールだと思う。
それなら仕方ありません。
私もそのように従うことにします。
みなさんアドバイスありがとうございました。
0088デフォルトの名無しさん
2013/11/01(金) 22:33:25.63モダンな大規模開発向け機能が欠落しているのかね?
モジュール化設計機能を備えた言語であれば、
モジュールの外部仕様(interface)と実現方法(implement)を
分離できるから、ツール類で実装向けデータ構造と
ユーザ提供向けデータ構造を正しく認識できるから、
>>87みたいな:tコマンドやhaddockでの誤認識は起こりえない
また、抽象データ型機能を備えた言語であれば、
内部の実装向けデータ構造をユーザから完全に隠蔽できるから、
Data.Text.Internalみたいな実装向けデータ構造が
外部から見えてしまうという根本の問題が生じ得ない
Haskellは関数型言語研究の最新の成果を反映した先端言語という
ふれこみであるけれど、(結局は数学者/研究者向けの言語だから、)
ソフトウェア工学において大規模開発では必須と認められている
これらの機構が完全に無視されてているように見える
結論として、Haskellは研究や試作といった用途には適しているのかも
しれないけど、大規模開発&保守性を要求される産業界での
実用的な開発には不適格な言語ではないのかと考える
0089デフォルトの名無しさん
2013/11/01(金) 22:42:07.77日本語が変だったので、以下の段落を書き直す
>モジュール化設計機能を備えた言語であれば、
.... 中略 ....、
>>>87みたいな:tコマンドやhaddockでの誤認識は起こりえない
モジュール化設計機能を備えた言語であれば、
モジュールの外部仕様(interface)と実現方法(implement)を
分離できるから、ツール類でも実装向けデータ構造と
ユーザ提供向けデータ構造を正しく認識できるはず
(もしできないのであれば、ツールのバグか機能不十分と見なすべき)
結果として、>>87みたいな:tコマンドやhaddockでの誤認識は起こりえない
0090デフォルトの名無しさん
2013/11/01(金) 23:14:33.520091デフォルトの名無しさん
2013/11/01(金) 23:20:37.340092デフォルトの名無しさん
2013/11/01(金) 23:30:10.81見分けられないからモジュール性に優れてないってめちゃくちゃ言ってるな
単なるghcの不具合ってだけだろ
0093デフォルトの名無しさん
2013/11/01(金) 23:36:58.05>分離できるから、ツール類で実装向けデータ構造と
>ユーザ提供向けデータ構造を正しく認識できるから、
今回の例ではデータ構造は一つだからこれは当たらない
>また、抽象データ型機能を備えた言語であれば、
>内部の実装向けデータ構造をユーザから完全に隠蔽できるから、
もちろんHaskellでもこれはできる。でもtextパッケージはあえてやってない
一部の用途ではどうしても内部実装に踏み込みたいことがある
そういう場合に、実装を完全に隠蔽していたら、せいぜいソースをコピーして
パッチを当てるしか道がない
それよりは、「特殊用途向け」に.Internalモジュールを公開して、その代わり
これは内部実装だからマイナーバージョンアップで壊れるかもしれないよ、
気軽に使うなよ、と宣言しておくのがまだマシだという思想
0094デフォルトの名無しさん
2013/11/01(金) 23:41:17.020095デフォルトの名無しさん
2013/11/01(金) 23:41:53.15モジュール化と抽象データの概念がソフトウェア工学研究の成果として
認知されたのが1970年代後半から1980年代
この頃に設計された Modula, Mesa, Ada といった言語には、これらの機能が備わっている
オブジェクト指向の概念が登場したのは、その後になる
つまり、オブジェクト指向という言葉を持ち出さずとも論証できるから、
というのが第一の理由
また静的型付け関数型言語である Standard ML(SML) は
オブジェクト指向の機構を一切持たない古い設計であるが、
完全なモジュール化と抽象データの仕組みを備えているから、
>>88,89の問題はどのSML処理系を利用していても現実に起きたことがない
つまり、SMLでも問題が生じないのだからオブジェクト指向とHaskellの問題は無関係
これが、オブジェクト指向という言葉を持ち出さない第二の理由
0096デフォルトの名無しさん
2013/11/01(金) 23:43:10.97効率を考えないなら書き換え自体は別に難しくないだろ
関わる変数を全て引数にするだけだし
0097デフォルトの名無しさん
2013/11/01(金) 23:45:35.24>ソフトウェア工学において大規模開発では必須と認められている
>これらの機構が完全に無視されてているように見える
こういう明かな間違いを平気な顔で言うのは恥ずかしいから、
今後は入門書の一冊でも読んでから批判するのが良いと思う
0098デフォルトの名無しさん
2013/11/01(金) 23:45:57.88従来の構造化プログラミングと1980年代のsmalltalkからのアドバンテージがなかった
0099デフォルトの名無しさん
2013/11/02(土) 00:01:44.35どこにghcの不具合があるのか
ghcは正しくはどうするべきだったと思う?
0100デフォルトの名無しさん
2013/11/02(土) 00:08:16.38>今回の例ではデータ構造は一つだからこれは当たらない
>>93の後段では「一般用途向け(Data.Text.Text)」と
「特殊用途向け(Data.Text.Internal.Text)」という
二種類のデータ構造を提供していると書いてあるように読めるから、
矛盾していないかな?
>それよりは、「特殊用途向け」に.Internalモジュールを公開して、その代わり
>これは内部実装だからマイナーバージョンアップで壊れるかもしれないよ、
>気軽に使うなよ、と宣言しておくのがまだマシだという思想
こういったレイヤの異なる二種類のインターフェイスを提供するという考え方(思想)は、
決して間違いではないとは思う
ただし、SMLを含むモダンな言語のモジュール化機構では、
アプリケーション側で用途に応じて必要なモジュールだけをimportできる仕組みが、
言語仕様の一部として提供されている
結局、このレス(>>93)では、まともなモジュール化機構を持たないHaskellが
(形式的な理論ではなく)コード設計技法という小手先のテクニックで
モジュール化機能を模倣している、という説明にしかならない
これは、モジュール化機構を持たないJavaScriptが、コード設計技法と規約によって
モジュール化の基本である階層的名前空間を実現している実情と、よく似ている
そして、モジュール化機能がツールで支援できない点もHaskellと同様だ
0101デフォルトの名無しさん
2013/11/02(土) 00:09:53.81例外が出たときは書いた奴が悪い
GHCは何も悪くない
0102デフォルトの名無しさん
2013/11/02(土) 00:14:04.22間違っていると批判するのなら、>>97が正しいと考える
「大規模開発で必要とされる要素」を>>97自身が説明すべきではないのかな?
自らの意見を述べずに批判するだけなら、アホ民主党と何ら変わりがない
0103デフォルトの名無しさん
2013/11/02(土) 00:15:07.76>矛盾していないかな?
Data.Text.TextとData.Text.Internal.Textは同じ型。あらゆる文脈で交換可能
(なので単にTextと書くことにする)
二つのモジュールの違いは、Data.Text.InternalがTextの内部実装に
アクセスする手段を公開しているのに対し、Data.Textはそうしていないこと
>アプリケーション側で用途に応じて必要なモジュールだけをimportできる仕組みが、
>言語仕様の一部として提供されている
これは当然Haskellにもある。ユーザは必要に応じてData.TextかData.Text.Internalの
一方または両方をimportする
>>97を繰り返すけど、入門書の一冊でも読んでから批判するのを勧める
0104デフォルトの名無しさん
2013/11/02(土) 00:16:38.24exportしている関数は全部読めるだけだ
支障はない
0105デフォルトの名無しさん
2013/11/02(土) 00:17:57.72いや、「大規模開発で必要とされる要素」については異論はないよ
Haskellには(簡素だけどちゃんと機能する)モジュールシステムと
抽象データ型を定義するための仕組みがある、と言っている
0106デフォルトの名無しさん
2013/11/02(土) 00:24:21.35Text.Parsecの中でText.Parsec.Stringをexportしていないから
それだけ
0107106
2013/11/02(土) 00:28:08.61module Text.Parsec
( module Text.Parsec.Prim
略
, module Text.Parsec.String
略
) where
略
import Text.Parsec.String hiding ( Parser, GenParser, parseFromFile )
略
0108デフォルトの名無しさん
2013/11/02(土) 00:36:35.47>アプリケーション側で用途に応じて必要なモジュールだけをimportできる仕組みが、
Haskellも特定モジュールのその上さらに特定データ型や関数のimportもできるけど
単に知らないだけだよね?君
0109デフォルトの名無しさん
2013/11/02(土) 00:55:45.56gccみたいにalias名も出す
0110デフォルトの名無しさん
2013/11/02(土) 02:57:06.00おれもHaskellはソフトウェア工学をかなり無視していると思う。
>>88 指摘は全く持ってそのとおり。
俺的にもpugsのオードリー・タンが大規模開発に成功したのはHaskellで(言語備え付けの機能を使わず)
構造化プログラミング(特に段階的詳細化法)をやったからだし。
Haskellは抽象データ型と実装の分離は一応できるものの、抽象データ型の利点であるはずのデータ構造を操作する手続きの
変更にやたら弱かった(はず)。
0111デフォルトの名無しさん
2013/11/02(土) 03:02:09.98データ構造はデータ構造、そのデータ構造の操作はデータ構造の操作で、データ型の定義とは
別のところで定義しないといけない。だから大規模開発は(抽象データ型の発展系である)
オブジェクト指向には劣ると思う。
0112デフォルトの名無しさん
2013/11/02(土) 03:05:41.670113デフォルトの名無しさん
2013/11/02(土) 03:08:50.31そもそも、そのデータ構造の定義とデータ操作を同じ場所に記述するというのが失敗だった件
必要なのは、データ構造の抽象化ではなく、操作の方の抽象化だったというオチ
0114デフォルトの名無しさん
2013/11/02(土) 03:25:09.820115デフォルトの名無しさん
2013/11/02(土) 03:43:20.240116デフォルトの名無しさん
2013/11/02(土) 03:56:07.59いつの時代の話よ
0117デフォルトの名無しさん
2013/11/02(土) 04:10:58.37DIとかインターフェース指向設計とか十分に経験則もできたんだから次に行けよ
もう不要な親子・依存関係とか作る時点で大規模向いてないんだよ
0118デフォルトの名無しさん
2013/11/02(土) 06:58:51.93「内部実装ヘッダ」にData.Text.Internalを定義して、
通常の利用者は公開ヘッダのみを用いてライブラリを使用でき、
特殊な利用者は内部実装ヘッダを用いてライブラリを使用できる。
だから今回のように「通常の利用者」が内部実装で使われている型を目にして混乱することはない。
でもHaskellでは「通常の利用者」に対しても内部実装ヘッダが公開されてしまうので、
今回のように内部実装を必要としない利用者に内部実装の型が公開されることで
:t の結果も内部実装向けの型を返すようになり混乱を招いている。
以上。
0119デフォルトの名無しさん
2013/11/02(土) 08:01:17.68操作の方の抽象化とはなんのことだ?
抽象化、抽象化というがなんのために抽象化するかと言えば関連コードの局所記述を可能にするためだぜ。
0120デフォルトの名無しさん
2013/11/02(土) 08:03:10.07>例えばC言語の場合は「公開ヘッダ」にData.Text.Textを定義して
>特殊な利用者は内部実装ヘッダを用いてライブラリを使用できる。
内部実装ヘッダを用いてって
内部実装外にAPI晒して内部実装用ヘッダも公開してますってなら同じだろ
頭悪すぎる
0121デフォルトの名無しさん
2013/11/02(土) 08:04:30.09逆だろうが
抽象化は実装を外部に追い出すためだろ
一緒に書いてどうすんだよ
0122デフォルトの名無しさん
2013/11/02(土) 08:13:30.03あ、ごめん。そうだわ。
0123デフォルトの名無しさん
2013/11/02(土) 08:16:12.000124デフォルトの名無しさん
2013/11/02(土) 08:28:00.46>Haskellは抽象データ型と実装の分離は一応できるものの、抽象データ型の利点であるはずのデータ構造を操作する手続きの
>変更にやたら弱かった(はず)。
いやそんなことないと思うけど
具体例があればくれ
0125デフォルトの名無しさん
2013/11/02(土) 08:30:07.73Textが再エクスポートされてるモジュールを全部列挙しろってこと?
:tで何か聞かれるたびにそれをするのは非現実的だろ
0126デフォルトの名無しさん
2013/11/02(土) 08:35:35.38今回の問題では、利用者がData.TextとData.Text.Internalのどちらもインポートしていない
(もしインポートしていたら、ghciはData.Text.Internal.Textじゃなくて単にTextと答える)
だからghciにとってはどっちのモジュール名を使えば良いのか決められない
たまたま今の実装が、その型が定義されているモジュールの名前を返すようになってるというだけ
0127デフォルトの名無しさん
2013/11/02(土) 08:54:12.87今回の件に限れば、これがコンパイル時に問題になることはない。
モジュール化設計機能や抽象データ型機能のレベルが
CやJavaなどで開発してきた者にとっては期待するほど高くない、
あるいはやや趣が異なり戸惑うというのはわかるが、
その根拠として今回の問題を挙げるのは的はずれだと思う。
0128デフォルトの名無しさん
2013/11/02(土) 08:55:06.02間接的にでもData.Text.Internalが読み込まれている時点でおかしい
他のモジュール化が可能な言語ならData.Text.Internalがライブラリの外側まで漏れることはない
0129デフォルトの名無しさん
2013/11/02(土) 09:02:40.94一般的な言語しか触ったことない奴には関数型は新しく感じるけど
既に歴史自体結構長いし他の言語はどんどん新しい概念取り入れてるけどそこらへんはかなり昔のままだから古臭く感じる
0130デフォルトの名無しさん
2013/11/02(土) 09:04:14.36こいつHaskellのこと何もわかってないだろ
0131デフォルトの名無しさん
2013/11/02(土) 09:08:51.69よくわからんけど
つか、hugsではどうなの?
インタプリタ専門だからその辺頑張ってそうだけど
0132デフォルトの名無しさん
2013/11/02(土) 09:21:02.33モジュール化に関してはOCamlのが先進的機能たくさんあるわ
本当にOO言語その他をひと通り触ってたらそんな事言わねえよ
さっきからイメージだけで語ってんじゃねえよ
0133デフォルトの名無しさん
2013/11/02(土) 09:27:56.670134デフォルトの名無しさん
2013/11/02(土) 09:49:01.45GHCから見ればInternalモジュールも公開されたインタフェースの一部だよ
これをtextが意図的にやってるのは>>93の通り
0135デフォルトの名無しさん
2013/11/02(土) 10:26:39.84他の言語を使ったことがない人には理解できないかもしれないが、
普通の言語は内部実装を公開したい場合は公開相手を選べるんだよ
今回みたいに一般の利用者まで巻き込んで可視範囲を広げるようなことはしない
だから「内部実装に触りたい人もいるから初期設定で全員に内部実装を公開してる」ってのは言い訳になってない
0136デフォルトの名無しさん
2013/11/02(土) 10:40:03.16hackage.haskell.org/package/text/docs/Data-Text.html
これ読めば全部わかるじゃん
ドキュメント読まない奴が悪いんじゃないの結局
0137デフォルトの名無しさん
2013/11/02(土) 10:52:01.76可視範囲は広がってなんかないよ
今回はData.Text.TextもData.Text.Internal.Textもスコープの外
ghciは気を効かせてスコープの外の名前を無理矢理表示している
何も表示しないよりはマシ
0138デフォルトの名無しさん
2013/11/02(土) 10:52:32.750139デフォルトの名無しさん
2013/11/02(土) 11:57:07.82では、理解できるように資料などがありましたら教えてください
0140デフォルトの名無しさん
2013/11/02(土) 12:16:12.25関数だけでなくADTが必要という理論は
関数とデータ構造を区別するという前提がなければ成立しない
例えば関数と変数の名前空間を分ける言語とか
無名のデータ構造はあるけど無名関数がない言語とかはADTがないと駄目かもしれない
が、前提条件を満たさないものが劣っているというのは理論的にいえることではない
0141デフォルトの名無しさん
2013/11/02(土) 12:18:26.49http://www.haskell.org/onlinereport/haskell2010/haskellch5.html#x11-980005
0142デフォルトの名無しさん
2013/11/02(土) 12:38:28.411ミリも理解できてないHaskellを何故かdisってる、
って理解でOK?
0143デフォルトの名無しさん
2013/11/02(土) 12:49:50.840145デフォルトの名無しさん
2013/11/02(土) 14:09:33.91interfaceは関数しかなくなったので
「関数だけでは物足りないよね」っていうマーケティングが効かなくなった
0146デフォルトの名無しさん
2013/11/02(土) 14:41:53.11ありがとって、これ言語仕様じゃん
訊く前に真っ先に調べるモンちゃうの?
Haskellの仕様について深く議論しようとしてるんだし
0147デフォルトの名無しさん
2013/11/02(土) 17:25:16.10どんな人生送ってたらそんな発想になるんだ
0148デフォルトの名無しさん
2013/11/02(土) 18:46:43.24ちょっとその普通の言語でtextと同じ仕組みで型を公開しつつ可視範囲を限定できるコード書いてよ
0149デフォルトの名無しさん
2013/11/02(土) 18:48:24.410150デフォルトの名無しさん
2013/11/02(土) 18:50:16.82可視範囲って何だよ
0151デフォルトの名無しさん
2013/11/02(土) 18:55:57.330152デフォルトの名無しさん
2013/11/03(日) 01:10:04.050153デフォルトの名無しさん
2013/11/03(日) 01:24:07.34みんな勘違いしてるけど、javaはオブジェクト指向ではない
javaをオブジェクト指向だと言うなら、Cもオブジェクト指向と言うべき
オブジェクト指向の例であげるなら smalltalkにすべき
メッセージパッシングに注目するなら erlang にすべき
0154デフォルトの名無しさん
2013/11/03(日) 02:04:07.950155デフォルトの名無しさん
2013/11/03(日) 02:15:24.71(きこえますか…きこえますか…)
とあなたの心に直接呼びかけるのがマナーです
0156デフォルトの名無しさん
2013/11/03(日) 02:26:24.790157デフォルトの名無しさん
2013/11/03(日) 02:33:25.740158デフォルトの名無しさん
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
と言われました
何か関係しているのではと調べましたが原因は掴めないままです
同じとこでハマってる人いませんか
0159デフォルトの名無しさん
2013/11/03(日) 06:24:19.90ghc-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
です
0160デフォルトの名無しさん
2013/11/03(日) 08:35:05.82試してみたけどparseModeの型が変わっててコンパイルできない
>Warning: Language.Haskell.Interpreter: could not find link destinations for:
>Hint.Base.FromSession Hint.Base.ModifySessionRef Hint.Base.RunGhc
>と言われました
これはhaddockの警告だから無視して良い
0161デフォルトの名無しさん
2013/11/03(日) 09:37:56.05ParseModeのところを直して、
H.set [H.languageExtensions H.:= [H.ImplicitParams]]
の行をコメントアウトしたら動いた
0162デフォルトの名無しさん
2013/11/03(日) 12:02:31.92import qualified Data.Text as T
content :: Cursor -> [T.Text]
と書いてあるのに、:t contentで型を調べると
content :: Cursor -> [Data.Text.Internal.Text]
になります
0163デフォルトの名無しさん
2013/11/03(日) 12:27:14.55どうぞ
0164デフォルトの名無しさん
2013/11/03(日) 12:28:11.58ghcは内部的にはあらゆる型をそれが定義されたモジュールと合わせて区別する
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」になる
0165デフォルトの名無しさん
2013/11/03(日) 12:34:55.62わかりやすい
0166デフォルトの名無しさん
2013/11/03(日) 12:43:45.19>>162
>>164
>>165
0167デフォルトの名無しさん
2013/11/03(日) 12:51:12.740168デフォルトの名無しさん
2013/11/03(日) 12:53:08.69情報だけが大事
手紙じゃないんだから
0169デフォルトの名無しさん
2013/11/03(日) 12:55:57.700170デフォルトの名無しさん
2013/11/03(日) 13:05:53.98本人乙
常套句でつね
0171162
2013/11/03(日) 13:18:18.23全部調べましたがどこにも":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]
として型情報が記録されるのかがわかりません。
0172デフォルトの名無しさん
2013/11/03(日) 13:24:27.16:tでちゃんと型だけの表示になると思うんだけどぉ、俺の環境だけかなぁ?
みんなも試してみてよぉ
0173デフォルトの名無しさん
2013/11/03(日) 13:35:53.92T.Textは、Data.TextからエクスポートされているTextという名前を参照する構文
で、Data.TextがエクスポートするTextは何かと言うと、
Data.Text.Internalで定義されたTextという型(これはData.Textのhiファイルに書いてある)
Data.Textのソースを見れば、Data.Text.InternalからインポートしたTextを
そのままエクスポートしてるのが分かる
0174デフォルトの名無しさん
2013/11/03(日) 13:45:36.05俺は >>162 とは別人だが、ちょっと質問。
content :: Cursor -> [T.Text] の
Text.XML.Cursor.Curdor 型の方はなぜ
Text.XML.Cursor.Generic.Cursor と表示されない?
0175174
2013/11/03(日) 13:48:20.91あ、ごめん、分かった
Text.XML.Cursor.Curdor 型の方は
type Cursor = CG.Cursor Node と型シノニムが定義されて、
それがエクスポートされているからか
0177デフォルトの名無しさん
2013/11/03(日) 16:06:44.34手続きっぽく書くことになるのかな
0178デフォルトの名無しさん
2013/11/03(日) 16:23:23.81混合比はプログラムの種類によって違うけど、手続き一辺倒になることは滅多にない
0179デフォルトの名無しさん
2013/11/03(日) 16:28:29.290180デフォルトの名無しさん
2013/11/03(日) 16:36:58.18levenshtein2 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)]
0181デフォルトの名無しさん
2013/11/03(日) 16:58:16.40関数ポインタを持ってるC言語こそが本当の関数型ということになる
0182デフォルトの名無しさん
2013/11/03(日) 18:02:54.79C言語が持てる関数ポインタの数はソースにより上限が決まる
本当の関数型なら有限のソースから無限に異なる関数を生成できる
突き詰めると、関数に必ず名前をつける言語は本当の関数型ではないってこと
0183デフォルトの名無しさん
2013/11/03(日) 18:23:32.74C言語は、引数としての関数の記述には制限はない
0184デフォルトの名無しさん
2013/11/03(日) 19:27:28.45Haskellの話とは何の関係もない
(C言語が関数型だろうと、Haskellには何の影響も及ぼさない)
新しくスレを作ってそちらで大いに議論してもらいたい
0185デフォルトの名無しさん
2013/11/03(日) 19:35:49.74こういうのって何段まで書けたっけ
0186デフォルトの名無しさん
2013/11/03(日) 19:38:13.35Haskell言語の特徴として関数型言語であることを挙げるのはやめるべき
より純粋な関数型言語のCがあるんだから
0187デフォルトの名無しさん
2013/11/03(日) 19:41:09.920188デフォルトの名無しさん
2013/11/03(日) 20:05:30.63http://ja.wikipedia.org/wiki/%E9%96%A2%E6%95%B0%E5%9E%8B%E8%A8%80%E8%AA%9E
から抜粋
>手続き型プログラミングなどにおける「関数」ではないことをまず注意する。
0189デフォルトの名無しさん
2013/11/03(日) 20:10:06.02> (C言語が関数型だろうと、Haskellには何の影響も及ぼさない)
ダウト
関数型言語のシェアという点では関数型言語Haskellに大いに関係ある話題である
0190デフォルトの名無しさん
2013/11/03(日) 20:10:29.190191デフォルトの名無しさん
2013/11/03(日) 20:22:57.55曖昧なパラダイムや変動するシェアによって定義が変わることはない
そういう影響は受けない
0192デフォルトの名無しさん
2013/11/03(日) 20:47:59.08べつにHaskellに限った仕組みじゃなし
0193デフォルトの名無しさん
2013/11/03(日) 21:29:41.73人間が手続きを差別したり見下したりする必要はなくなり
コンパイラが機械的にチェックすればいいだけになるはずだった
0194デフォルトの名無しさん
2013/11/03(日) 22:46:38.090195デフォルトの名無しさん
2013/11/03(日) 22:52:31.32データ操作をデータ構造が分離した近代言語
0196デフォルトの名無しさん
2013/11/03(日) 23:08:35.29Haskellのシェアも、このスレではどうでもいい
なんでそんな話をする?
この言語を使って実際にプログラムする事に関係ある話をしろよ
0197デフォルトの名無しさん
2013/11/03(日) 23:12:57.59Haskellを使って実際にプログラミングするためには、機械語のレガシーソフトすら存在する現場において、Haskellの有用性と位置付けと言語的特徴を他の言語と比較して説明しなければならない
実際の労力に換算したら、その説得こそがHaskellプログラミングと言える
0198デフォルトの名無しさん
2013/11/03(日) 23:26:30.51そういう事なら、他の言語と比較する事を手段として、
「Haskellの有用性と位置付けと言語的特徴」の話をちゃんとしてほしい
関数型とか手続き型とか、より純粋な関数型言語とか、
そんな名称の定義は一定していないし、綺麗に分けられるものではないのだから、
たとえば「Haskellは**をするのに〜〜と書ける」というような
実際のプログラミングで優位性や特徴を語るべきだと思う
それと、シェアの話しならマ板でやってほしい
単なる一住人のわがままなので、これ以上は何も言わないでおく
0199デフォルトの名無しさん
2013/11/03(日) 23:33:22.04実際の現場では、名称の定義も綺麗な分類も必要ない
特にクライアントに納入するコードの説得に必要なのは、シェアの話以外にない
0200デフォルトの名無しさん
2013/11/03(日) 23:42:01.94そういうのはいつだって自慢話に帰着して終了なんだけど。
0201デフォルトの名無しさん
2013/11/04(月) 00:43:46.57馬鹿に見つかってしまって必死にその世界を守ってるという言語
0202デフォルトの名無しさん
2013/11/04(月) 00:49:29.580203デフォルトの名無しさん
2013/11/04(月) 01:56:19.33もし仮にコンピュータ言語のことで自慢できる立場の人がこのスレを見てるなら、スレ関係なくどんどん書きこんでほしいと思うのは俺だけか
0204デフォルトの名無しさん
2013/11/04(月) 06:55:18.40型クラス、軽量スレッド、do記法、純粋性、ユーザ定義演算子、STM…
挙げればきりがない
0205デフォルトの名無しさん
2013/11/04(月) 07:12:28.92UHC,Fay,GHCJSとかあるのに
0206デフォルトの名無しさん
2013/11/04(月) 07:28:16.610207デフォルトの名無しさん
2013/11/04(月) 07:32:24.20どことなく関数型ぽくね?
0208デフォルトの名無しさん
2013/11/04(月) 08:11:05.740209デフォルトの名無しさん
2013/11/04(月) 08:18:41.170210デフォルトの名無しさん
2013/11/04(月) 08:25:33.47自分が気に入らない話題の時は黙ってスルーするだけでなく
「俺の好きな話題以外は一切出すな!」って
大丈夫か?
社会生活的に。
0211デフォルトの名無しさん
2013/11/04(月) 08:37:32.130212デフォルトの名無しさん
2013/11/04(月) 11:54:30.30>javascriptの悪口なんて誰も言ってないのに
えっ
>JavaScript sucks. The depths to which JavaScript sucks is well-documented and well-understood.……
http://www.haskell.org/haskellwiki/The_JavaScript_Problem
0213デフォルトの名無しさん
2013/11/04(月) 12:07:51.380214デフォルトの名無しさん
2013/11/04(月) 12:16:34.21Haskellは必要なときには過不足なく仕事してるんだよ
お前は必要な時もサボってるだろ
0215デフォルトの名無しさん
2013/11/04(月) 12:22:38.140216デフォルトの名無しさん
2013/11/04(月) 12:32:59.81そう言うあなたがスーパーハッカー的プログラムを一切公開しない理由を説明してほしいです
0217デフォルトの名無しさん
2013/11/04(月) 14:16:01.11高価な文房具を買いそろえ、勉強はあまりしない
高価なギターやエフェクター類をそろえるが練習しない
0218デフォルトの名無しさん
2013/11/04(月) 14:22:23.790219デフォルトの名無しさん
2013/11/04(月) 14:56:47.740220デフォルトの名無しさん
2013/11/04(月) 15:29:14.44fib n = fib(n-2) + fib(n-1)
fib 1 = 1
fib 2 = 1
とかできなくて残念な言語
0221デフォルトの名無しさん
2013/11/04(月) 15:47:35.09試してみたら普通に動いたよ
0222デフォルトの名無しさん
2013/11/04(月) 15:55:52.45この定義の順番では「Pattern match(es) are overlapped」でまともに動きません。
fib 1 と fib 2 の定義を fib n の定義より先に書けば動きます。
>>220 は「遅延評価」をなにか別のものと勘違いしているか、
勝手に拡大解釈して期待してたのに思い通りにならなくて落胆しているか、どちらかです。
0223デフォルトの名無しさん
2013/11/04(月) 16:03:31.69ご覧の通り
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]+ 停止
0224デフォルトの名無しさん
2013/11/04(月) 16:36:21.660225デフォルトの名無しさん
2013/11/04(月) 16:40:46.50パターンマッチの規則も知らん奴に涙目とか言われても反応に困る
0226デフォルトの名無しさん
2013/11/04(月) 16:55:30.00research.microsoft.com/en-us/um/people/simonpj/papers/modules/
へーHaskellのモジュールシステムってそんなに弱いんだー
知らなかったー
0227デフォルトの名無しさん
2013/11/04(月) 19:03:28.460228デフォルトの名無しさん
2013/11/04(月) 19:42:59.03かと言って強いモジュールシステムが欲しいという声もそんなに聞かないけど
0229デフォルトの名無しさん
2013/11/04(月) 19:50:47.10確かにmoduleシグネチャは強力だけど
ocamlはocamlでコンパイル順序の問題があるからな・・・
0230デフォルトの名無しさん
2013/11/04(月) 19:57:14.35やめろ!
0231デフォルトの名無しさん
2013/11/04(月) 20:00:20.72逆に色々不完全な奴ほど精力的だよな。
脳が不完全で矛盾だらけなやつほど行動力がある。
0232デフォルトの名無しさん
2013/11/04(月) 20:02:02.66ガベコレにいいと思うんだ
0233デフォルトの名無しさん
2013/11/04(月) 20:24:42.410234デフォルトの名無しさん
2013/11/04(月) 20:37:01.15戦いが終わった後のために買い物したらどうなるか気付かない奴は不完全
0235デフォルトの名無しさん
2013/11/04(月) 20:54:19.29つまり極論すれば知識や経験などは余計な物というわけですね。
0236デフォルトの名無しさん
2013/11/04(月) 21:28:54.990237デフォルトの名無しさん
2013/11/04(月) 22:02:37.50let result = f x -- fは何か物凄く重い処理
とやって、すぐにプロンプトが帰ってきたので、haskellスゲーと思って、resultの中身みたら長々と重い処理が始まった
これが遅延評価
0238デフォルトの名無しさん
2013/11/04(月) 22:03:02.680239デフォルトの名無しさん
2013/11/04(月) 22:59:28.85a[1][1][1] = a;
循環するデータ構造を作りたいとき
遅延評価がないとnullと代入が出てくる
0240デフォルトの名無しさん
2013/11/04(月) 23:31:37.280241デフォルトの名無しさん
2013/11/05(火) 08:24:52.57これマルチコアプログラミング時の落とし穴なんですよね
リワハざっと読みましたけど
0242デフォルトの名無しさん
2013/11/05(火) 11:22:49.670243デフォルトの名無しさん
2013/11/05(火) 12:13:31.950244デフォルトの名無しさん
2013/11/05(火) 15:24:04.130245デフォルトの名無しさん
2013/11/05(火) 17:52:50.610246デフォルトの名無しさん
2013/11/05(火) 23:09:14.280247デフォルトの名無しさん
2013/11/06(水) 01:58:38.620248デフォルトの名無しさん
2013/11/06(水) 04:59:36.76オナニー言語らしいじゃないか。
0249デフォルトの名無しさん
2013/11/06(水) 07:55:25.420250デフォルトの名無しさん
2013/11/08(金) 21:15:33.740251デフォルトの名無しさん
2013/11/08(金) 23:16:48.080252デフォルトの名無しさん
2013/11/08(金) 23:59:41.000253デフォルトの名無しさん
2013/11/09(土) 00:44:19.30http://hackage.haskell.org/package/base/docs/Data-Foldable.html
0254デフォルトの名無しさん
2013/11/10(日) 23:44:51.91グラフのどの部分がプログラムソースのどの辺りの計算をしている時のものか
予想がつく場合もあれば、なかなか分からない場合もあります。
プログラムソースの中に、なにか目印を付けて、イベントログにその情報を出力し、
ThreadScopeで見た時にその目印がグラフ上に表示されるような事はできるでしょうか。
0255デフォルトの名無しさん
2013/11/11(月) 20:20:01.92Debug.Trace.traceEvent
0256デフォルトの名無しさん
2013/11/11(月) 20:54:46.28ありがとうございます。
これで作業がはかどります。
0257デフォルトの名無しさん
2013/11/11(月) 23:33:16.27この関数で画像ファイルを出力するとき、すでに同じパスのファイルが存在すると、
上書きされずに関数から返ってきます。
エラーも何も起こりません。
新しい画像データで上書きしたように見せかけるには、
もしすでに同じパスのファイルが存在するなら、この関数を使う前に
そのファイルを削除しておくという方法があります。
しかしこの場合、もし writeImage 関数の内部で何かエラーが起きて関数が中断されても、
先に消したファイルは取り戻せません。
writeImage 関数で上書きするもっと良い方法はないでしょうか。
このパッケージの使用はあきらめて、別の画像書き込み用パッケージを探すべきでしょうか。
0258デフォルトの名無しさん
2013/11/11(月) 23:37:29.60ファイルを別名に変えればいいじゃん。
0259デフォルトの名無しさん
2013/11/12(火) 00:20:45.95アドバイスありがとうございます。
不格好ではありますが、幾分マシになったと思います。
リネームする方法を採用してみます。
0260デフォルトの名無しさん
2013/11/13(水) 00:41:35.89乱数関数を使うときというような例はよく出てくるのですが、もっと効果がはっきりした
使用例を知りたいのですが
0261デフォルトの名無しさん
2013/11/13(水) 01:22:02.64カウンタ
0262デフォルトの名無しさん
2013/11/13(水) 12:49:22.82なんか設定加える必要あるの?
0263デフォルトの名無しさん
2013/11/13(水) 15:04:46.39なるほど。ありがとうございます。カウンタは小さいが典型的ということでしょうか。
ただカウンタの例だと、Stateモナドってその程度のものかとも思ってしまうのですが、
これぞという使用例はないでしょうか?
0264デフォルトの名無しさん
2013/11/13(水) 15:59:02.30使うStateに別名をつけるとわかりやすいか
俺はプログラミング初心者なんでよくわかりませんが
0265デフォルトの名無しさん
2013/11/13(水) 17:09:26.450266デフォルトの名無しさん
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
0267デフォルトの名無しさん
2013/11/13(水) 23:49:38.29hoogle data --local
hoogle server --local
として稼動させたのですが、ドキュメントのパスにパーセントエンコードが含まれる場合に File not found となるようです。
http://gazo.shitao.info/r/i/20131113234831_000.png
パーセントエンコードが含まれないパスなら問題ありませんでした。
これは何か設定上の問題でしょうか? それとも hoogle のバグでしょうか?
バグだとしたら src/Web/Server.hs あたりのどこかで urlDecode をかませばよさそうに思いますが…。
解決策をご教示いただければ助かります。
0268デフォルトの名無しさん
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
このような関数は定義できません、考えれば当然のことですが
一つのリストに入れ、その中身を取り出すような方法はないでしょうか?
0269デフォルトの名無しさん
2013/11/14(木) 03:21:12.40foo :: Int -> Func
bar :: Int -> Func
[(Int -> Func)]
でどうでしょうか?
0270デフォルトの名無しさん
2013/11/14(木) 07:41:00.40data 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
こうですかね
めんどい
0271デフォルトの名無しさん
2013/11/14(木) 07:47:10.42>>> let b = B succ
>>> let f = test b :: Int -> Int
>>> f 0
1
0272デフォルトの名無しさん
2013/11/14(木) 08:25:16.27test (F f) _then _else = _then f
test (B b) _then _else = _else b
0273デフォルトの名無しさん
2013/11/14(木) 17:24:35.790274デフォルトの名無しさん
2013/11/14(木) 17:41:00.57if も関数に出来たと思うんだけど、なんで構文になってるんだろう。
0275デフォルトの名無しさん
2013/11/14(木) 19:26:47.21http://www.haskell.org/onlinereport/haskell2010/haskellch3.html#x8-220003
0276デフォルトの名無しさん
2013/11/14(木) 19:32:45.49個人的には、if :: Bool -> a -> a -> a という関数より、
if then else という構文の方がソースが見やすい
関数にすると括弧が増えて lisp/scheme みたいになる
0277デフォルトの名無しさん
2013/11/14(木) 20:09:36.15http://gazo.shitao.info/r/i/20131114200901_000.jpg
0278267
2013/11/14(木) 20:10:31.280279デフォルトの名無しさん
2013/11/14(木) 21:05:05.02という願望がある限り解決しないみたいなパターンか
0280デフォルトの名無しさん
2013/11/14(木) 22:21:27.34次のオプションを解析したいです。
-a か -b のどちらかのオプションが排他的に指定できる
もし -b を指定するなら、追加で数値を指定できる(-b 3 や -b 17 など)
このようなオプションは cmdargs パッケージで解析できるのでしょうか。
0281デフォルトの名無しさん
2013/11/15(金) 12:31:14.320282デフォルトの名無しさん
2013/11/15(金) 12:36:14.18これ軽量化するオプションか何かないですか?
0283デフォルトの名無しさん
2013/11/15(金) 12:43:57.99言語機能としては GHC ほどまではサポートできていないので、
トレードオフだわな。
0284デフォルトの名無しさん
2013/11/15(金) 12:45:33.64「haskell executable size」でググると色々方法が出てくる
0285デフォルトの名無しさん
2013/11/15(金) 12:53:14.63sharedライブラリとしてインストールされているパッケージを使っているならダイナミックリンクできます
ghc -dynamic hoge.hs
ついでにstripしてもいいのではないでしょうか
0286デフォルトの名無しさん
2013/11/15(金) 12:56:30.620287デフォルトの名無しさん
2013/11/15(金) 15:46:57.27Haskellにかんするドキュメントのページが見当たらない
なのでhttp://www.haskell.org/ghc/docs/7.6-latest/html/libraries/index.htmlから勉強しようと思うんだけど
リファレンスとかチュートリアルは公式サイトに用意されてないのですか?
0288デフォルトの名無しさん
2013/11/15(金) 16:09:38.87それがリファレンスでないと申すか。
0289デフォルトの名無しさん
2013/11/15(金) 16:26:12.12http://www.haskell.org/haskellwiki/Tutorials
でも、全くゼロからの入門なら入門書の一冊くらいは読んだ方がいいと思うぞ。
0290デフォルトの名無しさん
2013/11/15(金) 17:14:35.49Just x + Just y = Just (x+y);
Just _ + Nothing= Nothing;
Nothing+ Just _ = Nothing;
}
というような定義をすると (*) などのメソッドが定義されていないとして警告が出ます。
使う必要がなくてメソッドを定義しない場合に、意図的に未定義なのだということを明示して警告を抑制する方法はありますか?
0291デフォルトの名無しさん
2013/11/15(金) 17:28:39.660292デフォルトの名無しさん
2013/11/15(金) 17:49:09.330293290
2013/11/15(金) 17:57:41.63ありがとうございます。
それをヒントに調べたところ
(*) = undefined;
というようにすればよいことがわかりました。
0294デフォルトの名無しさん
2013/11/15(金) 18:01:52.03そんな風に見境なくインスタンス宣言していいものなの?
いろいろ訳の分からない事が起こりそうな気がするんだけど…
0295デフォルトの名無しさん
2013/11/15(金) 18:23:33.710296290
2013/11/15(金) 18:25:41.59ここでは例として Maybe を出しましたが、そういう基本的な型をインスタンスにしするのはあまり筋が良くないでしょうね。
実際にやろうとしていたのは自分で定義した2x2行列の型のべき乗なんです。
単に (^) を使いたいけどそのためには Num のインスタンスでなければならずかけ算だけは定義されていなければならないという状況です。
0297デフォルトの名無しさん
2013/11/15(金) 19:07:23.87メソッドの定義だけでなく Num a => がついてる全ての定義を実体化する宣言だから
その全てに対して意図的にundefinedにしたことを明示するのは無理じゃないかね
0298デフォルトの名無しさん
2013/11/16(土) 04:08:32.69よくないと思う。Minimal complete definitionすら定義できないってことは
“そもそもその型はそのクラスのインスタンスではない”ということだと思う
つまり、そのインスタンス宣言は純粋に間違っている
0299296
2013/11/16(土) 13:57:22.51なるほど。 >>296 のような状況なのですが、 (*) も未定義にしてみたところコンパイルは通っちゃいますね。
そんでもって実行時エラー。
しかし、必要な (実際に使われる) メソッドが定義されていないというのはコンパイル時に検出できないものなのでしょうか。
現在の GHC は「実際に使われはしないけどクラス定義が要求するメソッドを定義してない」のも
「実際に使われるメソッドを定義してない」のも等しく警告しか出さないというのはちょっと微妙な挙動に思えます。
0300デフォルトの名無しさん
2013/11/16(土) 13:57:27.77チュートリアルでないことは確かだな
0301デフォルトの名無しさん
2013/11/16(土) 14:11:16.78実際にはundefinedを呼ぶという定義をしているだけで
それの定義がこれなので問題なくコンパイルできるし実行時に評価されればエラーを出すっぽい雰囲気ですね
undefined :: a
undefined = error "Prelude.undefined"
headでも空リストを適用したのが評価されれば実行時にerrorになるっぽいそんな雰囲気
0302301
2013/11/16(土) 14:15:35.96勘違いしてた
0303301
2013/11/16(土) 14:18:17.260304デフォルトの名無しさん
2013/11/16(土) 14:24:27.83どのメソッドが使われるかは静的には分からないから、
「実際に使われた場合のみ」警告するのは難しい
(ごく粗い近似ならできそうだけど、粗すぎて役に立たない可能性がある)
スタイルとしては、型クラスのインスタンスは必要なメソッドを全部定義するべきとされている
(*)が定義できないなら、おそらくその型はNumにしない方が良い
AdditiveGroupとか検討しても良いと思う
http://hackage.haskell.org/package/vector-space-0.8.6/docs/Data-AdditiveGroup.html
0305デフォルトの名無しさん
2013/11/16(土) 14:35:45.250306290
2013/11/16(土) 14:39:26.600307デフォルトの名無しさん
2013/11/16(土) 14:50:24.03環なら*に交換法則無くてもいけるから*との分配法則が成り立つアーベル群をなす加算を適当にでっち上げればいけなくも無いんじゃないかな
0308290
2013/11/16(土) 14:56:49.660309デフォルトの名無しさん
2013/11/16(土) 14:57:35.200310デフォルトの名無しさん
2013/11/16(土) 15:09:59.70absは行列のノルムと単位行列のスカラー積にしたらいけるんできるんじゃないかな
0311デフォルトの名無しさん
2013/11/16(土) 15:11:04.780312デフォルトの名無しさん
2013/11/16(土) 15:19:58.27でもそれだとインスタンスにできないから戻す単位元と乗じる等して台集合の中に戻す必要がある
0313デフォルトの名無しさん
2013/11/16(土) 19:15:30.900314デフォルトの名無しさん
2013/11/16(土) 19:24:36.46コード見ても何か居てあるのかさっぱりわかりませんよ
0315デフォルトの名無しさん
2013/11/16(土) 19:32:27.110316デフォルトの名無しさん
2013/11/16(土) 20:01:49.67#name での quoting って、ないんですか?
# を使うと、section なら、 () で囲めって怒られます。
検索で、うまく引っ掛からないんで、教えてください。
0317デフォルトの名無しさん
2013/11/16(土) 20:33:02.77たとえば、どんなコードですか?
もしかしたら、そのコードの書き方が悪いのかもしれません。
コードに問題は特に無く、単にあなたが未熟なだけかもしれませんが。
0318デフォルトの名無しさん
2013/11/16(土) 20:43:43.45.cabal/config を設定しているのですが、そのドキュメントに対して、
ソースコードへのリンクを張るように設定するにはどうすればよいのでしょうか。
http://hackage.haskell.org/packages/ ここのドキュメントみたいにしたいです。
0319デフォルトの名無しさん
2013/11/17(日) 00:12:47.66ラムダを使ってる箇所は大抵開いて書き直す事ができて(関数定義の局所性などの問題を除けば)
同等で長ったらしい形に書き直せる.
そういう書き直しの練習をいくつかしてみれば,自分の理解に応じて「ここは確かにラムダで簡単に書きたい」とか
思うようになるかもしれないし「ここはわざわざラムダ使うより where できちんと関数定義したほうがいいな」とか
色々思うようになるんじゃないかな
0320デフォルトの名無しさん
2013/11/17(日) 00:32:09.25関数型にはほとんど言語的メリットはないよ
0321デフォルトの名無しさん
2013/11/17(日) 01:34:49.91gccを使う環境だと、CPPはgcc -P -tradirionalが使われる
これはANSI C以前のCPPなので#での文字列化はできない
代わりに
#define Foo(x) "x"
みたいなことができる
0322デフォルトの名無しさん
2013/11/17(日) 01:46:05.54cabal install --haddock-hyperlink-source
configファイルではまだ指定できないらしい
https://github.com/haskell/cabal/issues/931
0323デフォルトの名無しさん
2013/11/17(日) 11:38:01.41ifが関数でも構文でもBoolの値で分岐すること自体は否定されないから大差ない
オブジェクト指向だと、値で分岐するな、オーバーライドかオーバーロードで分岐しろ、
ってのが面倒臭い
0324デフォルトの名無しさん
2013/11/17(日) 12:18:27.790325デフォルトの名無しさん
2013/11/17(日) 12:20:28.430326デフォルトの名無しさん
2013/11/17(日) 12:25:33.080327デフォルトの名無しさん
2013/11/17(日) 12:49:01.49ありがとうございます。
コマンドラインオプションもひと通り見たはずなんですが、見落としていました。
助かりました。
0328デフォルトの名無しさん
2013/11/17(日) 13:41:10.36Haskellで書かれてるから
0329デフォルトの名無しさん
2013/11/17(日) 14:10:09.210330デフォルトの名無しさん
2013/11/17(日) 14:23:07.17まあ、単にサーバが貧弱だとか管理が適当なだけとかでしょ
0331デフォルトの名無しさん
2013/11/17(日) 14:50:23.33Hayooは使いやすいからもっと安定してくれると助かるんだけど・・・。
0332デフォルトの名無しさん
2013/11/17(日) 14:51:25.29インフラ代恵んでやるぐらい金ある所もあるのにそれをしないというのはわけがあるんだろうな
0333デフォルトの名無しさん
2013/11/17(日) 15:08:04.84そうだったのか
許さんぞLisperめ
0334デフォルトの名無しさん
2013/11/17(日) 15:35:51.590335デフォルトの名無しさん
2013/11/17(日) 15:58:35.44待ってろよ…今からエディタの括弧ハイライトに細工してきてやる
0336デフォルトの名無しさん
2013/11/17(日) 17:07:45.09もっと増えないかなぁ
0337デフォルトの名無しさん
2013/11/18(月) 08:32:35.92それよりライブラリリファレンスをスマホからみたい
拡大縮小ちまちませずにズババババーンと表示して欲しい
0338デフォルトの名無しさん
2013/11/18(月) 11:39:22.93Prelude.head: empty list
0339デフォルトの名無しさん
2013/11/18(月) 12:39:38.200340デフォルトの名無しさん
2013/11/18(月) 13:06:25.940341デフォルトの名無しさん
2013/11/18(月) 14:36:13.28http://www.geocities.jp/m_hiroi/func/haskell.html
0342デフォルトの名無しさん
2013/11/18(月) 16:28:51.950343デフォルトの名無しさん
2013/11/18(月) 19:51:07.62広井氏のページは他の言語でも参考にしているよ。
個人ページ特有の調子こいた感じが全くなくて読みやすい。
0344デフォルトの名無しさん
2013/11/18(月) 23:16:16.060345デフォルトの名無しさん
2013/11/19(火) 00:31:59.980346デフォルトの名無しさん
2013/11/19(火) 02:00:39.83待ちくたびれた
0347デフォルトの名無しさん
2013/11/19(火) 11:37:59.44最新厨ども
0348デフォルトの名無しさん
2013/11/19(火) 11:51:14.850349デフォルトの名無しさん
2013/11/21(木) 12:53:27.66そのイベントログを ThreadScope で Event labels を有向にして見てみると、
自分が書きだしたメッセージ以外にもランタイムが書きだした大量のメッセージもいっしょに表示され、
自分のメッセージがその中に埋もれてしまいます。
自分が書きだしたメッセージがログのどこにあるのか、検索する方法は無いでしょうか。
あるいは、色を変えたりして目立たせる方法でもいいのですが。
今は吐き出したイベントログを Emacs で開いて、自分のメッセージを検索し、
ログ全体のどの当たりにメッセージがありそうか当たりをつけてから、
ThreadScope で開いてその辺りを探しています。
しかし、非常に効率悪く、ThreadScope 上ではどうにも見つからない場合もあります。
(無いはずはないのですが・・・)
0350デフォルトの名無しさん
2013/11/21(木) 19:18:15.01ghc-eventsというコマンドラインツールがある(ghc-eventsパッケージ)
ghc-events show <eventlogファイル>
でイベントの一覧がタイムスタンプ付きで出るので、grepとかで探せばいい
0351デフォルトの名無しさん
2013/11/21(木) 19:45:28.93ありがとうございます。
幾分楽になりました。
0352デフォルトの名無しさん
2013/11/24(日) 11:41:09.78qualified 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, ...
と書かれいているのですが・・・
0353デフォルトの名無しさん
2013/11/24(日) 12:23:57.09現在のByteStringのfoldrの定義がおかしいのが原因
次のリリースで直るはず
0354デフォルトの名無しさん
2013/11/24(日) 13:55:05.79ありがとうございます。
とりあえず今のところはリストに一度変換するようにプログラムしておいて、
修正は気長に待ちます。
0355デフォルトの名無しさん
2013/11/24(日) 14:22:52.50import 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
0356355
2013/11/24(日) 15:35:51.45すいません、自己解決しました。
f 関数を使って、TestT a の型変数 a に具体的な型を与えるようなことをしたら、
ちゃんと NFData のインスタンスではないことを知らせるエラーが出ました。
0357デフォルトの名無しさん
2013/11/25(月) 13:47:19.60ghciで:infoしてもエラー吐かれるだけです
どこにあるかご存知の方いらっしゃいませんか
ghcのバージョンは7.6.3です
0358デフォルトの名無しさん
2013/11/25(月) 14:28:16.220359デフォルトの名無しさん
2013/11/25(月) 19:05:44.75~は演算子じゃなくて構文だからソースレベルの定義はどこにもない
ghcは内部的には型構築子として扱うっぽいけど(prelude/TysWiredIn.hsのeqTyCon)
0360デフォルトの名無しさん
2013/11/26(火) 12:06:37.60実はghcのソースを読んでてみてそれらしいコードが無かったのでもしかしたらと思っていましたが、やはりそうでしたか
ていうことは~はhaskellで実装できないのでしょうか
どうしても似たような機能を持つ演算子が欲しいのですが
0361360
2013/11/26(火) 18:58:55.97似たような演算子というのは、例えば型リストxs::[*]と型x::* があるとします
この時「xsの中にxが含まれている」という型制約を表す演算子です
そのような演算子は論理的に実装可能でしょうか
よろしくお願いします
0362デフォルトの名無しさん
2013/11/26(火) 20:53:14.13data (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の型システムの上でそれっぽいものは作れるようだけど
0363360
2013/11/27(水) 17:12:12.44ありがとうございます
自分にHaskellの能力が無いためか、これを使いこなすのは難しそうです
あきらめてgeneric使います
0364デフォルトの名無しさん
2013/11/27(水) 19:57:08.37>>362 をものにすることを諦めると申すか
少々もったいない気もする
0365デフォルトの名無しさん
2013/11/27(水) 21:55:26.220366デフォルトの名無しさん
2013/11/28(木) 01:30:16.80↓の3ページ目「Haskellドリル」で勉強したまえ(ただし、非売品)
「Haskellは企業でも十分実用になる」、NTTデータが
ソースコード解析サービスの舞台裏を披露 2013/11/26
http://itpro.nikkeibp.co.jp/article/NEWS/20131126/520642/
0367デフォルトの名無しさん
2013/11/28(木) 01:51:04.77NTTデータに入れなければHaskell書くなということですねやめてくださいしんでしまいます
0368デフォルトの名無しさん
2013/11/28(木) 09:26:05.25>30人体制のチームで、1500ファイル、35万行のツールをHaskellで開発
1人約1万1千行か・・・
半年以上かけて作ってる俺のプログラムは未だに5千行を超えてないw
35万行で1500ファイルだと平均230行/ファイル。
モジュールの粒度としては似たようなもんだな。
0369デフォルトの名無しさん
2013/11/28(木) 11:22:35.70モナドを、途中で他のものに変更する、
または直接中身を取り出す事はできますか?
具体的にはIOの文脈で、他のMonad(QuickCheck.Gen)の値を、
直接取り出す方法を探しています。
初心者ですので、キーワードだけでも教えていただけると助かります。
0370デフォルトの名無しさん
2013/11/28(木) 11:40:27.79Test.QuickCheck.Genのsample'を見落としていました。
ちなみに、これは汎用的に取り出す方法はあるんでしょうか?
0371デフォルトの名無しさん
2013/11/28(木) 11:47:02.68私は全く違う言語を使っているので感覚がわからないのですが、
1ファイル平均230行というのは途方もなく大きく思えるのですが。
大規模開発だとそんなものなのですか?
0372デフォルトの名無しさん
2013/11/28(木) 12:01:01.15Genに関してはTest.QuickCheck.Gen.unGen使えば取り出せるよ
一般的にいえばMonad mの文脈でMonad nの値を使うには
nからmへのMonadTransformerがあればliftを使って取り出す(持ち上げる)ことができる
0373デフォルトの名無しさん
2013/11/28(木) 12:09:35.78ファイル数: 27551
合計行数: 6414627
平均: 232.8
0374デフォルトの名無しさん
2013/11/28(木) 12:11:59.250375デフォルトの名無しさん
2013/11/28(木) 12:14:37.58unGenの方が使えそうですね。
MonadTは名前だけは知ってましたが、そういうものだったんですね。
MonadTransformerとliftで調べてみます。
ありがとうございました。
0376デフォルトの名無しさん
2013/11/28(木) 12:35:58.36知らんけどC/C++で何で例外が気になるんだ?
ほとんど使われてないと思うが
0377デフォルトの名無しさん
2013/11/28(木) 12:37:47.840378デフォルトの名無しさん
2013/11/28(木) 12:47:28.25例外処理とエラーって別なんですかね
初心者なんでその辺わからないんですよ
0379デフォルトの名無しさん
2013/11/28(木) 12:56:53.98別
例外処理はエラー処理方法の一つに過ぎない
0380デフォルトの名無しさん
2013/11/28(木) 13:00:48.74例えば壊れたり、不正なコンフィグファイルを読み込んだ時デフォルト設定に差し替えて起動したり、
起動せずに修正するようにユーザーに促したりという処理はしませんか
それとも放置なんでしょうか。プロの皆さんはどうしてます?
0381デフォルトの名無しさん
2013/11/28(木) 13:03:02.82C++ではそれをいちいち例外でやらない
議論したいなら別スレ立てろ
0382デフォルトの名無しさん
2013/11/28(木) 14:20:20.85230行はそれ程大きく感じないな。
むしろ丁度いいか、やや小さめって感じ。
今のプログラム内で最大モジュールは1千行近い。
早い段階で分割しすぎると試行錯誤が面倒になるから、
落ち着くまではそのままにしてる。
この辺は大規模開発かどうかはあまり関係ない気がするな。
ちなみに、どんな言語使ってるの?
0383デフォルトの名無しさん
2013/11/28(木) 14:59:53.84Prologです。述語ごとにファイルを作りますから、平均5行ですね。
0384デフォルトの名無しさん
2013/11/28(木) 15:15:23.44その立場から見たら殆ど全ての言語が古臭く冗長に見えちゃう
それこそscalaになれた人から見たjava以上の差を感じるのだろう
0385デフォルトの名無しさん
2013/11/28(木) 17:47:04.280386デフォルトの名無しさん
2013/11/28(木) 17:55:53.450387デフォルトの名無しさん
2013/11/28(木) 18:13:13.570388デフォルトの名無しさん
2013/11/28(木) 20:34:32.16ましてや第五世代言語なんて定義無いと思うけど。
0389デフォルトの名無しさん
2013/11/28(木) 20:50:27.80のエレガントな実装を見せてください。
0390デフォルトの名無しさん
2013/11/28(木) 21:14:18.64sqrt $ fromInteger 15
この型は
Floating a => a
じゃないですか。
で、もうひとつ関数を追加して
floor $ sqrt $ fromInteger 15
としたらこの型は
Integer
になるじゃないですか。
このとき sqrt が返す値の型は Floating クラスに属するわけで、
floor が受け取れるんだから RealFrac クラスでもあるような型ってことになるわけです。
でも、そうなると候補は Float と Double のふたつがあることになると思うんですけど、
実際にはどちらで処理されるんですか?
0391デフォルトの名無しさん
2013/11/28(木) 21:25:03.32特に指定しなければDouble
http://www.sampou.org/haskell/report-revised-j/decls.html#default-decls
0392デフォルトの名無しさん
2013/11/28(木) 22:02:39.72http://en.wikipedia.org/wiki/Fifth-generation_programming_language
0393デフォルトの名無しさん
2013/11/28(木) 22:29:06.51効率やシャッフルの質を重視するなら 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')
0394デフォルトの名無しさん
2013/11/28(木) 22:56:28.42fmapの辺りは何をしているのでしょうか?
0395394
2013/11/28(木) 22:59:41.670396デフォルトの名無しさん
2013/11/30(土) 22:16:18.650397デフォルトの名無しさん
2013/11/30(土) 22:24:15.07Python の次とか前とか考えることに全く意味はないと思います。
いつでもいいので興味が向いた時にいじってください。
0398デフォルトの名無しさん
2013/12/01(日) 00:24:53.520399デフォルトの名無しさん
2013/12/01(日) 01:22:01.13貴方とは違う意見のようです。
「言語設計者たちが考えること」という本でインタビューを受けた作者のひとりは、
他言語を学んでからという趣旨のことを言っていました。
どちらかと言えば、私も作者に同意見です。
問題の解法の表現方法が大きく違うというのをリスクとみなすならば、
それは初めにHaskellを学んだ後の次の言語にも言えることてす。
初心者にとっては他言語(特に手続き型)の方が、
問題を抽象化して解法を導くのに必要な考え方を学びやすいと思います。
また指導者も教えやすいと思います。
その考え方は、Haskellだろうと何だろうと全ての言語で通用するものです。
0400デフォルトの名無しさん
2013/12/01(日) 01:55:03.00俺もExcelシート+VBAで基本的な問題解決方法を学んでからHaskellに移った方が良いと思う。
0401デフォルトの名無しさん
2013/12/01(日) 05:22:45.490402デフォルトの名無しさん
2013/12/01(日) 09:05:52.82手続き型を教えるなら、まずブロック図や回路図を見せながら16bit機の
アセンブラを教えて、その後C言語を教えた方が良いと思う。
0403デフォルトの名無しさん
2013/12/01(日) 09:14:17.11(無限の配列に対してだと無限ループになりますけどそれはとりあえず置いときます。)
なので、そういう場合には無かったことにするとか、そういう書き換え規則を表現することってできますか?
Common Lisp で言うところのコンパイラマクロみたいなもののことです。
GHC の拡張でそういうのがあったような気がするのですがどうにも詳しいことを重い出せなくて。
0404デフォルトの名無しさん
2013/12/01(日) 10:34:13.84四則演算もわからない小学生に実数の定義から教えようってことかい?
0405デフォルトの名無しさん
2013/12/01(日) 10:34:57.93http://big.freett.com/shelarcy/rewriterules.pdf
白石さんが昔書いたスライドにあった
RULESプラグマを使えば良いようだ
reverse . reverse = idならいけるけど
自然変換の性質を使ってreverse . f . reverse <=> f . reverse . reverse <=> f . id
みたいなのもできると面白そうだけど多分無理だろうな
0406デフォルトの名無しさん
2013/12/01(日) 10:37:01.89書き換え規則の 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 書き換え規則」の項を見てください。
0407406
2013/12/01(日) 10:49:34.80もっとひどい事もあります。
{-# 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 での話です。
昔はどうだったか知りません。
0408デフォルトの名無しさん
2013/12/01(日) 14:33:23.730409デフォルトの名無しさん
2013/12/01(日) 14:48:53.820410デフォルトの名無しさん
2013/12/01(日) 15:30:12.24GHC 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]を指定すれば、この式も問題なく書き換えられるようになる
((.)をインライン化した後で規則に適合するようになるので)
0412デフォルトの名無しさん
2013/12/01(日) 17:27:02.46Node.js
0413デフォルトの名無しさん
2013/12/01(日) 22:52:18.230414デフォルトの名無しさん
2013/12/04(水) 09:16:56.71マクロ話の方向ですね分かりました
0415デフォルトの名無しさん
2013/12/04(水) 11:23:46.820416デフォルトの名無しさん
2013/12/04(水) 12:36:16.753日も経ったその返しはちょっと寒い
0417デフォルトの名無しさん
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 = ???
0418デフォルトの名無しさん
2013/12/05(木) 00:19:13.620419デフォルトの名無しさん
2013/12/05(木) 12:11:26.620420417
2013/12/05(木) 14:13:36.53もうすこし調べて、上のabc/defがテンソル積だと分かりました
失礼しました
0421デフォルトの名無しさん
2013/12/05(木) 23:06:19.730422デフォルトの名無しさん
2013/12/06(金) 01:01:22.83長年のご愛顧に感謝して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円
0423デフォルトの名無しさん
2013/12/06(金) 06:43:45.00たまに
0424デフォルトの名無しさん
2013/12/06(金) 07:05:22.77「functorを作る」の意味がよく分かりませんが、
Functorクラスのインスタンスを作るという意味でしょうか。
であれば、私はよくあります。
data で自前の型を作り、その値に対して map を施す必要があるなら、
map*** などその型用の別名 map 関数を作ったりはせず、
その型をFunctorクラスのインスタンスに fmap 関数を定義します。
もし、「functorを作る」が Functorクラスに相当するクラスを自作するという意味なら、
私はそのようなものは作りません。
0425デフォルトの名無しさん
2013/12/06(金) 07:56:19.810426デフォルトの名無しさん
2013/12/06(金) 09:26:05.130427デフォルトの名無しさん
2013/12/06(金) 11:06:00.00timetableの更新だけでもしていただければありがたいのですが...
0428デフォルトの名無しさん
2013/12/06(金) 12:43:09.270429デフォルトの名無しさん
2013/12/06(金) 12:57:18.220430デフォルトの名無しさん
2013/12/06(金) 13:13:41.520431デフォルトの名無しさん
2013/12/06(金) 21:00:47.09ありがとうございます。
質問の意図は前者でした。
0432デフォルトの名無しさん
2013/12/06(金) 21:21:01.16> コンパイラは構文の形しか見ません。
それは Common Lisp (というか他の Lisp でも同じだと思うけど) と同じですね。
もっと踏み込んで関係を表現する方法とかも GHC ならこっそり入ってそうな気がしたけど、それは過大評価かな。
0433デフォルトの名無しさん
2013/12/06(金) 22:04:59.54「もっと踏み込んで関係を表現する方法」って例えばどういうの?
「こっそり入れる」ってどういうこと?
リリースノートに記載がないってこと?
今まで何かこっそり入ってたことってあったっけ・・・
0434デフォルトの名無しさん
2013/12/06(金) 22:34:58.09書籍版半額にしろや
0435デフォルトの名無しさん
2013/12/06(金) 22:37:41.090436デフォルトの名無しさん
2013/12/07(土) 16:37:02.17repa を使っているのですが、次のように記述すれば問題なくコンパイルにパスします。
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 の方の記述だけではエラーが出るのでしょうか。
0437デフォルトの名無しさん
2013/12/07(土) 21:11:15.240439デフォルトの名無しさん
2013/12/07(土) 21:56:00.720440デフォルトの名無しさん
2013/12/07(土) 22:19:01.83import Data.Array.Repa (Z,(:.)(..),DIM2) ってことじゃね?
0441436
2013/12/07(土) 22:45:35.92アドバイスの意図がやっと分かりました。
そして、Haskell 2010 Language Report の [5.3 Import Declarations] を調べてみて、
アドバイスの意味も分かりました。
つまり私は、型構築子 Z と (:.) をインポートしたが、
それぞれの値構築子の方はインポートしていなかったために、
ソース中でそれらを使っている箇所でエラーが報告されていたわけですね。
たまたま型構築子と値構築子が同名なので、質問してレスされるまで気づけなかった、と。
ありがとうございました。
0442デフォルトの名無しさん
2013/12/08(日) 22:41:17.52悪いのは大抵ぼくの方だ(´・ェ・`)
0443デフォルトの名無しさん
2013/12/09(月) 04:10:09.61ghciで画面が流れてしまって見れなくて困っている。
また、コマンドや関数を調べたい時にはどうすればよい?
0444デフォルトの名無しさん
2013/12/09(月) 04:24:46.05> コマンドや関数を調べたい時にはどうすればよい?
それが :? で出てくるわけだが。
画面が流れるのはターミナルの設定をいじれば履歴を残す行数はいくらでも増やせるだろう。
個人的には Emacs 使えと思う。
0445デフォルトの名無しさん
2013/12/09(月) 06:19:20.21ghciにはあまり親切なヘルプ機能がないから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
0446デフォルトの名無しさん
2013/12/09(月) 14:05:38.48ghciコマンドについてはスクロールで
w3mでwebを参照して、関数名は w3m あたりで http://holumbus.fh-wedel.de/hayoo/hayoo.html?query=検索する関数名
で助かった。
0447デフォルトの名無しさん
2013/12/11(水) 16:41:44.81二年前にはクソ苦労した記憶があるんだよな・・・
0448デフォルトの名無しさん
2013/12/11(水) 20:08:46.77そして絶望しろ
0449デフォルトの名無しさん
2013/12/12(木) 00:55:14.10Haskell は僕らを見放したんだ(´・ェ・`)
0451デフォルトの名無しさん
2013/12/12(木) 07:27:00.620452デフォルトの名無しさん
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です
0453デフォルトの名無しさん
2013/12/17(火) 16:02:58.870454デフォルトの名無しさん
2013/12/17(火) 16:09:59.27module Util.Lib where ...
module Project1.Main where ...
みたいにしてHaskellProg直下からコンパイルすれば良いような
0455デフォルトの名無しさん
2013/12/17(火) 17:21:41.100456デフォルトの名無しさん
2013/12/17(火) 21:31:51.000457デフォルトの名無しさん
2013/12/17(火) 22:45:31.16rm -R ../project1/
0458デフォルトの名無しさん
2013/12/18(水) 08:10:45.70幻になってしまうのか
0459デフォルトの名無しさん
2013/12/18(水) 08:22:19.440460デフォルトの名無しさん
2013/12/18(水) 11:41:29.000461デフォルトの名無しさん
2013/12/18(水) 12:37:38.110462デフォルトの名無しさん
2013/12/18(水) 13:41:12.55お薦めパッケージがあれば教えてください。
0463デフォルトの名無しさん
2013/12/18(水) 15:37:27.38お薦めパッケージは特にないごめんよ
0464デフォルトの名無しさん
2013/12/18(水) 16:39:40.01ぐぬぬ...jsonやめてxmlにします。
レスありがとうございました。
0465デフォルトの名無しさん
2013/12/18(水) 16:40:56.360466デフォルトの名無しさん
2013/12/18(水) 16:55:39.340467デフォルトの名無しさん
2013/12/18(水) 17:13:19.77ありがとうございます。
msgpack-rpc
http://hackage.haskell.org/package/msgpack-rpc
開発者が日本人のようなので、これにしようかと思います。
0468デフォルトの名無しさん
2013/12/18(水) 17:51:45.340469デフォルトの名無しさん
2013/12/18(水) 19:06:52.96https://gist.github.com/repeatedly/5011298
0470デフォルトの名無しさん
2013/12/19(木) 15:20:47.51aesonは通信周りの面倒は何もみてくれませぬ・・・
>>469
情報、ありがとうございます。
一読しましたが、問題無さそうです。
0471デフォルトの名無しさん
2013/12/23(月) 00:57:37.05do { [x] <- hoge; 〜
って微妙に違うのね 〜
0472デフォルトの名無しさん
2013/12/23(月) 11:22:11.39型の前に「!」ついてたりするのを見るんだけど、
どういう意味なのか教えてください。
0473デフォルトの名無しさん
2013/12/23(月) 11:30:58.36正格評価になる。
0474デフォルトの名無しさん
2013/12/23(月) 11:43:39.05http://www.haskell.org/ghc/docs/7.4.1/html/users_guide/bang-patterns.html
0475デフォルトの名無しさん
2013/12/23(月) 11:58:09.14>>474
ありがとう。
haskell !
とかググって困ってたので、助かりました。
0476デフォルトの名無しさん
2013/12/23(月) 13:00:45.48main = newEmptyMVar >>= takeMVar
これ、ハングアップするんじゃなくて、
例外 BlockedIndefinitelyOnMVar が投げられるんだな
便利でいいんだが、どういう仕組みでデッドロックを検知してるんだろ
けっこう単純な仕組みなのかな
0477デフォルトの名無しさん
2013/12/23(月) 15:48:22.24MVarもrts側にプリミティブありそれとGCの機構を利用して上手くデッドロック起こしてるスレッドを回収してそのタイミングでシグナル投げる
みたいな仕組みになってるようだ
ただどうやってこのコードによて到達不可能なスレッドオブジェクトになるかっていうのはちょっとコード見ただけじゃわからなかった
0478476
2013/12/23(月) 16:21:49.77結構複雑なことしてるっぽいね
プログラム側からGCの機構にアクセスできるんだね、初めて知った
それとも、アクセスしてるんじゃなくて、たまたま上手く利用できてるだけかな
当然、全てのデッドロックを検知してくれるとは思えんが、
どこまで賢いのか、暇があったら検証してみるよ
ところでこれ、-O2 でコンパイルしてもデッドロックを検知してくれる
この場合は余計な処理をしないで、処理速度の最適化に専念して欲しいんだがなぁ・・・
0479デフォルトの名無しさん
2013/12/23(月) 20:38:43.45ブロックしてるスレッドのスタックはGCのルートにならなくて、
他から参照されなくなった時点でGCされる
(他から参照というのは、ブロックしてるMVarを他スレッドが持ってたり、
ThreadIdオブジェクトを持たれてる場合)
スレッドがGCされるとき、黙って消されるんじゃなくてrtsが例外を投げてくれる
0480476
2013/12/23(月) 23:00:30.74> スレッドが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に「全てのスレッドがアクセスしようとした時点」で、
例外が投げられるということなのかな?
0481デフォルトの名無しさん
2013/12/24(火) 00:06:17.06>ブロックされているのにスレッドが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
0482デフォルトの名無しさん
2013/12/26(木) 21:56:11.68こういう型の値 x があったとして、newtype で宣言してあるから
let D i = x ってやって値構築子を外すのも、
逆に let y = D i ってやって値構築子をかぶせてやるのも、
オーバーヘッドなしで実行されると考えていいんだよね?
0483デフォルトの名無しさん
2013/12/27(金) 00:06:31.650484デフォルトの名無しさん
2013/12/27(金) 06:13:27.23いいよ
0485デフォルトの名無しさん
2013/12/27(金) 06:55:17.650486デフォルトの名無しさん
2013/12/31(火) 11:24:40.65ライブラリごと再インストールしかない?
0487デフォルトの名無しさん
2013/12/31(火) 12:39:02.880488デフォルトの名無しさん
2013/12/31(火) 12:40:01.590489486
2013/12/31(火) 13:10:43.55hscolour プログラムがインストールされていなかったことにあとから気づいたんだ。
これがインストールさけていないと、--hahhock-lhyprtink-source オプションを付けても
html ドキュメントが生成できずにインストールされない。
(ライブラリ自体は問題なくインストールされる)
で、hscolour プログラムをインストールしたんで、
ライブラリだけ後からでもインストールできないかなと思った次第。
パッケージを cabal unpack で落としてきて、
そこから cabal haddock でドキュメントを作ることはできた。
でも、それを正しくインストールする方法がわからない。
まぁ、まだ4、5個くらいしかパッケージをインストールしていない状態だから、
今なら全部はじめから再インストールでもいいんだけどね。
0490デフォルトの名無しさん
2013/12/31(火) 13:43:22.59となると通常の方法ではソースコードも見ないとならんわけで再インストールしか無いのではなかろうか
cabalやhaddockのAPI叩けばhaddock関連をやるだけのcabal-installみたいなものも作れるとは思えるが
わざわざそんなものを作るほどの事でもないのだろう
0491486
2013/12/31(火) 13:55:05.49> わざわざそんなものを作るほどの事でもないのだろう
まぁ、今回はね。
さっさと再インストールすることに決めた。
ただ、今後ドキュメントだけを再インストールしたい、
あるいは一部のドキュメントだけアンインストールしたいなんてことがあった時のために、
方法があれば備忘録に書き留めておこうかなと。
(前に、OpenGL系のライブラリを依存性の関係で2バージョンインストールしたことがあって、
その時もドキュメントは片方だけでいいのに、それも2つ表示されて目障りなこどあったし)
0492デフォルトの名無しさん
2014/01/01(水) 11:59:21.25dが3回以上続く文字列があるかどうか調べたいんだけど、
どうやってやればいいの?
regex-posix パッケージだけで事足りる?
0493デフォルトの名無しさん
2014/01/01(水) 12:05:11.75True
0494デフォルトの名無しさん
2014/01/01(水) 12:06:22.78の要領じゃないか?
{3,}
で回数制限。
0495デフォルトの名無しさん
2014/01/01(水) 12:56:23.35>>494
regex-posix パッケージをインストールし、
"abccdddefddddes" =~ "ddd" :: Bool
"abccdddefddddes" =~ "d{3,}" :: Bool
の両方ともできることを確認しました。
ありがとうございました。
0496デフォルトの名無しさん
2014/01/01(水) 13:08:25.00Char型のリストだけでなく、任意の型のリストで正規表現はできない?
たとえば [True, False, False, True, True, False, True] の中に、
False の後 True が n 回続くサブリストがあるか、みたいな。
0497デフォルトの名無しさん
2014/01/01(水) 13:11:01.140498デフォルトの名無しさん
2014/01/01(水) 13:22:40.52toChar True = 'a'
toChar False = 'b'
ghci> map toChar [True, False, False, True, True, False, True]
"abbaaba"
0499デフォルトの名無しさん
2014/01/01(水) 13:40:53.50>>498
やはり、一度 Char 型にマップしないといけないのか。
そして、正規表現にヒットしたサブリストを得るのなら、
更に Char 型から元の型にマップする、と。
直接できればよかったが、もう探している時間も無いので、
今回はこの方法で乗り切ることにするよ。
二人共ありがとう、助かったよ。
0500デフォルトの名無しさん
2014/01/01(水) 14:11:20.99文字に変換しているのをユーザーに意識させないような関数は
あるかもしれませんが
0501デフォルトの名無しさん
2014/01/01(水) 14:22:21.24http://hackage.haskell.org/package/harp
とか
0502デフォルトの名無しさん
2014/01/01(水) 14:58:26.210503デフォルトの名無しさん
2014/01/02(木) 02:03:42.61オートマトンはデバッグで発狂する
0504デフォルトの名無しさん
2014/01/02(木) 06:13:38.290505デフォルトの名無しさん
2014/01/02(木) 06:34:57.71i -> s -> (o, s)
という型の関数と(初期状態::s)の組でオートマトンを表現できる
実際には問題によって良い表現が違うけど
0506デフォルトの名無しさん
2014/01/02(木) 09:18:23.380507499
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.
この一文も気になる。
0508デフォルトの名無しさん
2014/01/10(金) 23:31:04.34share [mkPersist sqlSettings, mkMigrate "migrateAll"] [persistLowerCase|
TestTable
number Int
name String
|]
というテーブルで、number 列を PRIMARY KEY にしたいんだが、どうすればいい?
0509デフォルトの名無しさん
2014/01/11(土) 00:59:19.010510デフォルトの名無しさん
2014/01/11(土) 15:44:07.63なるほど、そういうことか
ありがと
0511デフォルトの名無しさん
2014/01/11(土) 15:53:53.92ってどういう文法しょうか?
->のこんな使い方を初めて見たのでどういう文法なのかさっぱりわかりません。
0512デフォルトの名無しさん
2014/01/11(土) 15:55:51.06ふつうの型シノニムじゃね?
Adapt1 f t1
は、
Adapt f t1 (IO CInt) -> t1 -> String -> IO ()
という型の略記
0513デフォルトの名無しさん
2014/01/11(土) 16:50:25.39a -> b は aをとってbを返す関数 を表す"型"
型だから型シノニムを使ってそういう風に別名を定義できる
0514デフォルトの名無しさん
2014/01/11(土) 20:12:41.93型シノニムを書く時に、型シグニチャが入っていていいんですか?
Adapt f t1 :: (IO CInt) -> t1 -> String -> IO()
type Adapt1 f t1
なら分かるのですが。
0515514
2014/01/11(土) 20:20:46.14>>513
よく読んだら、
a->bが型そのもので、型シグニチャではないんですね。なんとなく分かりました。
0516デフォルトの名無しさん
2014/01/11(土) 23:38:22.92ghciで:i (->)ってやってみるともう少し理解できるかも
0517デフォルトの名無しさん
2014/01/13(月) 20:12:50.25自前で getChar で Tab の文字コードを拾って、とかやらないといけないのかな。
なにか良いライブラリはある?
0518デフォルトの名無しさん
2014/01/13(月) 20:36:59.210519デフォルトの名無しさん
2014/01/13(月) 21:25:13.690520デフォルトの名無しさん
2014/01/13(月) 21:27:10.400521デフォルトの名無しさん
2014/01/15(水) 19:08:08.480522デフォルトの名無しさん
2014/01/15(水) 19:59:41.79パーサのために図を書いた経験はない
0523デフォルトの名無しさん
2014/01/15(水) 20:03:56.000524デフォルトの名無しさん
2014/01/16(木) 10:42:46.310525デフォルトの名無しさん
2014/01/16(木) 23:56:25.55パーサは正規表現があると途端に読めなくなる
0526デフォルトの名無しさん
2014/01/17(金) 21:44:15.09SQL でいう SELECT * FROM のタイプしかできないの?
全体じゃなくて特定の列のみ読み取るってのは、
select 系関数の戻り値から取捨選択するしか方法ない?
0527デフォルトの名無しさん
2014/01/18(土) 22:38:41.17その方法と、SQLを書くことになるけどrawSqlを使う方法もある
0528デフォルトの名無しさん
2014/01/19(日) 17:23:25.23main = 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
0529デフォルトの名無しさん
2014/01/19(日) 20:47:40.83ghciにロードして
:t takeLast
0530デフォルトの名無しさん
2014/01/20(月) 04:27:32.23instance 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
0531デフォルトの名無しさん
2014/01/20(月) 04:33:53.860532デフォルトの名無しさん
2014/01/20(月) 04:47:48.710533デフォルトの名無しさん
2014/01/20(月) 05:05:18.81f :: b -> a
(,) :: a -> b -> (a, b)
0534デフォルトの名無しさん
2014/01/20(月) 19:22:13.68そっか
今のところ select 系関数の戻り値から取捨選択する方法で困ってるわけではないから、
本当に rawSql が必要な場合以外は今の方法でやっていくことにするよ
ありがと
0535デフォルトの名無しさん
2014/01/20(月) 20:48:18.36これの和訳ってどうなったんだろ
頓挫してないよね?
0536デフォルトの名無しさん
2014/01/20(月) 23:00:10.07putStr $ 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]ならわかるのですが
教えてください。よろしくお願いいたします
0537デフォルトの名無しさん
2014/01/20(月) 23:12:36.31それはちょっと基本的すぎる見落としだな。
map の型を見よ。
0538デフォルトの名無しさん
2014/01/20(月) 23:12:41.790539デフォルトの名無しさん
2014/01/20(月) 23:17:46.22csがStringなんだからaはCharだよね
0540デフォルトの名無しさん
2014/01/20(月) 23:18:57.04第一引数が、aを引数にとり、bを返す関数と、第二引数がリストですよね…
0541デフォルトの名無しさん
2014/01/20(月) 23:24:53.70ここではaがChar、bがStringということでしょうか
0542デフォルトの名無しさん
2014/01/20(月) 23:26:00.70Rubyに帰ろうと思います
みなさんありがとうございました
0543デフォルトの名無しさん
2014/01/20(月) 23:27:06.95そう。それをconcatしてるから
expandの型は String -> String
0544デフォルトの名無しさん
2014/01/20(月) 23:28:02.580545デフォルトの名無しさん
2014/01/20(月) 23:34:55.82cs(String(リスト))は[a]にあたるから、aはCharである
こういうことでしょうか
0546デフォルトの名無しさん
2014/01/20(月) 23:35:13.680547デフォルトの名無しさん
2014/01/20(月) 23:39:11.46本当に良いモノは普及させない
0548デフォルトの名無しさん
2014/01/20(月) 23:43:01.52mapの第二引数[a]は、[Char]に置き換えられるから、aはChar
0549デフォルトの名無しさん
2014/01/21(火) 00:02:37.95map :: (Char -> [Char]) -> [Char] -> [[Char]]
a = Char
b = [Char]
-- Stringは[Char]と同じ
type String = [Char]
map :: (Char -> String) -> String -> [String]
0550デフォルトの名無しさん
2014/01/21(火) 00:03:10.550551デフォルトの名無しさん
2014/01/21(火) 00:05:06.46expand "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"
0552デフォルトの名無しさん
2014/01/21(火) 00:09:08.450553デフォルトの名無しさん
2014/01/21(火) 08:09:27.66そんなつまんない理由なのか。
あたくしのなんか普及したら人類が滅んでしまうから公開してないのに。
0554デフォルトの名無しさん
2014/01/21(火) 16:03:34.10おい、そんなこといっていいのか?
お前のプログラム、闇プログラマに狙われるぞ
0555デフォルトの名無しさん
2014/01/21(火) 16:38:21.70実務で使ってる人数人しか知らんのだけど。
つかどんな仕事してんの
0556デフォルトの名無しさん
2014/01/21(火) 16:39:30.410557デフォルトの名無しさん
2014/01/21(火) 17:21:40.39ロシアのハッカーとかですか?
あたくしは不用意に>>556などを踏んでIP抜かれたりしませんし。
それにあたくしのタワゴトを信じる人は皆無でしょ?
0558デフォルトの名無しさん
2014/01/21(火) 17:28:35.510559デフォルトの名無しさん
2014/01/21(火) 18:20:35.59闇プログラマもjanestreetもしらんとは、精進しろ
0560デフォルトの名無しさん
2014/01/21(火) 19:32:39.420561デフォルトの名無しさん
2014/01/21(火) 19:34:50.15x スレ
o 板
0562デフォルトの名無しさん
2014/01/21(火) 23:33:07.70英語が小学校、関数型とデータマイニングが中学での履修範囲になったよ
0563デフォルトの名無しさん
2014/01/21(火) 23:47:39.490564デフォルトの名無しさん
2014/01/21(火) 23:48:37.66マジで。手続き型が許されるのは小学生迄よねwwwとか言われる時が来るのか(´・_・`)
0565デフォルトの名無しさん
2014/01/21(火) 23:58:29.57もっとも、今だってムダしか教えてないけど
0566デフォルトの名無しさん
2014/01/22(水) 12:16:46.00学習しないんだな
0567デフォルトの名無しさん
2014/01/22(水) 13:49:13.760568デフォルトの名無しさん
2014/01/22(水) 16:48:50.61むしろ数学科のほうが学ぶ可能性が高い
名大は数学科だと定理証明系を習うみたいだね
0569デフォルトの名無しさん
2014/01/22(水) 17:53:08.430570デフォルトの名無しさん
2014/01/22(水) 18:00:35.02パッと見、定理証明の方が開発に役立ちそうなんだけど
0571デフォルトの名無しさん
2014/01/22(水) 18:01:47.48Youtubeに上がってる動画の方がマシってな講義してんじゃねーよカス共
0572デフォルトの名無しさん
2014/01/22(水) 18:04:39.66中堅私大ぐらいだとせいぜいjava
0573デフォルトの名無しさん
2014/01/22(水) 18:46:06.82情報と称してるだけで計算機科学をろくにやってないようなとこならともかく。
0574デフォルトの名無しさん
2014/01/22(水) 18:55:27.03それにhaskellは向いてないから微妙だと思うが
haskell教えてる大学があるなら具体的にどこだよ
0575デフォルトの名無しさん
2014/01/22(水) 19:14:42.22ちなみにRubyは完全にただの手続き型言語として使われていた
0576デフォルトの名無しさん
2014/01/22(水) 19:52:34.730577デフォルトの名無しさん
2014/01/22(水) 20:36:57.600578デフォルトの名無しさん
2014/01/22(水) 20:45:50.610579デフォルトの名無しさん
2014/01/22(水) 20:48:49.860580デフォルトの名無しさん
2014/01/22(水) 20:52:26.31おみゃーさん、大学名の略称は格好悪いでよ。
0581デフォルトの名無しさん
2014/01/22(水) 21:14:15.220582デフォルトの名無しさん
2014/01/22(水) 21:25:13.32出身大学の偏差値なんて50きってたがPrologならやったぞ
0583デフォルトの名無しさん
2014/01/22(水) 21:28:11.020584デフォルトの名無しさん
2014/01/22(水) 21:51:48.490585デフォルトの名無しさん
2014/01/22(水) 22:52:17.73HaskellでAPI叩いてるだけのヤツらはアホに見える
0586デフォルトの名無しさん
2014/01/22(水) 23:07:17.890587デフォルトの名無しさん
2014/01/22(水) 23:17:34.960588デフォルトの名無しさん
2014/01/22(水) 23:25:08.490589デフォルトの名無しさん
2014/01/22(水) 23:39:14.180590デフォルトの名無しさん
2014/01/22(水) 23:52:08.150591デフォルトの名無しさん
2014/01/23(木) 00:40:17.78そんなバカバカしい言葉にプライドを持っているのなんて、
せいぜい学科にいる教授と学生ぐらいだろう
0592デフォルトの名無しさん
2014/01/23(木) 02:02:48.58計算機科学とHaskellにつながりがないとか、それこそ酷い冗談だな。
なにか計算機科学というものを根本的に勘違いしてるだろ。
0593デフォルトの名無しさん
2014/01/23(木) 06:33:04.45Haskellに関する海外の論文に、こういう分類がされてたの。
もしかして日本だと違ったりするの?w
0594デフォルトの名無しさん
2014/01/23(木) 08:58:13.85すまん>>587へのレスじゃ無いんだ
計算機学科で特定のプログラミング言語を教えてるなんてアホなレスがあったからさ
0595デフォルトの名無しさん
2014/01/23(木) 10:27:52.88不特定の言語を教えてる学科があるなら教えてくれ。
計算機学科の学部レベルのプログラミング教育が、言語を指定せず、
任意の言語を使って教育できる、ということを示せたらチューリング賞も夢じゃないからな。
0596デフォルトの名無しさん
2014/01/23(木) 10:50:07.910597デフォルトの名無しさん
2014/01/23(木) 11:38:55.010598デフォルトの名無しさん
2014/01/23(木) 11:40:21.82って発言したおバカさん。いつまでバカを言い続けるのかねぇ。
0599デフォルトの名無しさん
2014/01/23(木) 11:55:20.330600デフォルトの名無しさん
2014/01/23(木) 12:01:11.000601デフォルトの名無しさん
2014/01/23(木) 12:02:11.490602デフォルトの名無しさん
2014/01/23(木) 12:11:24.230603デフォルトの名無しさん
2014/01/23(木) 12:50:31.76Haskellらしいってより2chらしい話題だと思うw
0604デフォルトの名無しさん
2014/01/23(木) 13:21:24.000605デフォルトの名無しさん
2014/01/23(木) 14:26:49.99まあ最初何を憎んでいたのか忘れちゃってるんじゃないの
0606デフォルトの名無しさん
2014/01/23(木) 19:51:24.62関数の型シグネチャのコンテキストの部分でチルダが使われているのはどういう意味?
こんな感じ f :: (C a ~ D) => ...
0607デフォルトの名無しさん
2014/01/23(木) 20:05:37.30これかな?
0608デフォルトの名無しさん
2014/01/23(木) 20:05:47.76equality constraintというGHC拡張で、(C a ~ D)なら(C a)とDが同じ型だという制約
http://www.haskell.org/ghc/docs/7.6.3/html/users_guide/equality-constraints.html
0609606
2014/01/23(木) 20:10:38.47>>607
すまん、それは違うな。
それは r という型変数を Int に解釈するようにプログラムされてるが、
そんな解釈はできんぞ、というエラーの方だね。
>>608
知りたかったのはこっちの方だ。
きっと拡張機能だろうなとは思ったが、名前が分からず途方に暮れてた。
リンク先調べてみるよ。
0611デフォルトの名無しさん
2014/01/23(木) 20:15:11.800612デフォルトの名無しさん
2014/01/24(金) 00:57:43.670613デフォルトの名無しさん
2014/01/24(金) 01:10:18.40http://www.amazon.co.jp/dp/4873116600/
なんか面白そう
0614デフォルトの名無しさん
2014/01/24(金) 04:22:34.270615デフォルトの名無しさん
2014/01/24(金) 07:57:39.640616デフォルトの名無しさん
2014/01/24(金) 08:48:37.910617デフォルトの名無しさん
2014/01/24(金) 09:07:57.720618デフォルトの名無しさん
2014/01/25(土) 19:21:44.82fgrep.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できますでしょうか
0619デフォルトの名無しさん
2014/01/25(土) 19:30:45.090620デフォルトの名無しさん
2014/01/25(土) 20:16:23.87map(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");
}
0621デフォルトの名無しさん
2014/01/25(土) 20:26:36.020622デフォルトの名無しさん
2014/01/25(土) 20:30:47.610623デフォルトの名無しさん
2014/01/25(土) 20:41:30.930624デフォルトの名無しさん
2014/01/25(土) 20:43:27.190625デフォルトの名無しさん
2014/01/25(土) 20:48:50.900626デフォルトの名無しさん
2014/01/25(土) 20:49:36.79(x - 0x30)は引数で、0x30引いてるのはアスキーコードの引き算
結果として、数値の1、2、3が得られる
0627デフォルトの名無しさん
2014/01/25(土) 20:51:39.400628デフォルトの名無しさん
2014/01/25(土) 21:00:51.51import 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です
0629デフォルトの名無しさん
2014/01/25(土) 21:02:09.470630デフォルトの名無しさん
2014/01/25(土) 21:02:56.190631デフォルトの名無しさん
2014/01/25(土) 21:05:00.830632デフォルトの名無しさん
2014/01/25(土) 21:05:18.350633デフォルトの名無しさん
2014/01/25(土) 21:06:24.30>>619 を無視か
というか、それなら import System でもエラーじゃないのか?
0634デフォルトの名無しさん
2014/01/25(土) 21:12:04.08ListをData.Listに書き換えたところ、今度はSystemのほうがエラーになりました
0635デフォルトの名無しさん
2014/01/25(土) 21:21:16.61じゃあ、System を System.Environment に変えろ
0636デフォルトの名無しさん
2014/01/25(土) 22:01:10.28Conduit のソース側で、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のモデルの意味ではない)は、
モデルビューアーキテクチャには向かないのかな?
0637636
2014/01/25(土) 22:04:29.69無視してくれ
0638636
2014/01/25(土) 22:16:12.56グダグダしててスマん
モデルビューアーキテクチャじゃなくて、
モデルビューコントロールアーキテクチャね
あるいはドキュメントビューアーキテクチャ
0639デフォルトの名無しさん
2014/01/25(土) 23:59:34.02>これだけなら綺麗に分けられそうだけど、
>ソース側とシンク側を繋げる関数を分ける関数の型が
>(PersistMonadBackend m ~ SqlBackend, PersistQuery m) => m IO
>となってしまう。
これの意味が分からん
「ソース側とシンク側を繋げる関数を分ける関数」って何?
0640636
2014/01/26(日) 09:26:01.57一晩開けて読みなおしてみたら、確かに意味不明だな、ごめん。
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 に限らず、
モナドを使っている限りついて回る問題ではないかと少し思えてきた・・・
0641デフォルトの名無しさん
2014/01/26(日) 11:13:00.620642636
2014/01/26(日) 11:41:40.10実はそれ考えてプログラムしてみたんだ。
確かにちゃんと分離できる。
が、データベースの制御について本やネットで調べてみると、
オープンとクローズは頻繁に行わない方が良いらしい。
今回のアプリはデータの表示、書き換えがユーザーの手によって頻繁に起こるから、
オープン/クローズは Main 関数内で一度ずつ行って、
その間で Conduit を使ってデータや、削除などの制御情報を流そうかと。
そうすれば、[Model] の表現方法が変わっても、
[Model] と、全体を取り持つ Main 関数の2つだけ変えればいいはず。
もし改善策が思いつかなければ、
(1) データベースを制御するごとにオープン/クローズするように諦めるか、
(2) Persist + Conduit の組み合わせを諦めるか、
(3) データベースを使うのを諦めるか
の3択になって、まぁ仕方ないかなと思ってる。
Persist + Conduit はもともと Yesod で開発されたものだけど、
Yesod のモデルではもしかしてオープン/クローズは繰り返すものなのかな。
0643デフォルトの名無しさん
2014/01/26(日) 12:00:35.71ならModelでPersist関連のラッパーモナドとrun関数を用意して、それを返すようにするとか
実装は必要に応じてModel内で差し替えればいい
0644デフォルトの名無しさん
2014/01/26(日) 12:25:07.08ControlがModelとViewを直接参照してるのがおかしいように見える
この二つを引数として取るようにできる?
0645636
2014/01/26(日) 13:14:58.54できるが、そもそもこの二つ(ソースとシンク)を引数として取る関数が ($$) だよ。
というか、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 側に持ってくることができるのなら大満足だ
ちょっと考えてみるよ
0646デフォルトの名無しさん
2014/01/26(日) 14:27:15.14>できるが、そもそもこの二つ(ソースとシンク)を引数として取る関数が ($$) だよ。
うん、このケースでは($$)そのものがコントローラに対応すると考えればいいと思う
単にデータを転送するより複雑なことがしたいなら、そういう関数を書けば良い
あるいはコントローラをConduitとして書けるならそれでもいい
いずれにしても、コントローラがPersistMonadBackend云々の制約を
知らなくても良いようにするには、コントローラが直接recordsSourceに言及しなくて
良いようにするのが一番手っ取り早い
0647636
2014/01/26(日) 14:44:13.86> いずれにしても、コントローラがPersistMonadBackend云々の制約を
> 知らなくても良いようにするには、コントローラが直接recordsSourceに言及しなくて
> 良いようにするのが一番手っ取り早い
その方法を質問してたつもり
なかなか上手く質問できず誤解させてしまったようだ、すまん
0648デフォルトの名無しさん
2014/01/26(日) 15:08:03.29>その方法を質問してたつもり
何が分からんのか分からん
> C ==> M ==> C ==> V
これをConduit式で素直にやるなら、最初のCがSource、
Mと二番目のCがConduit、VがSinkになる
もっと柔軟性が欲しければ、CがMとVを受け取ってm ()でも返すようにする
でmainでmを特定のデータベースバックエンドに実体化する
完全な(コンパイルできる)ソースを貼ってくれた方が伝わりやすいかも
0649デフォルトの名無しさん
2014/01/26(日) 16:33:41.14このあたりを勉強したいのだけれど、おすすめのリソースがあれば教えて下さい
0650636
2014/01/26(日) 17:13:39.030651636
2014/01/26(日) 17:18:53.86> これをConduit式で素直にやるなら、最初のCがSource、
> Mと二番目のCがConduit、VがSinkになる
それは分かるが、そのモナドの型が
(PersistMonadBackend m ~ SqlBackend, PersistQuery m)
というコンテキストでなければならなくなる。
>>640 の viewRecords 関数のように。
> でmainでmを特定のデータベースバックエンドに実体化する
>>645 でも言ったが、現状そうしてる。
で、これも >>645 で言ったが、
run を M 側に持ってくることができるのなら大満足だから、
それを考えている。
0652デフォルトの名無しさん
2014/01/26(日) 18:20:15.03>それは分かるが、そのモナドの型が
>(PersistMonadBackend m ~ SqlBackend, PersistQuery m)
>というコンテキストでなければならなくなる。
いや、そうやって分ければMVCが全部同じコンテキストを持ってる必要がなくなるだろ
Mでは(PersistMonadBackend m ~ SqlBackend, PersistQuery m)
Vでは(MonadIO m)
Cでは(Monad m)か(MonadIO m)
0653636
2014/01/26(日) 19:13:29.23> 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 に書くのが相応しいと思ってる。
(だからコンテキストの問題で困ってる)
もしかして、この考え方を改めようというアドバイス?
0654デフォルトの名無しさん
2014/01/26(日) 19:14:35.320655デフォルトの名無しさん
2014/01/26(日) 19:16:04.860657デフォルトの名無しさん
2014/01/26(日) 19:20:19.03>なぜなら、たとえば関数 viewRecords の定義は recordsSource $$ recordsSink だから。
そこにrecordsSourceを直接書く代わりにCへの引数として受けとるようにする
という話を>>644からずっとしてるつもり
0658デフォルトの名無しさん
2014/01/26(日) 19:20:48.91mainを想定してる
0659636
2014/01/26(日) 19:28:50.76飲み込みが悪くてすまんが、Cへの引数として受けとるというのが今ひとつ分からない。
もしかして、viewRecords 関数ではなく
f :: (MonadIO m) => Source m A -> m ()
f src = src $$ recordsSink
という関数を C に作れってこと?
で、viewRecords 関数の定義は f recordsSource にしろと?
もしそうなら、viewRecords 関数はどこに書く?
勘違いしてたらごめん
0660デフォルトの名無しさん
2014/01/26(日) 19:41:14.64たとえば、メインループを行う関数がCにあるなら、それを
loop :: (MonadIO m) -> Source m A -> Sink A m () -> m ()
loop source sink = input >>= \case ...
みたいに定義して、main内で、
runSqlite $ loop viewRecords recordsSink
みたいに呼ぶ
メインループがmain側にある場合も基本は同じで、mainが
viewRecordsを渡してやる
0661636
2014/01/26(日) 21:56:54.92あぁ、やっと言いたいことが分かったような気がする。
C の loop 関数では、具体的な viewRecords 関数などを内部で呼ぶ代わりに、
「データを流す役割のソース」や「データを変更する役割のシンク」や「データを表示する役割のシンク」
などといったソース群とシンク群を引数で受け取るようにして、それを使う。
で、main 関数内などの MVC を統括する部分で、実際に C の loop 関数に、
具体的なソースやシンクを渡すのか。
なるほど、とても参考になった。
0662636
2014/01/27(月) 19:04:10.08こっちも意味がわかった。
SQLへのアクセスに関わる部分(runSqlConn や runResourceT なども含めて)は
すべて M の中に閉じ込めることができてスッキリしたよ。
二人共ありがと
0663デフォルトの名無しさん
2014/01/27(月) 19:31:00.47こういうIDEがクラウドじゃなくて普通にインストールアプリとして欲しいのだが
0664デフォルトの名無しさん
2014/01/27(月) 23:06:17.38エディタの構文チェッカープラグインよりこっちの方が速いって一体w
このIDEもサーバ側も全部Haskell製(前者はFayでJSにしてあるけど)なんだなー、面白い
関係ないけど、Vim使いならSyntasticとghcmod-vim,neco-ghcあたりを入れればかなりIDEっぽく使えるのでお勧め
0665デフォルトの名無しさん
2014/01/30(木) 00:57:48.910666デフォルトの名無しさん
2014/01/30(木) 01:24:35.69誰に聞いたのそれ
0667デフォルトの名無しさん
2014/01/30(木) 01:31:03.56本当だよ
君も今すぐ使った方がいい
0668デフォルトの名無しさん
2014/01/30(木) 08:28:54.390669デフォルトの名無しさん
2014/01/30(木) 22:21:37.65本当だよ。
みんなもう使ってるよ。
早く使わないと取り残されるよ。
0670デフォルトの名無しさん
2014/01/30(木) 23:34:25.95というかモナドは時代遅れだよ
0671デフォルトの名無しさん
2014/01/31(金) 06:55:03.480672デフォルトの名無しさん
2014/01/31(金) 07:28:57.240673デフォルトの名無しさん
2014/01/31(金) 08:28:25.160674デフォルトの名無しさん
2014/01/31(金) 09:11:29.00もっと煽らないと……。
0675デフォルトの名無しさん
2014/01/31(金) 09:27:02.890676デフォルトの名無しさん
2014/01/31(金) 09:38:49.580677デフォルトの名無しさん
2014/01/31(金) 10:01:43.740678デフォルトの名無しさん
2014/01/31(金) 11:08:55.55なんで最初にそう聞かないの? いくらでも教えてあげたのに
おっとそろそろ出勤だ
0679デフォルトの名無しさん
2014/01/31(金) 14:22:14.08これは
uncurry (+) <<< (*100) &&& (*10) $ 2
こうすればいいですか><
app <<< (+) . (*100) &&& (*10) $ 2
0680デフォルトの名無しさん
2014/01/31(金) 19:11:40.60haskell-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 は黒魔術なので、はっきりいっておすすめできない (が、スピードのために必要になるかもしれないので老婆心で)
0681デフォルトの名無しさん
2014/01/31(金) 19:14:56.120682デフォルトの名無しさん
2014/01/31(金) 19:21:47.200683デフォルトの名無しさん
2014/01/31(金) 19:52:15.51例えばIOモナド版と純粋関数版の二つを作らなければならないはずのところを
arrowで抽象化しておけば一つだけ作ればすむ
だからIOで使うつもりだった関数を急に純粋に変えたくなった
みたいな状況で仕様変更に強くなるか、と聞かれたらyesなのでは
もうarrowのことあまり覚えてないので間違ってたらゴメンネ
0684デフォルトの名無しさん
2014/01/31(金) 20:15:10.550685デフォルトの名無しさん
2014/01/31(金) 20:44:32.50純粋にしたいところだけidentityモナド使えばいい気がしてきた
やっぱarrowいらんわ。arrowは糞。
0686デフォルトの名無しさん
2014/01/31(金) 22:15:36.300687デフォルトの名無しさん
2014/01/31(金) 22:19:11.970688デフォルトの名無しさん
2014/01/31(金) 23:29:19.00愚弄?kwsk
0689デフォルトの名無しさん
2014/01/31(金) 23:55:35.640690デフォルトの名無しさん
2014/02/01(土) 23:27:57.78テストコードの書き方が分からん。
(参考資料 : 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 を使ってたら、
けっこう悲惨なことにならない?
0691デフォルトの名無しさん
2014/02/02(日) 13:25:55.74時系列で変化するものは、一般的に考慮が必要。
単体テストなら
・関数的な結果を返すモックにする
・DBの中身が変わらないことを前提に、トランザクションで囲んで、rollbackさせる
(comitされる処理は対応出来ない、serialやoid消費される前提)
現在時間などの変数に注意。
結合やシナリオということであれば、
・DB初期化、シード投入、実行
・組み込みDBなら、スナップショット切り替え、実行
quickcheckに組み合わせるのは、基本モックなのではという気がする。
0692デフォルトの名無しさん
2014/02/02(日) 13:53:47.77あぁ、なるほど、こういう場合にモックを使うのか
ありがと、やってみるよ
0693デフォルトの名無しさん
2014/02/02(日) 14:56:44.18HSpec に test-framework をかぶせて使ったのだけど、
テスト結果を Jenkins で使える XML 形式で出力するにはどうすればいい?
0694693
2014/02/02(日) 15:44:56.64現状無理だったわ
スレ汚してすまんかった
0695693
2014/02/02(日) 16:10:21.20>>690 の状況をシンプルにすると、
モジュール A の中でデータベースを使っていて、
データを出したり書き込んだりする関数が公開されている。
このモジュール A が公開している関数をテストしたい。
もちろん、モジュール A は変更を一切加えること無く。
データベースの接続などはコストが高いのでテスト時はモックを使う、となると、
そもそもモジュール A はデータベースへ直接アクセスしていてはダメだということか?
例えば、データベースへのアクセスを抽象化した型クラスを作り、
そのインスタンス型の値を外部からもらって、それを使ってアクセスするようにしておかないと、
データベースのモック化はできない、という認識でいいのかな?
0696デフォルトの名無しさん
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 = ...
このようなことは可能でしょうか。
0697696
2014/02/02(日) 22:18:14.41すいません、関数 f を使う時に
コンテキスト制約に使ったクラス ClassA から型 X のものであること、
コンテキスト制約に使ったクラス ClassB から型 Y のものであることが推論できるように
ということです。
そのような推論ができなければ、クラス C の定義において
関数 f の引数か戻り値に c を入れておくことで対処しますが、
とにかく >>696 のような使い方ができるクラス変数なるものはあるか、という質問です。
0698デフォルトの名無しさん
2014/02/02(日) 22:18:19.82{-# LANGUAGE ConstraintKinds, TypeFamilies #-}
class C c where
type Constr c :: * -> GHC.Exts.Constraint
f :: (Constr c t) => Int -> t
0699698
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 のものであることが推論できるように
具体的にどういうコードでどういう推論が起こって欲しい?
0700696
2014/02/02(日) 23:19:48.44ありがとうございます。
そのやり方で、インスタンス毎にコンテキスト部分をかえることができました。
ついでに、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 だとみなされると嬉しいです。
0701デフォルトの名無しさん
2014/02/03(月) 06:07:38.67>次の方法でも似たようなことができる事が分かりました。
そのコードなら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が確定する訳じゃないので、情報が足りない
0702696
2014/02/03(月) 07:09:51.19あの後いろいろ試してみたのですが、自分で見つけた方法の方は、
今回の目的に関して言えば、どうも使い勝手が悪いです。
> これは無理だと思う。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が確定する訳じゃないので、情報が足りない
やはりそのようですね。
こちらの方は諦めます。
0703デフォルトの名無しさん
2014/02/08(土) 10:15:20.05f :: a という関数シグネチャがあって、この関数 f の定義として、
a が Int 型だった場合のみ特別な事をして、そうでない型の場合は一般的な事をする。
f :: Int
f = 特別な何か
f :: a
f = 一般的な何か
みたいな。
0704デフォルトの名無しさん
2014/02/08(土) 10:28:07.17「特別な何か」と「一般的な何か」が意味的に同じ(違うのは効率だけ)なら、
書き換え規則で後者を前者に書き換えるのがおすすめ
意味的に違うならOverlappingInstancesしかないけど、
いろいろ厄介なので、使わないで済むなら使わないのを勧める
0705デフォルトの名無しさん
2014/02/08(土) 10:32:45.93ありがとうございます。
調べてみます。
0706デフォルトの名無しさん
2014/02/08(土) 11:20:08.66予め ghc でコンパイルして *.hi ファイルを作っておくことで、
対となる *.hs ファイルをロードすれば ghci 上でも書き換え規則が適用されるんですが、
*.hi ファイルの無い *.hs ファイルのロードのみでも適用する方法って無いでしょうか。
ちょっとだけ不便です。
「そう言えば忘れてた」と思って *.hs の内容をちょっと変更して、
ghci 上で再ロードした時に、書き換え規則が適用されず「あれ?」となり、
*.hi ファイルを出していなかったことを思い出すまで時間がかかったり・・・
ghci 上でちょっとした修正と実行テストを繰り返す場合など、なかなか面倒だったりしますよね。
0707デフォルトの名無しさん
2014/02/08(土) 15:23:45.64書き換え規則は最適化の一種なのでghciでは使えないっぽいね
0708デフォルトの名無しさん
2014/02/09(日) 10:07:53.53やはりそうですか。
これは我慢するしか無いですね。
将来のバージョンでは書き換えなど
最適化してロードされるオプションも付けて欲しいです。
0709デフォルトの名無しさん
2014/02/09(日) 13:16:16.81要望はglasgow-haskell-usersへ
0710デフォルトの名無しさん
2014/02/09(日) 13:48:25.21英語が書けないから、要望を出すのは諦めました。
0711デフォルトの名無しさん
2014/02/09(日) 14:16:48.510712デフォルトの名無しさん
2014/02/09(日) 15:01:31.44今のところ全く問題ないです。
読むことはできるので。
0713デフォルトの名無しさん
2014/02/09(日) 15:17:42.320714デフォルトの名無しさん
2014/02/09(日) 15:28:59.34例外が発生しない状態だとテストに失敗しとたとみなす、という意味だけど。
0715デフォルトの名無しさん
2014/02/09(日) 15:42:38.26例外が投げられたら捕捉してTrueを返し、そうでなければFalseを返すようなアクションを書いて、
それを(@?)かなにかを使ってテストにすればいいと思う
0716デフォルトの名無しさん
2014/02/09(日) 15:57:11.06やっぱそういう事になるのか
例外をテストする関数か何かライブラリにあっても良さそうなもんだが・・・
ありがと
0717デフォルトの名無しさん
2014/02/09(日) 21:06:40.67testGroup "Test Group1"
[ testCase "Test1" test_something1
, testCase "Test2" test_something2
]
というテストグループがあったとして、
test_something1 のテストに成功した場合のみ
test_something2 のテストを行う、ということはできる?
試しに test_something2 のテストを testGroup で囲ってみたが、
何も変わらなかった(普通にテストされる)。
0718デフォルトの名無しさん
2014/02/09(日) 21:51:36.15やりたいことは、コンソールの一部領域だけスクロールするように見せたり、
プログレスバーを表示させたりするような CUI アプリを作ることです。
0719デフォルトの名無しさん
2014/02/09(日) 22:13:31.77個人的に使っているのは、この二つ。
CUIフレームワークなら: http://hackage.haskell.org/package/ncurses
自分で細かく制御したいなら: http://hackage.haskell.org/package/ansi-terminal
0720デフォルトの名無しさん
2014/02/09(日) 23:38:28.96じゃあかんの?
0721717
2014/02/10(月) 20:05:23.49俺へのレスだったか、すまん気づかんかったわ
あかんも何も、tasty というテストフレームワークの存在を初めて知ったから、まだ分からん
tasty-ant-xml 使って jenkins とも連携できそうだから、ちょっと試してみるよ
0722717
2014/02/10(月) 20:35:59.86使ってみたが分からんかった
tasty-rerun でどうやれば >>717 を実現できる?
--rerun-filter オプションで指定できる 4 つのオプションを組み合わせるってこと?
0723デフォルトの名無しさん
2014/02/10(月) 22:58:24.76調べてみたところ、出力なら ansi-terminal で十分であることが分かりました。
ただ入力側も扱いたいので ncurses を使おうとしましたが、
パッケージのインストール時に外部ライブラリとして ncursesw/ncurses.h が必要です。
私の使っている ArchLinux ではどうもこの ncursesw を使うのに一手間かかるようで、
その一手間がどういったものか情報が得られませんでした(ncurses.h 自体はある)。
正確に言えば、私が理解できる情報が得られなかったわけですが。
もう少し調べてたところ、vty というパッケージがあることが分かりました。
"vty is terminal GUI library in the niche of ncurses." とのことです。
これで行けそうな気がします。
アドバイスありがとうございました。
0724デフォルトの名無しさん
2014/02/12(水) 02:04:22.00でもHayooでは引っかかる。
みんなHayoo使ってるんですかね?
0725デフォルトの名無しさん
2014/02/12(水) 07:16:28.780726デフォルトの名無しさん
2014/02/12(水) 08:33:32.47Hayooメインで使ってる。
でも、サービスがよく止まってるから、結果的にHoogleも併用してる。
0727デフォルトの名無しさん
2014/02/12(水) 15:23:24.760728デフォルトの名無しさん
2014/02/12(水) 21:51:44.15documentation: True
にしてから
cabal install world --reinstall
すると、ドキュメントもローカルに落とせるんですね、、知らなかったです。
これをhoogleコマンドから引けたらもっといいんですけど、どうすればいいのかよくわからない…
0729デフォルトの名無しさん
2014/02/12(水) 22:37:44.600730デフォルトの名無しさん
2014/02/13(木) 12:02:34.01字幕をONにして見てね。
http://www.youtube.com/watch?v=ABsutPSLuqQ
0731デフォルトの名無しさん
2014/02/13(木) 23:18:36.850732デフォルトの名無しさん
2014/02/13(木) 23:43:40.46本家はjavaだっけ?処理速度的にどうなのか気になる
0733デフォルトの名無しさん
2014/02/14(金) 00:52:31.90ただ細かな部分での最適化はそれほどでもないみたい?
0734デフォルトの名無しさん
2014/02/14(金) 00:58:45.260735デフォルトの名無しさん
2014/02/14(金) 01:00:44.40コード見たい
0736デフォルトの名無しさん
2014/02/14(金) 01:11:56.29完成したら公開する予定って G+ で言ってる
0737デフォルトの名無しさん
2014/02/14(金) 08:25:47.90書きなぐった感じで作ってもそれぐらいだったよ。
偉い人が書くと余裕で半分以下になると思う。
処理速度は他言語で似たようなもの作ったことないから
比較できない・・・。
ただ、直感的にFortranと比べると若干遅い気がする。
表面に出るブロックだけピックアップして描画してるんだけど、
ピックアップするときに50万ブロックの走査したら数秒かかったw
>>733
今回のコードは8割以上IOモナドに浸食されてるんで・・・。
>>735-736
動画の最後でも言ってるんだけど、やはり大方の人に
最後まで見てもらえてなさそうだなw
0738デフォルトの名無しさん
2014/02/14(金) 12:28:32.57動画最後まで見たけど、早送り気味で見たから。
0739デフォルトの名無しさん
2014/02/14(金) 13:05:58.50そっか。
最後までみてくれてありがとう。
0740デフォルトの名無しさん
2014/02/14(金) 13:09:34.88それでも別に融合変換は出来るのでは?
0741デフォルトの名無しさん
2014/02/14(金) 13:56:47.97>>733の副作用に条件反射して答えちゃいました
そもそも融合について名前程度しかしらなかったので
「関数プログラミングの楽しみ」やRWHの該当箇所を
流し読みしてみた。
でも、アドレス変換して値を参照してるところを直値を
直接参照して計算するようにプログラムを変換してくれ
るのかな・・・程度にしかわからなかった orz
もしその理解で正しいなら、この技法を取り入れたら
かなり早くなりそう。
難しいことは避けてきたけど、そろそろ真面目にHaskell
を勉強します・・・ m(_ _)m
0742デフォルトの名無しさん
2014/02/14(金) 23:45:37.62直接参照云々はUNPACKのことかな。これも確かに高速化に繋がるけど、融合変換とか副作用とかとはあんまり関係ない
0743デフォルトの名無しさん
2014/02/15(土) 00:33:12.68説明の仕方が悪かったです。
中間のデータ構造を省いて必要な値を直接参照するように変換するような
もののような気がします。
例えば、以下のようなデータ構造があって、ある関数が特定の箇所を
走査する場合に以下のように変換するようなイメージだと理解しました。
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との違いはよく分かりません・・・。
0744デフォルトの名無しさん
2014/02/15(土) 00:43:05.59>>743では変換後もリストを使ってますが、そのリストが直値の配列
になってるような感じだと思いました。
上手く説明できずスミマセン。
コンパイラの最適化で自動的にやってくれることのような気もします・・・。
ただ、副作用の有無は最適化時に重要になってくるような気もします・・・。
0745デフォルトの名無しさん
2014/02/15(土) 01:02:57.590746デフォルトの名無しさん
2014/02/15(土) 08:14:19.73逆じゃね?
0747デフォルトの名無しさん
2014/02/15(土) 12:55:05.47結局のところ、どうなんでしょう・・・。
ただ、副作用があると難しそうですよね。
>>746
言わんとしてることは分かります。
たぶん、会話が噛みあってないだけだと思います。
0748デフォルトの名無しさん
2014/02/15(土) 13:12:05.42よっぽど暇な学科なんだろうなって思う
0749デフォルトの名無しさん
2014/02/15(土) 13:26:34.990750デフォルトの名無しさん
2014/02/15(土) 13:41:28.47「僕、今ハスケルで君の美を表現してるんだ」
これで芸大女ともやれるな
よぉぅしっ
0751デフォルトの名無しさん
2014/02/15(土) 13:49:04.850752デフォルトの名無しさん
2014/02/15(土) 13:58:18.440753デフォルトの名無しさん
2014/02/15(土) 14:00:19.630754デフォルトの名無しさん
2014/02/15(土) 15:01:07.79いまどきスマホのCASでもできちゃうから
0755デフォルトの名無しさん
2014/02/15(土) 15:07:39.860756デフォルトの名無しさん
2014/02/15(土) 16:13:38.94どっちも同じなのに
0757デフォルトの名無しさん
2014/02/15(土) 16:18:37.08そうすりゃ、予備校が潰れてメシウマ。
0758デフォルトの名無しさん
2014/02/15(土) 16:19:44.09日本の教育がオカシイと思う。
微積も大事だけど、もっと代数・幾何や統計に力を入れないと
実社会の問題を解く時に役に立たないと思う。
0759デフォルトの名無しさん
2014/02/15(土) 16:33:50.91もう算数教育やめるべき
無駄
0760デフォルトの名無しさん
2014/02/15(土) 16:37:53.56制御理論は不要
0761デフォルトの名無しさん
2014/02/15(土) 16:40:44.86確率微分方程式のような金になりそうなものに全力を出すべき
0762デフォルトの名無しさん
2014/02/15(土) 16:54:36.93http://blog.livedoor.jp/itsoku/archives/34270447.html
さすがNデーは頭のいい奴が多いな。
底辺じゃHaskellなんてクイックソート書くもの無理だろw
0763デフォルトの名無しさん
2014/02/15(土) 17:32:14.700764デフォルトの名無しさん
2014/02/15(土) 17:34:35.960765デフォルトの名無しさん
2014/02/15(土) 17:35:37.550766デフォルトの名無しさん
2014/02/15(土) 17:37:44.480767デフォルトの名無しさん
2014/02/15(土) 17:39:17.050768デフォルトの名無しさん
2014/02/15(土) 17:57:49.28Lispっぽくてかっこいいなw
0769デフォルトの名無しさん
2014/02/15(土) 18:00:07.690770デフォルトの名無しさん
2014/02/15(土) 18:03:24.33プログラミングは中国人の仕事だよ
0771デフォルトの名無しさん
2014/02/15(土) 18:06:54.09つまり、PHPとHaskellを極めておけば安心
0772デフォルトの名無しさん
2014/02/15(土) 18:29:15.97むだではない
天才ならいざ知らず、非天才には意味がある
ま、機械的に形式操作として解いていたなら
むだ!
だけどな
0773デフォルトの名無しさん
2014/02/15(土) 18:37:21.92Webでつかわねーだろカス
0774デフォルトの名無しさん
2014/02/15(土) 18:40:51.960775デフォルトの名無しさん
2014/02/15(土) 18:42:04.07下手なメーカーへ行くぐらいならWebの方がマシ
0776デフォルトの名無しさん
2014/02/15(土) 18:46:47.20例えば
(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
どうにかしてこれのコンパイルを通す方法はないでしょうか?
のような
0777デフォルトの名無しさん
2014/02/15(土) 18:48:50.460778デフォルトの名無しさん
2014/02/15(土) 18:55:25.47左辺の型が違うと思う
projectionW :: Either Int Int -> ProjFunc n
0779デフォルトの名無しさん
2014/02/15(土) 18:55:49.700780デフォルトの名無しさん
2014/02/15(土) 19:07:00.61>金融関係の数学まで到達するかしないかが損益分岐点
本当に純粋数学的な能力が生かせる仕事って金融とか保険のアクチュアリー以外に
なんかあるの?
あとJavaとかしか使わないプログラマでも、Haskell勉強するとレベルアップするとか言われる
けどさ、実際どういう能力が上がるのよ?
発想とか頭の回転ならパズルでも解いた方が効率いいんじゃね?
0781デフォルトの名無しさん
2014/02/15(土) 19:16:52.210782デフォルトの名無しさん
2014/02/15(土) 19:27:05.63パズルを解くのにJavaを使いたいと思う変態がいるのか?
0783デフォルトの名無しさん
2014/02/15(土) 19:29:06.99[1,2] ++ [3,4]
これと同じことをJavaで書くのは超面倒
0784デフォルトの名無しさん
2014/02/15(土) 19:32:16.200785デフォルトの名無しさん
2014/02/15(土) 19:33:34.370786デフォルトの名無しさん
2014/02/15(土) 19:36:12.34ttps://ideone.com/Ki2fYH
元のコードだと、たとえばInt -> IntとFunc nが等しいという情報から
n=S Zを推論できない(全く無関係なnでもInt -> Int ~ Func nになるかもしれない)
0787デフォルトの名無しさん
2014/02/15(土) 19:40:11.740788デフォルトの名無しさん
2014/02/15(土) 19:58:57.95IBMがマシンの設計にAPLを使ったようなもんか。
0789デフォルトの名無しさん
2014/02/15(土) 19:59:04.06それ、Haskell並の型推論できんの?
0790デフォルトの名無しさん
2014/02/15(土) 20:01:11.74修士程度まで数学を真面目にやってないと「使える」ようにはならない.
ピアノやバイオリンみたいなもんだよ.この手の古典楽器は十年以上
やらないと人前で見せられるレベルにならない.
0791デフォルトの名無しさん
2014/02/15(土) 20:16:27.99Haskell並みの型推論は必要なのか?
無くても特に問題ないだろ?
0792デフォルトの名無しさん
2014/02/15(土) 20:20:52.630793デフォルトの名無しさん
2014/02/15(土) 20:35:14.350794デフォルトの名無しさん
2014/02/15(土) 20:38:55.78オフラインレンダリングだとほぼ使わない
0795デフォルトの名無しさん
2014/02/15(土) 21:20:37.78純粋数学の力と、複数の言語を使う力は正反対だから、人により全く逆方向に成長する
0796デフォルトの名無しさん
2014/02/15(土) 21:56:00.02んなことはない。高校数学フル動員だぜ。
一例としてパラメトリックベジェ曲線の分割や交点を求めるときに
3次関数の解の公式が使えないのでニュートン法を使うわけだが
初期値によっては振動してしまうので、初期値を決めるために微分で極値を求めるとか。
0797デフォルトの名無しさん
2014/02/15(土) 22:04:02.55それを求めるのは偏差値55くらいの高校数学の問題だと思う。
0798デフォルトの名無しさん
2014/02/15(土) 22:48:28.60y=A*t^3+B*t^2+C*t+D
で表されるパラメトリックベジェ曲線がねじれてできる交点を求めよ
(難易度:難 範囲:高校数学)
多分おまえらの知能じゃ解けない。
0799デフォルトの名無しさん
2014/02/15(土) 22:55:36.53それが解けるプログラムを書いてくれ
0800デフォルトの名無しさん
2014/02/15(土) 22:57:46.490801デフォルトの名無しさん
2014/02/15(土) 23:09:51.93素直に感心するわ
悔しいが俺には解けん
0802デフォルトの名無しさん
2014/02/15(土) 23:10:45.820803デフォルトの名無しさん
2014/02/15(土) 23:18:27.19気になって他のことに手が付けられなくなってしまったではないか
>>798 を解きたいからヒントをくれ
交点は、あるとしたら一箇所しかできんなよな
そのシンプルでエレガントな式には、
a b c d A B C D の判別式が含まれてたりするのか
0804デフォルトの名無しさん
2014/02/15(土) 23:25:17.260805デフォルトの名無しさん
2014/02/15(土) 23:30:47.65交点が1つというのはセンスがいいな。
これに加えてヒントを二言うと解けちゃう。
ヒント
変数の置換を3回やれば解ける。まずtをuとおき辺々差をとる
0806803
2014/02/15(土) 23:39:27.90ちょっと待って
変数の置換を3回とか、tをuとおき辺々差をとるとかは、
究極にシンプルにエレガントにした最終結果だよな
そうじゃなくて、なんで3回の置換をする必要があるのか
なぜ辺々差をとるのかをちゃんと理解しないと、解けたとは言わん
>>805 がそのシンプルな式に至った思考の経緯から(たぶん紆余曲折を経たのだろう)、
何かヒントを出してほしいのだが
何か書籍かテキストかを見て学んだのなら、それを紹介してくれてもいい
(というか、そっちの方が有難いが)
0807デフォルトの名無しさん
2014/02/15(土) 23:45:14.22解く方法ではなく解く方法の方法というメタ論理を教えることは無理。
0808デフォルトの名無しさん
2014/02/15(土) 23:47:46.05居るよね、クイズの答え知ってるだけでドヤ顔するやつ
0809803
2014/02/15(土) 23:54:12.21すまん、大学には行ったことがない
つまり受験数学で腕を研いた経験がないのだが
これを自力で解くには受験数学をこなすところからやる必要があるのか・・・
0810デフォルトの名無しさん
2014/02/15(土) 23:54:58.34つまり辺々差をとるとはそういう方法のうちの一つ。
直観できないやつはもはやセンスがない。
なお「自分のセンスがない」のと「数学は不要」とがイコールになってしまったやつはカス
0811デフォルトの名無しさん
2014/02/16(日) 00:00:21.55最後に交点が1つだけであることを保証する照明要求されると自分だと詰む。
0812803
2014/02/16(日) 00:05:23.89なんかものすごいヒントを与えられたような気がするが、
その意味が分からないのが悔しすぎる
これを当たり前に解く受験生の力ってすげーな
今は解けそうもないから、ここで訊くのはもう諦めるよ
そろそろいい加減スレチだしな
その代わり、その「対称形」と「辺々差をとる」の繋がりが学べる数学の分野を教えてくれ
入門書からじっくり読んでものにしたい
0813デフォルトの名無しさん
2014/02/16(日) 00:08:45.280814803
2014/02/16(日) 00:11:51.11じゃあもっとフランクに聞こうか
答えはもういいよ
それだけ知ったところで何の意味もないしね
それより、「対称形」と「辺々差をとる」の繋がりが学べる数学の分野を教えてくれ
誰でもいいよ
0815デフォルトの名無しさん
2014/02/16(日) 00:14:32.220816デフォルトの名無しさん
2014/02/16(日) 00:19:20.610817デフォルトの名無しさん
2014/02/16(日) 00:20:29.16仕事で使わない数学学んでも時間の無駄
どうしてもやるなら競技プログラミングでもやっとけ
0818デフォルトの名無しさん
2014/02/16(日) 00:22:18.520819803
2014/02/16(日) 00:23:04.22それ言うなら、仕事で使わんHaskell学んでも時間の無駄になんだが?
俺は完全に趣味だよ、知りたいというだけ
仕事はプログラムとは何の関係もないし
0820デフォルトの名無しさん
2014/02/16(日) 00:26:59.10おまえがインテリぶってるだけのアホに思える
つっこまれると屁理屈ばかり
0821デフォルトの名無しさん
2014/02/16(日) 00:30:17.08でも完全に趣味だと味気無くてモチベ維持がきついかもしれん
0822デフォルトの名無しさん
2014/02/16(日) 00:47:27.59ある問題が解けることと受験合格には、解けた問題が得点に変換されるという意味しかない
数学には壮大が目的があるが、それと目の前の問題を結び付けるにはあまりに迂遠過ぎる
0823デフォルトの名無しさん
2014/02/16(日) 00:51:06.540824デフォルトの名無しさん
2014/02/16(日) 01:00:57.20数学の前に国語勉強した方がいいよ
0825デフォルトの名無しさん
2014/02/16(日) 02:51:39.180826デフォルトの名無しさん
2014/02/16(日) 02:52:10.220827デフォルトの名無しさん
2014/02/16(日) 09:20:11.08東大二次試験以外の受験数学なんて「解法のパターン」対応でしかない。
ああいのは数学とは言わない。
数学ができるというのは数学的な空間を作り出せることであって、受験数学問題を解く、つまり、所詮演繹的帰結を得るのが数学じゃないんだよ
0828デフォルトの名無しさん
2014/02/16(日) 09:30:13.730829デフォルトの名無しさん
2014/02/16(日) 09:33:50.670830デフォルトの名無しさん
2014/02/16(日) 10:02:42.130831デフォルトの名無しさん
2014/02/16(日) 10:06:20.150832デフォルトの名無しさん
2014/02/16(日) 10:27:17.88ふたすじじゃねーか
0833デフォルトの名無しさん
2014/02/16(日) 10:31:15.170834デフォルトの名無しさん
2014/02/16(日) 10:39:07.290835デフォルトの名無しさん
2014/02/16(日) 10:51:02.560836デフォルトの名無しさん
2014/02/16(日) 11:01:59.180837デフォルトの名無しさん
2014/02/16(日) 11:03:46.08またはオープンソースしか信じなくなる
0838デフォルトの名無しさん
2014/02/16(日) 11:32:19.300839デフォルトの名無しさん
2014/02/16(日) 11:44:57.29おう、いつでもこい
0840デフォルトの名無しさん
2014/02/16(日) 11:56:51.480841デフォルトの名無しさん
2014/02/16(日) 12:25:44.41懐かしいぜ
0842デフォルトの名無しさん
2014/02/16(日) 12:47:27.130843デフォルトの名無しさん
2014/02/16(日) 14:46:42.76計算の中で、次のように同じ代数データ型の [分解] と [構築] の組が続けて起こる場合に、
[引数投入] ---> [分解 1] ---> [構築 1] ---> [分解 2] ---> [構築 2] ---> [結果取得]
これを次のように中間の無駄な [構築] ---> [分解] を排除する
[引数投入] ---> [分解 1] ---> [構築 2] ---> [結果取得]
これが Fusion だという認識で合ってる? (その方法は手計算とかコンパイラ最適化とか色々あるが)
それとも、Fusion は Fusion でも、Stream Fusion の事?
0844デフォルトの名無しさん
2014/02/16(日) 15:09:26.07Stream fusionはそういう形だけど、一般にはもうちょっと広いと思う
[構築1] --(中間データ)--> [分解1]
を、
[構築1+分解1]
のように、中間データを生成しないコードに変形する
0845デフォルトの名無しさん
2014/02/16(日) 15:18:47.341番目と3番目を入れ換えた関数を得たい場合はどうすんの?
0846デフォルトの名無しさん
2014/02/16(日) 15:45:57.73flip $ (flip .) . flip $ (flip.) . flip $ (flip .) . flip
0847デフォルトの名無しさん
2014/02/16(日) 16:01:37.030848デフォルトの名無しさん
2014/02/16(日) 16:23:13.650849デフォルトの名無しさん
2014/02/16(日) 16:57:54.120850デフォルトの名無しさん
2014/02/16(日) 17:22:33.34真に受けちゃって、やっぱり今は関数型言語だよね、Haskellって奴がなんかすごいらしい、
とオーム社の買って、カリー化あたりで良い加減面倒になって、新しい発想が身に付いた、
とか勘違いしてるけど、結局やってる仕事や書いてるコードに何も変化はありませんでした、
となってしまうのかな?
0851デフォルトの名無しさん
2014/02/16(日) 17:27:50.190852デフォルトの名無しさん
2014/02/16(日) 18:15:39.39再帰的思考や高階関数の概念は比較的わかりやすい上に効果は大きい
0853デフォルトの名無しさん
2014/02/16(日) 18:42:17.43モナド則みたいな性質とそういった性質を満たしていることの証明って、スキルとして応用範囲広いと思う
デザインパターンとか原則を見つけたり策定する力が養えそう
まだまだ分からないところ多いけど、プログラミングをメタな視点で考察しやすくなるんじゃないかって思うよ
0854デフォルトの名無しさん
2014/02/16(日) 18:47:59.73にんげんだもの(誤用)
0855デフォルトの名無しさん
2014/02/16(日) 18:55:18.89よほどすごいプログラマか
よほど理解力がないプログラマか
どっちなのか
0856デフォルトの名無しさん
2014/02/16(日) 19:03:47.86書き込んだ奴がいたからな。すごく理解力がないプログラマは実在すると思う。
0857デフォルトの名無しさん
2014/02/16(日) 19:07:12.040858デフォルトの名無しさん
2014/02/16(日) 19:08:08.75書き方を知っているだけで、型推論を知らなかったんだろうなぁ
理解力というか、バックグラウンドの知識が乏しいんだろうね
知識が無い人がトンチンカンなことを言うのは、いつの時代もどこでも同じだな
頭を下げて教えてください、と言えないやつは裸の王様になっていくのさ
0859デフォルトの名無しさん
2014/02/16(日) 19:16:28.310860デフォルトの名無しさん
2014/02/16(日) 19:55:27.91コードが変化するとしたら、classが減ってlambdaが増えるとか
キャストを使わなくなってテンプレートメタプログラミングを使うとか
0861デフォルトの名無しさん
2014/02/16(日) 19:55:40.280862デフォルトの名無しさん
2014/02/16(日) 20:07:31.40統計は流石にウマでもシカでも出来るようになってしまった
0863デフォルトの名無しさん
2014/02/16(日) 20:13:06.47俺は趣味で金融工学を学んで夜の麻布で帝王になると定められている。
シュプリンガーの本を読み続けるには、そのぐらいの信仰心が必要。
0864デフォルトの名無しさん
2014/02/16(日) 20:19:43.87こういう理由で物事を学ぶと、結局のところ何も成し遂げることはできない。
ピンクドンペリを注いだり、シャンペンタワーを立てたりなど夢のまた夢
0865デフォルトの名無しさん
2014/02/16(日) 21:36:03.970866デフォルトの名無しさん
2014/02/16(日) 21:39:57.98大学生の春休みって今頃だっけか
0867843
2014/02/16(日) 21:44:31.82こういうこと?
f :: データA -> データB
g :: データB -> データC
という関数に対する g (f データA) という計算で、
途中の「f によってデータBを作る部分」と「g によってデータBを消費する部分」を取り除き、
データAを消費して直接データCを作る。
これが Fusion で、これをストリームに対して行うのが Stream Fusion?
0868デフォルトの名無しさん
2014/02/16(日) 21:50:47.43同意w なーんか最近妙だよ。しばし静観だな。
>金融工学
ここ笑うところですか?
0870デフォルトの名無しさん
2014/02/16(日) 22:51:26.30ちょうど卒論の提出が終わったあたり
0871デフォルトの名無しさん
2014/02/17(月) 00:45:35.06少なくとも二年ほど前からはずっとこんなスレだぞ
0872デフォルトの名無しさん
2014/02/17(月) 07:25:08.960873デフォルトの名無しさん
2014/02/18(火) 00:07:12.860874デフォルトの名無しさん
2014/02/18(火) 02:52:29.130875デフォルトの名無しさん
2014/02/18(火) 06:10:18.66そんな感じ
細かいことを言うと、Stream Fusionが取り除いてる中間データは
Streamじゃなくてvectorやリストだと思う
0876デフォルトの名無しさん
2014/02/19(水) 21:39:45.84たとえば
"= abcアイウ" =~ "^=.*" :: (Int, Int)
ってやったら(0, 5)になる
"= abcあいう"だとちゃんと(0, 8)になるのに
全部UTF-8だから大丈夫かと思ったんだけどなあ
0877デフォルトの名無しさん
2014/02/21(金) 07:50:03.440878デフォルトの名無しさん
2014/02/21(金) 12:44:53.95Sublimeいいけど、flymakeがないのが辛いんだよなぁ。
みんなはエディタなに使ってるのん?
vi
FP Complete Haskell
Yi
(聞くところによると、ghci内で全部完結してる人もいるらしい…)
0879デフォルトの名無しさん
2014/02/21(金) 14:00:35.11でもやっぱりEmacs
お前は vi/vim 野郎に殺されるかもしれないことを覚悟しておくがいい
0881デフォルトの名無しさん
2014/02/21(金) 19:11:21.530882デフォルトの名無しさん
2014/02/21(金) 19:49:39.10格好いい画面だのう
0883デフォルトの名無しさん
2014/02/21(金) 20:01:07.75べつにviやyi、Leksahなど他のエディタに比べてどうだとかいう問題じゃない
単に昔からEmacsに慣れ親しんでいるから
0884デフォルトの名無しさん
2014/02/21(金) 21:32:51.010885デフォルトの名無しさん
2014/02/21(金) 22:04:07.51javaみたいな言語ならideやないとあれやけど
haskellなら別にエディタでええかな
0886デフォルトの名無しさん
2014/02/21(金) 22:15:33.77その流れで行くとHaskellは超IDE向きなはずなんだが
leksahとか昔触った感じだと完成度がイマイチ
0887デフォルトの名無しさん
2014/02/21(金) 22:34:51.27スペースリークの発見を支援してくれたり
弱頭部正規化の様子をビジュアライズしてくれたり
0888デフォルトの名無しさん
2014/02/21(金) 23:36:18.660889デフォルトの名無しさん
2014/02/22(土) 00:27:01.330890デフォルトの名無しさん
2014/02/22(土) 00:30:29.73emacs,vimでは実現が不可能な機能だけ作ろうと思う
0891デフォルトの名無しさん
2014/02/22(土) 00:31:01.020892デフォルトの名無しさん
2014/02/22(土) 01:21:33.920893デフォルトの名無しさん
2014/02/22(土) 01:46:30.05Emacsのhaskell-modeはインデントが超超超強力
カーソルのある行を評価したり、ghciとの連携も快適
ところで、vimのインデントをマシにしてくれるプラグインない??
0894デフォルトの名無しさん
2014/02/22(土) 02:53:52.68あと次世代IDEを作るぞ!って
lamdu
っていうのがある
0895デフォルトの名無しさん
2014/02/22(土) 09:10:08.70あのインデント、時々ウザい
どうやってコンフィグするんだっけ?
0896デフォルトの名無しさん
2014/02/22(土) 11:44:16.923D表示にでもするのか?
0897デフォルトの名無しさん
2014/02/22(土) 12:16:28.20MSみたいな奴だな
0898デフォルトの名無しさん
2014/02/22(土) 12:17:54.740899デフォルトの名無しさん
2014/02/22(土) 13:14:00.530900デフォルトの名無しさん
2014/02/22(土) 13:21:36.270901デフォルトの名無しさん
2014/02/22(土) 13:33:55.310902デフォルトの名無しさん
2014/02/22(土) 13:57:47.17IDEが必要な規模のアプリをHaskellで作ったことがないことに気づいた
というわけで、IDEが喉から手が出るほど欲しくなるようなアプリを作ってみたいが、
何がいいだろう?
0903デフォルトの名無しさん
2014/02/22(土) 14:06:05.44スーパーIDE
0904デフォルトの名無しさん
2014/02/22(土) 14:09:23.68今まで簡単なテキストエディタ作ったことあるが、
コードに色を付けてくれるエディタライブラリをペタと貼るだけで、
ほとんど希みの機能が実現されてしまったからなぁ
IDEってあれの延長だろう?
果たしてIDEが欲しくなるようなアプリだろうかと・・・
0905デフォルトの名無しさん
2014/02/22(土) 14:37:53.32本人がやらないとバックアップとるくらいしかしてくれないのがemacs
私?
私はもちろん、メモ帳+コマンドプロンプトです
部下に勧めるのももちろんメモ帳+コマンドプロンプト
なぜなら彼らもまた特別な存在だからです
0906デフォルトの名無しさん
2014/02/22(土) 14:40:51.75そのうちやれたらいいな
今はLispで忙しい
0907デフォルトの名無しさん
2014/02/22(土) 15:36:26.620908デフォルトの名無しさん
2014/02/22(土) 15:39:42.640909デフォルトの名無しさん
2014/02/22(土) 15:52:15.660910デフォルトの名無しさん
2014/02/22(土) 16:02:22.23今もう、エディタ用のコンポーネントって出来上がってるんだっけ?
それをツギハギしたところで、プログラマとして優れているとは思わないけど
0911デフォルトの名無しさん
2014/02/22(土) 16:32:17.32> 今もう、エディタ用のコンポーネントって出来上がってるんだっけ?
たとえば GtkScintilla とか
> それをツギハギしたところで、プログラマとして優れているとは思わないけど
無様でも目的のアプリが完成することが一番大事
最後までやりきって完成させることができない人は、
Haskellに精通していようが、知識経験豊富だろうが、カスでしかない
と自分に言い聞かせて、今日も家計簿アプリをちまちまと作ってます
0912デフォルトの名無しさん
2014/02/22(土) 16:50:06.430913デフォルトの名無しさん
2014/02/22(土) 16:54:16.97なら難しいテキストエディタ作ればいいだけのこと
行を表示するところから始めるんだ
0914デフォルトの名無しさん
2014/02/22(土) 18:20:59.01viやnanoみたいに、行レベルのバッファから作る必要あるんだっけ?
そういった部分を作らないでコンポーネントとして利用するのが、どのあたりが難しいの?
0915デフォルトの名無しさん
2014/02/22(土) 18:21:43.52APIからコンポーネント作るヤツの方が優秀
0916デフォルトの名無しさん
2014/02/22(土) 18:24:06.58動的言語や、cやc++では、アプリケーションが完成する気がしない
0917デフォルトの名無しさん
2014/02/22(土) 18:31:47.95既に出来合いの劣化版家計簿つくるのに時間を使って何が楽しいんだろう
0918デフォルトの名無しさん
2014/02/22(土) 18:32:22.07・自分のレベルと比較して目標が高すぎる
・小さなアプリを作る前からくだらないと思ってる
どちらも自惚れからくるが、この2つが同時に満たされると「どんな言語でも」アプリは完成しない
逆にこの2つを同時に乗り越えられれば「どんな言語でも」アプリは完成させられる
0919デフォルトの名無しさん
2014/02/22(土) 18:36:03.77小さなことからコツコツとアプリ作りの技術を磨いていくのです
劣化版家計簿でも、完成するとかなり嬉しいものですよ
(既に出来合いのものでは嬉しくないです、あくまで自分で設計して自分で作る)
完成したら、少し改良してみようと、次のステップへの意欲が湧く
0920デフォルトの名無しさん
2014/02/22(土) 18:38:26.69簡単に作れるものって、メモ帳かGUIのボタンを並べただけのものぐらい
0921デフォルトの名無しさん
2014/02/22(土) 18:39:32.71最終的にお前らはプログラマとして駄目だという話へ持っていきたがっている
0922デフォルトの名無しさん
2014/02/22(土) 18:40:47.68そもそも、設計が必要な時点でプログラミングから離れるだろ。
0923デフォルトの名無しさん
2014/02/22(土) 18:44:20.58アホだから、「小さなものからコツコツ」です
たしかに、小さなものばかりを作り続けても意味無いですけどね
ひと通り感慨にふけった後、ソースや実行ファイルを含め完成したものを省みると、
不満に思うとところが必ず出てくるので、それを次に活かすのです
そのうち、自分の中で簡単だと思うレベルが上がることを期待して
0924デフォルトの名無しさん
2014/02/22(土) 18:52:10.950925デフォルトの名無しさん
2014/02/22(土) 18:54:57.13コンポーネント使って家計簿を作るのでは、
山を歩いて登るかケーブルカーで登るかぐらい別次元の問題。
0926デフォルトの名無しさん
2014/02/22(土) 19:11:08.280927デフォルトの名無しさん
2014/02/22(土) 19:15:10.86すでにあるもの作ってなにになるんだよ?
みたいなこと言う人でまともなもの作ってる人を見たことがない
0928デフォルトの名無しさん
2014/02/22(土) 19:34:53.15これ思い出した
0929デフォルトの名無しさん
2014/02/22(土) 20:00:04.14その初心者が、明らかに口だけにしか見えないんだけど
>>928
そういう世界じゃないから。
0930デフォルトの名無しさん
2014/02/22(土) 20:06:49.640931デフォルトの名無しさん
2014/02/22(土) 20:10:32.330932デフォルトの名無しさん
2014/02/22(土) 21:09:53.570933デフォルトの名無しさん
2014/02/22(土) 21:50:13.79>>929←はNGにしたい
0934デフォルトの名無しさん
2014/02/22(土) 21:50:58.530935デフォルトの名無しさん
2014/02/22(土) 21:52:47.78本家のサイトを見たら、Haskellでアプリを作っている人なんて沢山いることが分かる
それも帳票みたいなウドでもヘチマでも作れるようなものじゃない
0936デフォルトの名無しさん
2014/02/22(土) 22:16:45.53全くヒットしなかったけど(正確には初めヒットしてすぐ衰退した)、考え方が論理的で、
あぁHaskell(関数型)のアプリってこういうものを言うんだと思いました
0937デフォルトの名無しさん
2014/02/22(土) 22:51:51.020938デフォルトの名無しさん
2014/02/22(土) 23:07:14.160939デフォルトの名無しさん
2014/02/22(土) 23:40:51.970940デフォルトの名無しさん
2014/02/22(土) 23:46:45.88やんなきゃできるようになるわけないもの
0941デフォルトの名無しさん
2014/02/22(土) 23:49:36.550942デフォルトの名無しさん
2014/02/23(日) 00:08:20.660943デフォルトの名無しさん
2014/02/23(日) 00:17:15.810944デフォルトの名無しさん
2014/02/23(日) 00:39:27.990945デフォルトの名無しさん
2014/02/23(日) 02:30:25.640946デフォルトの名無しさん
2014/02/23(日) 06:38:51.770947デフォルトの名無しさん
2014/02/23(日) 08:43:33.49安定した電力供給がどれだけ重要なのかというのは、もはや停電すらまれにしか起こらない日本の都市部に住んでいては
0948デフォルトの名無しさん
2014/02/23(日) 08:45:01.74事故さえ起こさなかったらそれは正論だね
0950デフォルトの名無しさん
2014/02/23(日) 10:21:43.54どこからのスレッドだ。
0951デフォルトの名無しさん
2014/02/23(日) 10:37:06.510952デフォルトの名無しさん
2014/02/23(日) 11:37:56.80原発が狙われるんじゃないでしょうか。
逆に日本は原発を狙うことなく負けることができるでしょうか。
0953デフォルトの名無しさん
2014/02/23(日) 11:40:26.720954デフォルトの名無しさん
2014/02/23(日) 11:41:36.42何かを実現したい時、大抵はアプローチ候補が複数有る。
Haskellは、複数のアイディア実装間の比較が楽なので、端から見てると入れ替わりが激しいように見えてしまう。
0955デフォルトの名無しさん
2014/02/23(日) 11:44:48.580956デフォルトの名無しさん
2014/02/23(日) 12:03:17.57> 複数のアイディア実装間の比較が楽なので
何を基準にどう比較する場合の話?
処理速度やメモリの使われ方を基準にするなら、C言語などの方が測りやすいと思うから、
たぶんもっと別の基準だと思うが・・・
0957デフォルトの名無しさん
2014/02/23(日) 13:12:25.550958デフォルトの名無しさん
2014/02/23(日) 14:14:30.22cは不動の地位。HaskellはPython、Rubyの座を奪う。
というより、PythonやRubyで何かを書きたくない。
0959デフォルトの名無しさん
2014/02/23(日) 14:24:45.75何を基準にどう比較するかを説明して欲しいんだけど
> ythonやRubyで何かを書きたくない
単なる個人的な感情は今はどうでもいい
0960デフォルトの名無しさん
2014/02/23(日) 15:34:55.75これは生成器を自作しないとできない?
それとも、Test.QuickCheck モジュール内の関数を組み合わせて作れる?
0961960
2014/02/23(日) 15:38:46.97念の為、生成器のデータ型を [Data.Word.Word32] にするという話ではなくて
生成器のデータ型は [Integer] です
0962デフォルトの名無しさん
2014/02/23(日) 16:27:52.13[NonNegative Integer]型の生成器を使えば良い
0964960
2014/02/23(日) 17:56:31.74arbitrary 関数の定義がこんなことになってるんだが
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以上の値を生成しているのでは?
0965デフォルトの名無しさん
2014/02/23(日) 20:02:09.910966デフォルトの名無しさん
2014/02/23(日) 20:23:15.35だったら燃やせよ
ロンドン条約締結後に堂々と放射性物質をみんなの海にばらまいた日本国に、何か、燃やしちゃいけない理由でもあるの?
0967デフォルトの名無しさん
2014/02/23(日) 20:26:57.82;:;:; ,、-ー-、 ど
;:;: ,r'"´ ̄`ヾ、 明 う
;:;:. リ ,,, ニ ,,,_ ヾト、 る だ
:;:;:;. ,ハ ^7 ,^ !.:.\ く
;:;:;: /.:.:.V,r''''''ゞyイ.:.:.:.:..ヽ な
;:;:. ノ.:!:.:.:.:`ゞ-<7.:〉.:.:.:i.:.:} ろ っ
从 __ _,,,/.:.:/:.:.:.:.:.:| }-{/i.:/.:.:.:.:|.:/ う た
从从百円}と_」.:/!.:.:.:.:.:.:.!  ̄ リ.:.:.:.:.:り ?
 ̄ ̄  ̄ |.:.:.:.:.:./_ :__ヽ.:.:.:.:\
\/.:.::..:.:.:.:.:.:..:\:.::./
/.:.:.:.:.:.:.「^Y.:.:.:.:.:.:|´
{.:.:.:.:.:.:.:.| ,!.:.:.:.:.:.:|
\.:.:.:.:.:.V.:.:.:.:.:.:.:|
\.:.:.::|.:.:.:.:.:.:.:!
> 'ゝ─‐イ、
`ー' ``''ー‐'
0968デフォルトの名無しさん
2014/02/23(日) 22:03:29.07確かに謎だな
前者は0が明らかなコーナーケースだからかも
後者はabsが0未満を返すような変なNumインスタンスへの対応?
0969968
2014/02/23(日) 22:05:43.08Prelude> abs (-9223372036854775808::Int)
-9223372036854775808
0970デフォルトの名無しさん
2014/02/23(日) 22:44:32.210971デフォルトの名無しさん
2014/02/23(日) 22:47:00.21こわい!とか言いながらラジウム温泉につかるのが日本の原風景
0972デフォルトの名無しさん
2014/02/23(日) 22:47:50.100973デフォルトの名無しさん
2014/02/23(日) 22:56:30.12日常に有害に物質があふれてて、そこに加わる有害物質を入れるかどうか、という前提をなぜ抜かす?
0974デフォルトの名無しさん
2014/02/23(日) 23:47:54.71安全装置とかあるから大丈夫と思ってたので、あんなにあっさり停電で冷却装置
止まってメルトダウンしたり、建物が大爆発したのは結構ショックだったな。
子供の頃から見せられてたアレはいったいなんだったのという。
0975デフォルトの名無しさん
2014/02/23(日) 23:54:20.67ちょっと不気味なんだけど
0976デフォルトの名無しさん
2014/02/24(月) 00:29:07.30今まで無料だと思って浴びまくってた人は青くなれ。
0977デフォルトの名無しさん
2014/02/24(月) 05:43:22.06すごくお馬鹿な詭弁の入り口
0978968
2014/02/24(月) 06:33:45.410979デフォルトの名無しさん
2014/02/24(月) 09:25:42.850980デフォルトの名無しさん
2014/02/24(月) 11:27:37.92燃料の価格高騰で倍以上のコストかかってるし、
結果的に (原発を持たない) 後進国に燃料がまわらず、
かなり反感をもたれてしまってる。
0981デフォルトの名無しさん
2014/02/24(月) 12:11:39.04だから・・・
を連想させようとする
あったま悪いやりかただな
大衆相手にしたろカス
0982デフォルトの名無しさん
2014/02/24(月) 12:14:57.46で?
0983デフォルトの名無しさん
2014/02/24(月) 13:55:37.97なので車は廃止しましょう」ぐらいの意見と思われているのかな
0984デフォルトの名無しさん
2014/02/24(月) 14:24:31.02原子力が嫌われないためには自家用原子炉を売るか自己責任システムを廃止するしかない
0985デフォルトの名無しさん
2014/02/24(月) 17:13:19.430986デフォルトの名無しさん
2014/02/24(月) 17:14:43.530987デフォルトの名無しさん
2014/02/24(月) 18:17:31.940988960
2014/02/24(月) 19:55:26.04どうも、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
これはバグなのか仕様なのか・・・
クソ、英語をちゃんと身につけておくべきだった
バグにしろ仕様にしろ、報告できるのに
0989デフォルトの名無しさん
2014/02/24(月) 20:01:02.78後進国が原発を持てないのは、日本がウランを買ってるからですよ
0990デフォルトの名無しさん
2014/02/24(月) 20:07:20.12仕様だろ
2^31はInt32では表現できないから、オーバーフローして-2^31になる
Intでも同様
0991960
2014/02/24(月) 20:13:50.11あぁ、そういうことか、納得
おかしいのは俺の頭だった
穴があったら入っとくわ
後は、0 が現れる割合を増やしてる理由だが、
これは何故か作者本人も why って言ってるもんなぁ
どうしようもないか
0993960
2014/02/24(月) 20:20:31.06あぁ、分かった
これ単なる汎用的な非負整数型ではなくて、
あくまで QuickCheck のテストに使うための非負整数型だから、
「0がコーナーケースとなりうる」 --> 「0がよくテストされるように頻度をあげとこう」
ということか
0が出まくっても問題だから、まぁだいたいこの割合にするよ、と
すっきりた
半分以上一人で騒いでいたような気もするが、
アドバイスくれた人たちに感謝するよ、ありがと
0994デフォルトの名無しさん
2014/02/24(月) 20:30:16.390995960
2014/02/24(月) 21:02:21.24だよね、忘れてた
何が境界となりうるかはテストによって変わるから、
QuickCheck のデフォルト100回のテスト中に、
あるリスト内のテストデータは必ずテストされる(あとはランダム)
ということが簡単にできる仕組みがライブラリにあっても良さそうだが・・・
0996デフォルトの名無しさん
2014/02/24(月) 22:26:30.10id id id id 1 -- (2)
上のidのように適用順(1)(2)の評価結果が同じになる
任意の関数fは作れますか?できないならそれはなぜですか?
0997996
2014/02/24(月) 22:45:53.530998デフォルトの名無しさん
2014/02/24(月) 22:48:14.860999デフォルトの名無しさん
2014/02/24(月) 23:17:05.941000デフォルトの名無しさん
2014/02/24(月) 23:17:56.2510011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。