[過去ログ] 関数型プログラミング言語Haskell Part17 (963レス)
上下前次1-新
このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
1(1): 2012/01/02(月)22:19 AAS
haskell.org
外部リンク:www.haskell.org
日本語サイト
外部リンク[cgi]:www.sampou.org
外部リンク:www.shido.info
過去ログ
関数型プログラミング言語Haskell
Part1 2chスレ:tech
Part2 2chスレ:tech
Part3 2chスレ:tech
Part4 2chスレ:tech
Part5 2chスレ:tech
Part6 2chスレ:tech
Part7 2chスレ:tech
Part8 2chスレ:tech
Part9 2chスレ:tech
Part10 2chスレ:tech
Part11 2chスレ:tech
Part12 2chスレ:tech
Part13 2chスレ:tech
Part14 2chスレ:tech
Part15 2chスレ:tech
Part16 2chスレ:tech
837: 2012/03/09(金)06:13 AAS
我、確率分布ライブラリを所望す
それは指定した分布に従う擬似乱数を吐き出すのである
838: 2012/03/09(金)07:16 AAS
欲しけりゃ作れ。
839(1): 2012/03/09(金)12:26 AAS
CalenderTime面倒臭くない?
日時の他にタイムゾーンは良いとして、何で曜日とか、その年の何日目かとか記入せなあかんの?
そんなもん日時から一意に決まるやん
840(1): 2012/03/09(金)12:41 AAS
old-timeなんか使うな
841: 2012/03/09(金)12:43 AAS
>>839
一意に決まるのなら、 let t = CalendarTime { ctWDay = ??? の ??? の部分に
曜日を一意に決める関数(と日時などの引数)を記述すれば良いだけだと思うが
そんなもん一度作ってしまえば終わるやん
なぜ記入せなあかんのかは知らない
842(1): 2012/03/09(金)16:20 AAS
>>840
じゃあ何使えばええねん
843: 2012/03/09(金)19:07 AAS
>>842
time じゃいかんの?
844(2): 2012/03/09(金)21:54 AAS
Haskellが活躍する領域って例えばどんなところでしょうか。
無限リストを扱う場合…とかではなく、xxをする場合に無限リストを扱うから便利だとか、そんな感じの具体例があると嬉しいです。
845: 2012/03/09(金)22:23 AAS
コンピュータが人間に合わせてくれるのではなく、コンピュータに合わせて人間の頭を
作り変えろ、というのがHaskellの思想。
846: 2012/03/09(金)22:33 AAS
Schemeスレでやれ
847(1): 2012/03/09(金)22:36 AAS
プログラミング言語がコンピュータに合わせてくれるのではなく、プログラミング言語に合わせてコンピュータのCPUを
作り変えろ、というのがHaskellの思想。
848: 2012/03/09(金)22:39 AAS
まずで?wそれもはやプログラミング言語ちゃう
849: 2012/03/09(金)23:10 AAS
アセンブラやCはノイマン型コンピューターに寄り添ってるけど、
HaskellやProlog、SQLは数学に寄り添ってる。
850: 2012/03/09(金)23:15 AAS
金融とか構文解析とか
851: 2012/03/09(金)23:19 AAS
イスラエルの某諜報機関と深い関わりを持つ黒い言語Haskell。
852: 2012/03/10(土)01:13 AAS
>>844
積極的な活躍はしないだろう
計算できない事をできないと見抜くとか
しなくていい事をしなくていいと見抜くとかそんな感じ
853: 2012/03/10(土)06:27 AAS
>>847
つーか、それってLISPの頃からそうだし、
VM前提の言語(Java含む)もみんなそうだし、
普通のことだと思うけど?
854(1): 2012/03/10(土)07:09 AAS
AA省
855(2): 2012/03/10(土)10:17 AAS
AA省
856(1): 2012/03/10(土)10:44 AAS
>>854
>1 関数がファーストオブジェクト → アルゴリズムが単純になる
>2 型推論 → 冗長な型指定を省略できる
これらはML系を含むモダンな静的型付け関数型言語に共通な特徴
>3 参照透明性 → 状態変化によるバグが減る
正確には「参照透明性が強制される」と言うべき
結果として3Dレンダリング処理のように破壊的代入のほうが効率的なプログラムでは、
実行時間に問題が出る(もちろん多くのケースではバグが減る利点のほうが大きいけど)
857: 2012/03/10(土)11:01 AAS
Haskellだと、あるものが値か関数かって迷い方はしないよね?
引数いくつ欲しいかなってのはよく迷うけど。
858: 2012/03/10(土)11:25 AAS
高階関数や遅延評価あたりは、Haskellに限らず通常のプログラミング言語でも
導入がすすんでいくだろうから、知らないでは済まなくなるだろうね。
Haskellみたいにデフォルトですべてが遅延評価とかにはならないだろうが。
859: 2012/03/10(土)11:28 AAS
>>856
参照透明性を保ったままでも破壊的操作はできるし、それがHaskellの売り
まだまだ構文的に面倒だって批判はあるだろうけど
860(1): 2012/03/10(土)11:42 AAS
>>855
最初の三つは慣れるしかなさそうだけど、
>遅延IOがつらい。Iterateeとか初心者には使える気がしない。
普通の入力(getChar/getLine)でいいんじゃね
>String BS Textとかどれ選んだらいいのかわからないし文字コードでよくはまる。
バイト列ならByteString
性能が要らないUnicode文字列ならString
性能が要るUnicode文字列ならText
文字コードはWindowsでなけりゃ問題ない気がするけどどういう風にはまるんだろう
わかりやすいHaskellのメリットは、関数プログラミングよりもむしろ、
attoparsecやprettyみたいなコンビネータライブラリが使えることとか、
軽量スレッドとSTMのおかげでマルチスレッドが楽に書けることとかだと思う
861(1): 2012/03/10(土)12:06 AAS
>>860
アドバイスありがとう
ネットで探すと日本語の扱いがみんな違ってて何処見たらいいのかよく分からない。
やりたいことはWindows上でMS932なCSVを読んだり吐いたりしたいんだが、
iconv使うのかとおもったら最近はSystem.IOらしいけどやり方がよく分からない。
862: 2012/03/10(土)12:16 AAS
>>861
System.IOはロケールのエンコーディングを使う設計で、
基本的にはその通り動くんだけど、Windows上のマルチバイトだけは対応してない
今はどうするのが主流なのか分からんけどWindowsの人が教えてくれるだろう
863: 2012/03/10(土)12:19 AAS
お客様の中でWindowsの人はいませんか〜
864: 2012/03/10(土)12:34 AAS
この調子だと低級言語のようにbyte単位で頑張る方がメリットが大きいようだな
865: 2012/03/10(土)12:36 AAS
hyde単位に見えた
866(1): 2012/03/10(土)12:53 AAS
頑張ってtext-icuを入れるんだ
867: 2012/03/10(土)13:38 AAS
そしたらWindowsではUTF8なら安心?
868: 2012/03/10(土)14:03 AAS
>>866
icuin, icudt, icuuc ってこれどっから持ってくればいいの?
869(2): 2012/03/10(土)14:46 AAS
持ってこなくてもパス通しておけばおk
870: 2012/03/10(土)15:18 AAS
>>869
もしかして、Visual StudioとかMinGWの開発環境がインストールしてあれば普通にあるものなのか
871: 2012/03/10(土)15:31 AAS
外部リンク:site.icu-project.org
ここから適当なライブラリとヘッダをもってきてパス通したらインストールは通った
動かし方を勉強してみる
872(1): 2012/03/10(土)20:18 AAS
インストールは成功したけど、実際に使おうとするとダメだ・・・
Loading package text-icu-0.6.3.4 ... can't load .so/.DLL for: icuuc (addDLL: could not load DLL)
>>869
どこにパスを通したらいいのか教えてもらえると嬉しいです。
873: 2012/03/10(土)20:40 AAS
こういうところがハスケルのパッとしないところなんだよなあ
874: 2012/03/10(土)20:48 AAS
使ってる環境にもよるんじゃないの?
ubuntuでは
apt-get install libicu-dev
cabal install text-icu
しただけだよ
875: 2012/03/10(土)21:05 AAS
付属ライブラリは初期インストーラに全部入れておいてほしい
といか、むしろ、追加インストールは完全に不可能にしてほしい
876(1): 2012/03/10(土)21:14 AAS
>>872はWindowsでやっとります。
Haskell だけじゃなくて、ruby、clojure、node とかをあえてWindowsで
いろいろ試してるんだけど、Windowsでは動かない追加モジュールってのは
他の言語環境でもけっこうありますな。
877: 2012/03/10(土)21:36 AAS
パスを通した上でコンパイルしたものを実行してみそ
確か現行のHaskell Platformについてるghciはうまくshared libraryを使ってくれないとかあった筈
7.4.1は試してないからわからない
878: 2012/03/10(土)22:07 AAS
>>876
ghc-7.4.1-i386-windows.exe で普通にインストール
cabal.exeを C:\ghc\ghc-7.4.1\bin に入れる
icu4c-4_4_2-Win32-msvc9.zipを展開し
(このバージョンな理由は仮想環境に入っているが9なのでとう個人的理由)
C:\MyLib\icuとなるようにコピー
cmd.exeから
cabal update
cabal install text-icu --extra-include-dirs=C:/MyLib/icu/include --extra-lib-dirs=C:/MyLib/icu/lib
c:\MyLib\icu\binを環境変数PATHに追加
これで
外部リンク[html]:hnakamur.blogspot.com
にあるHello的なプログラムはビルド&実行出来たよ
879: 2012/03/10(土)22:07 AAS
7.4.1ならいけた
icuuc49.dllみたいな名前だったのでそこからicuuc.dllへシンボリックリンク張るのがいるかも
880(1): 2012/03/10(土)22:36 AAS
ある関数をポリモーフィックにしたいのだが、方法が分からない
ある関数とは以下のような目的のものだ
-1.0 以上 1.0 以下の範囲の Double 型の値があり、
これを Bounded クラスのインスタンス型の値に変換したのだが、
-1.0 を minBound の値に、1.0 を maxBound の値に、
その間を適当に補間した値にしたい
変換先の型が固定されていれば、例えば次のようにできた
quantize :: Double -> Int16
quantize x =
let b = fromIntegral (minBound :: Int16)
w = fromIntegral (maxBound :: Int16) - b
in round $ (x + 1) / 2 * w + b
これを次のような意味に解釈できる形にしたい
quantize :: (Integral a, Bounded a) => Double -> a
quantize x =
let b = fromIntegral (minBound :: a)
w = fromIntegral (maxBound :: a) - b
in round $ (x + 1) / 2 * w + b
言わんとしていることは分かってもらえると思うが、
当然このように記述すればエラーだ
この quantize 関数をポリモーフィックにする方法は何かないだろうか
881(2): 2012/03/10(土)22:42 AAS
{-# LANGUAGE RankNTypes, ScopedTypeVariables #-}
プラグマを追加して
quantize :: forall a. (Integral a, Bounded a) => Double -> a
とシグニチャを変更することでlet内で使ってるaとquantizeの型シグニチャ内でのaを同じものとして指定する
882: 2012/03/10(土)23:30 AAS
>>881
助かった
ありがと
883(1): 2012/03/10(土)23:44 AAS
>>880
間は適当に補間したいと言ったが、私が例示したものだと、
変換先が符号付き整数型の場合 0.0 --> -1 と変換されて、
美しくない
私が今作っているシステムの運用上はこれで全く問題ないのだが、
0.0 --> 0 となってくれると気持ちが晴れる
条件分岐を使うくらいならこのままにするのだが、
なにか案があればお聞きしたい
884: 2012/03/10(土)23:48 AAS
>>883
すまん、0.0 だけ例外的に 0 に補間されるより、
やはり一様に線形補間の方が美しいな
>>883 は忘れてくれ
885: 2012/03/11(日)08:15 AAS
ありがとう。text_icu 動いたよ。
7.0.4のHaskell Platformで、icu4c-4_8_1_1-Win32-msvc10.zipを使った。
icu/bin/icudt48.dll、icu/bin/icuin48.dll、icu/bin/icuuc48.dll を、
ghci-7.0.4.exeと同じ場所へ、icudt48.dll、icuin48.dll、icuuc48.dll と
icudt.dll、icuin.dll、icuuc.dll って名前でコピーしたらロードしてくれた。
886: 2012/03/11(日)10:24 AAS
やっぱりtext-icuとByteStringで中身の文字列は明示的に扱うというのが確実なのね。
情報ありがとう
887(1): 2012/03/11(日)12:34 AAS
cabal でパッケージをインストールしようとすると、
時々途中でコンパイルが止まってしまう
[Ctrl + C] で処理を抜けてすぐにもう一度 cabal コマンドを実行すると、
今度は止まらずにインストール作業が進むことが多い
これって何なんだろ
[環境]
Windows7
GHC 7.4.1
cabal-install 0.10.2
cabal 1.10.2.0
888(1): 2012/03/11(日)13:41 AAS
>>887
Haskellのフォルダへの書き込みが管理者権限オンリーになってるとか
889: 2012/03/11(日)13:47 AAS
>>888
コマンドプロンプト自体を管理者権限で立ち上げてるから問題ないと思うんだが
ただ、これが問題だったとしても、インストールできたり止まったりというのは何故?
管理者権限オンリーが問題だったら毎回止まるはずじゃない?
890(1): 2012/03/11(日)14:07 AAS
止まってCtrl+Cしたときに失敗してるのに成功したようなテンポラリが作られてるかもしれん
なので、2度目も止まってないだけでインストールできてないかもしれん
止まるときのプロンプトのメッセージを表示すればもっとヒントが降りてくるかもしれん
891(1): 2012/03/11(日)14:21 AAS
パイプを閉じてない等の理由で、子プロセスが終了しないとか。
makeの子プロセスなら、強制終了してもう一回makeすれば次に進む気がする。
892(1): 2012/03/11(日)14:31 AAS
Haskellインストールしなおして、cacls でフォルダ権限を全員全部OKにしてからやるとか
893(1): 2012/03/11(日)14:39 AAS
>>890
ごめん、止まるという言い方が曖昧だったかも
フリーズする(しているように感じる)という意味
> 2度目も止まってないだけでインストールできてないかもしれん
とりあえず、今のところ問題なくライブラリの関数は使えている
ドキュメントもインストールされている
と思うんだが、正しくインストールされているかどうか確認しようがないよね
>>891
フリーズは、configure 段階やドキュメントのインストール段階ではなく、
いくつかの *.hs ファイルをコンパイルしている段階でしか起きない
例えば計20個の *.hs ファイルをコンパイルするとき、
[1/20] ***.hs とか [13/20] ***.hs とかって表示されるよね
この段階で、何個目かの *.hs ファイルのコンパイル時にフリーズする
アレしに行って1時間位して戻ってきてもまだコンパイルが終わらない
で、[Ctrl + C] で抜け出すんだけど、すぐにもう一度 cabal install すると、
今度はすんなりインストールできたりする
あるいは、今度は別の *.hs ファイルのコンパイルでフリーズする事もある
さっきも language-c パッケージで5回くらいでやっとインストールできた
894(1): 2012/03/11(日)14:43 AAS
>>892
この場合、どこのフォルダの ACL を変えればいい?
cabal パッケージがインストールされる先のフォルダ?
895(1): 2012/03/11(日)14:45 AAS
>>894
HaskellPlatform全部と、個人のローカルのライブラリインストール先フォルダ
896(1): 2012/03/11(日)14:51 AAS
>>893
いくつかのライブラリは、スタブからWindowsの環境を読んでhsファイルを生成した後でそのhsファイルをコンパイルしてる
Windowsの環境を設定してなくて、その環境を読む段階で止まってるかも
emacsのシェルモードか何かで作業中のプロンプトのメッセージを全部テキストに保存して、どこかにアップすれば親切な人が何かしてくれるよ
つーか、もともとインストールされてるモノを再インストールしようとしてるというオチじゃ…
897(1): 2012/03/11(日)15:17 AAS
>>895
それやってみて、しばらく様子見てみる
>>896
> Windowsの環境を設定してなくて、その環境を読む段階で止まってるかも
フリーズした後で、そのコンソールを閉じず、すぐに cabal install した時に
問題なくインストールできてしまうのも、それで説明付くということ?
> emacsのシェルモードか何かで・・・
今度何かパッケージをインストールする時には -v3 オプションつけて、
メッセージをリダイレクトするように覚えておくよ
(今のところ、インストールしたいパッケージは特にない)
> つーか、もともとインストールされてるモノを
それはない
たまたま今回は cabal info で未インストールなのを確認済みだし
っていうか、cabal って同じバージョンのパッケージは、
--reinstall オプションを付けないと再インストールできなくないか?
できたとしても、それでフリーズするメカニズムが分からんが
898(1): 2012/03/11(日)18:40 AAS
>>855
> 1 関数がファーストオブジェクト → 値なのか関数なのかコードを見ただけで分からない(そのための型チェックというのは可読性という意味でずれてる気がする)
関数が求める引数の型を知りたいなら、GHCiでtypeコマンドを使えばいい。
> 2 型推論 → 何処の型を省略してエラーになったのかわかりにくい(加減が重要?)
たいていは、それは自分のコードで理解できていないところがあるということだから、コードを見直せばよい。
> 3 参照透明性 → 手続き脳の最大のハードル
IOモナドでO.K.
> 4 遅延評価がデフォルト → 遅延IOがつらい。Iterateeとか初心者には使える気がしない。
遅延IOはべつに分かりにくいとは思わないが、忘れているとたしかにはまる。
忘れないようにするしかない。
> 5 文字列はリスト → String BS Textとかどれ選んだらいいのかわからないし文字コードでよくはまる。
分からないなら、Stringで良い。
文字コードの件は、Linuxつかえ。
899: 2012/03/11(日)18:43 AAS
>>881
ScopedTypeVariablesはデフォルトにしてほしいよね。
後方互換性ばっさりになるから、そうそうできないだろうけど。
900: 2012/03/11(日)18:59 AAS
ScopedTypeVariablesで壊れる互換性ってほとんどないような
forallって名前の型変数を使ってるコードくらい?
901(6): 2012/03/11(日)22:23 AAS
Haskellのコードって長くなると、どんどんインデントが深くなって困るんだけど
有効な対策ってある?
if .. then .. else doの下でインデントを強制的に浅くする方法が、最も多機能なcaseで
使えないのが残念。
902(1): [―{}@{}@{}-] 2012/03/11(日)22:35 AAS
改行でインデントを減らせるなら積極的に改行する
インデントをスペース二個にする
それでも足りないなら、多分書いてる関数が大きすぎるので分割
903: 2012/03/11(日)22:40 AAS
>>898
>1
GHCi使えっていうのは、JavaでEclipse使えば問題ないと言ってるのと同じ気がする
多分、ふつうならここはこう書くみたいな文化というか慣れなんだろう
>2
自分のコードについてはそのとおり
ライブラリとか他人のコードでポイントフリーされてた時が困る
>4
人間が忘れないようにするか、今ならConduit使うということか
>5
結局Windowsは今でも開発向きではないという事なのか
アドバイスありがとう
904: 2012/03/11(日)22:56 AAS
値なのか関数なのかコードを見ただけで分からない、っていうけど、
全部関数なんだから値がどうとか考えてたらだめだべ。
"ABC" は String を返す関数。
123 は Int (というか Num a => a) を返す関数。
全部関数。
905(2): 2012/03/11(日)23:07 AAS
>>901
基本的にネストが深くなりすぎるのはどこかアルゴリズムがおかしいんだよ。
書き方じゃなくて、アルゴリズムを見なおしたほうがいいよ。
906: 2012/03/11(日)23:07 AAS
どっちかというと全部値と言うべき
907: 901 2012/03/11(日)23:11 AAS
>>902,905
関数が長すぎたり、アルゴリズムがおかしいってのは分かるんだけど
条件分岐やパターンマッチングで必ず一段下がるってのはHaskellの特性だと
思うんだよ。
Cならif (hoge) return;で終わるようなパターンが書き辛い
908(1): 2012/03/11(日)23:14 AAS
>>905
アルゴリズムを見ていないのに、おかしいと断言するんですか?
909: 2012/03/11(日)23:27 AAS
>>908
するよ。たいていはネストを深くしない書き方できるし。
910(1): 2012/03/11(日)23:41 AAS
>> 907
| ∧∧
|(´・ω・`)
|o ヾ
|―u' [Maybeモナド when unless] <コトッ
911(1): 901 2012/03/11(日)23:44 AAS
>>910
たとえばCだと
if (hoge) return;
... <- この部分はifと同じインデントの深さ
Haskellのwhenやunlessだと
unless hoge $ do
... <- ここで一段深くなる
912: 2012/03/12(月)00:20 AAS
Windowsでの日本語取扱いの面倒くささがHaskellのWindowsへの進出を妨げている
913(1): 2012/03/12(月)00:23 AAS
unless (not hoge) (return ())
例えがよく分からんよw
914(3): 901 2012/03/12(月)00:31 AAS
>>913
つまり、関数の途中で、条件によっては処理をやめる必要がある時、
Cなら続行する部分をインデント無しにできるが、Haskellなら一段必要ってこと。
>>901にも書いた if .. then .. else doで強制的にインデントを無くせるけど、ダサいでしょ?
915: 2012/03/12(月)00:34 AAS
寧ろHaskellで書くようになってから
GVimで:vsした画面の幅(大体80文字未満)で賄えるようにコーディングする癖ついた
縦に長くはなるが、実は読む時その方が頭に入ってくる事が判った
横に広がらずにコンパクトに書けた時に脳内麻薬が分泌されるようになった
916: 2012/03/12(月)00:38 AAS
コンパクトは適切じゃないな
なにしろ縦には長いのだから
スリム
あるいはナローに書けると嬉しい
ナローライティングを提唱しようか
917: 2012/03/12(月)00:50 AAS
>>914
ごめん、ちょっと何言ってんだかかわんない
918: 2012/03/12(月)00:51 AAS
>>914
自分もわからん。
実際に長くなる例を書いてみて。
919(2): 901 2012/03/12(月)00:51 AAS
>>914
分かりにくいだろうから、極端な例を作った↓
外部リンク:pastebin.com
920: 2012/03/12(月)00:55 AAS
>>911
それ、一段深くする必要ないでしょ。
921(1): 2012/03/12(月)01:04 AAS
ソースコードはダサいかクールかじゃない
過去のソースを読んですぐ当時の思考を思い出せるかどうかだ
922(1): 2012/03/12(月)01:21 AAS
>>921
それよく言われるけど、現実問題、「すぐ当時の思考を思い出せる」ところまでやるのは非効率だと思っている。
それよりは常に全体のスタイルやフレームワークを統一するように意識したほうがよい。
923: 2012/03/12(月)01:34 AAS
>>922
よく言われるのか
今さっき俺が思い至った事を吟味せず書いただけだけど
924(1): 2012/03/12(月)03:20 AAS
>>919
これってつまり、実はインデントはあんまり関係なくて、
Haskell でショートカットがやりたい、ってこと?
継続モナドとか使えばできなくはないと思うけれど、
たぶんかえって読みにくくなるので、あっちこっちで
条件判断しなくていいように書きかたを変えるのが
一番いいと思う。
925: 2012/03/12(月)07:45 AAS
>>897
単純にHDDかマザーボードに不良があるように思えるなぁ
926(1): 2012/03/12(月)10:24 AAS
この手の処理こそMaybeモナドの出番のような
927(1): 2012/03/12(月)10:26 AAS
>>>919
このケースはIOじゃなくてMonadIO m => MaybeT mを使えば良い
具体的にはfun1を次のように書ける。
fun1 :: Bool -> MonadIO m => MaybeT m ()
fun1 b = do
guard $ not b -- (not b)が偽ならば即座にmzeroつまりNothing
liftIO $ putStrLn "hello" -- よってインデントは深くならない
guard $ not .. -- やっぱり深くならない
928: 2012/03/12(月)10:27 AAS
半角スペース消し飛ぶの忘れてたわ・・・・
fun1 :: Bool -> MonadIO m => MaybeT m ()
fun1 b = do
guard $ not b -- (not b)が偽ならば即座にmzeroつまりNothing
liftIO $ putStrLn "hello" -- よってインデントは深くならない
guard $ not .. -- やっぱり深くならない
929: 2012/03/12(月)10:37 AAS
haskell板でやるべき
930: 901 2012/03/12(月)10:40 AAS
>>924
関係ないことはないんだけど、C並にシンプルに中止をしたいってこと。
>>926,927
ご指摘はごもっとも。
でも今度はliftIO地獄になる。特にGUIなプログラムだと。
俺がインデントインデントと言いすぎた所為で、話が噛み合わなくなって
しまった。申し訳無い。
931: 2012/03/12(月)10:51 AAS
結局何がしたかったの?
932: 2012/03/12(月)11:07 AAS
GUIってことはイベント処理がしたかったのかな・・・
しかしlift地獄にならないためのliftIOなんだが、
liftIO地獄とはまた手厳しい御仁もいたものだ
まあ機能をフラットには合成できないのがモナド変換子の弱点なのは確かだが
933: 2012/03/12(月)11:08 AAS
LocalTime何で直接差を取れないんだよ
LocalTime d1 tod1
と
LocalTime d2 tod2
の差を取るのに一々
(diffDays d1 d2, tod1 |-| tod2) where
(|-|) = (-) `on` timeOfDayToTime
しないといけないとかどんだけサドだよ
localTimeToDiffTime
があれば
Num DiffTime
なんだから一発なのに
934: 2012/03/12(月)13:09 AAS
timezoneが一致しないかもしれない
935: 2012/03/12(月)13:29 AAS
ドラクエ2のサマルトリア王子仲間にする時あるいは
役所に何か申請しに行く時並に
モジュールリファレンスたらい回しくらったぜよ
パズルかって
936: 2012/03/12(月)13:47 AAS
?
937: 2012/03/12(月)15:06 AAS
お前ら本当にごみだな
何がHaskellだよ
ばかじゃん?気持ち悪い
死ね
お前らさGlenn Seemannって知ってる?
まあお前らよりすげえやつなんだけどお前らはカスだから比べ物にならないけどさ
Hasekellやって黒いターミナル画面に計算結果出して楽しいの?馬鹿?
死ねって
お前ら本当にごみだよな
ゲームすらろくにつくれねえごみ
ねえ?わかってんのか?
ゲーム作る人>>>>>>>>>>>>>>>>>お前ら
食べ物作る人>>>>>>>>>>>>>>>>お前ら
938: 2012/03/12(月)15:07 AAS
お前ら何も生産性がないよな
なあ?馬鹿?死ね
939: 2012/03/12(月)15:08 AAS
目覚めたか?死んどけ
じゃあなカス
940: 2012/03/12(月)15:16 AAS
他人のふんどしで相撲を取る。これが俺の生き様
941: 2012/03/12(月)15:31 AAS
いつもながら自然言語処理で扱いやすい文体でとてもよろしい
942: 2012/03/12(月)17:15 AAS
【3Dゲームエンジン】Unity 10
2chスレ:gamedev
ここの無様なクソゲーしか作れないかわいそうなやつらをなじってください
私が「クソゲーしか作れないのか?!!!」と強烈批判すると
クズ「そのクソゲーすら作れないお前が文句いうな」
とかいってきます
どうしましょう?
私はゲーム開発者ではありません ゲームファンです
やはり彼らは、隠しているのではなく
公に自分のゲームを見せつけています
それを評価しているだけなのに「文句言われます」
それって意味わかりませんよね?
文句言われるなら見せるな作るなって事です
なんとかいってやってください
インテリゲンチャなHaskellハッカーさんたち
やはり
943: 2012/03/12(月)18:40 AAS
↑この人、前はもう少し日本語がまともだったような気がするんだが
944: 2012/03/12(月)19:41 AAS
俺はここのスレのやつが一番いいと思ってる
こいつらの受け答えはむかつかない
凄いいいやつだらけだなここのスレは
じゃあな
また今度会おうぜ
945: 2012/03/12(月)20:07 AAS
ええ、お待ちしております
946(2): 2012/03/12(月)20:36 AAS
AA省
947(1): 2012/03/12(月)20:48 AAS
レコード構文を使いなされ…
948: 2012/03/12(月)21:06 AAS
>>947
レコード構文ってパターンマッチにも使えるのか
すげー 感動したぜ
ありがと
949(2): 2012/03/12(月)21:54 AAS
data ObjectType = H | F | B
data SomeObject = SomeObject ObjectType String
SomeObject H "Hoge..."
SomeObject F "Foo..."
みたいに使うならそもそも
data SomeObject =
H String |
F String |
B String
みたいに宣言した方が良いの?
但し全てStringを使うものとする
950(1): 2012/03/12(月)22:29 AAS
>>949
俺(>>946)に対するレス?
俺はデータ型の合理的な運用という高レベルじゃなく、
単にパターンマッチの記述で楽したいという低レベルの質問をしただけだよ
むちゃくちゃ適当に書いた例が悪かったか?
951: 2012/03/12(月)23:12 AAS
>>950
いや全員に訊いた
952(1): 2012/03/12(月)23:45 AAS
>>949
上のタイプの宣言なら
getString (SomeObject _ str) = str
みたいに、ObjectTypeに関わらず文字列を取得するような関数が容易に書ける。
下は全部のパターン網羅しないと無理。
微々たる違いとしては、内部的にはSomeObjectのコンストラクタ情報分サイズ増える。
(ObjectType, String)をnewtypeでラップしてやれば解決だけど。
違いはこんなとこじゃね?
目的に沿ったものを好きに選択しる
953: 952 2012/03/13(火)00:02 AAS
わるい、よく考えたらサイズかわんねーな。
微々たる違い〜云々のとこは忘れてくれ…。
954: 2012/03/13(火)00:07 AAS
Template Haskell で20行未満の面白いテンプレートを作ったんで見てほしいんだが、
ここに書くと空白文字使えないんで見難くなる
(かといって、全角空白いれるとコピペして即実行はできんし)
どこか、コード片をアップできるところ無い?
955: はちみつ餃子 ◆8X2XSCHEME 2012/03/13(火)00:11 AAS
ブレース記法
956: 2012/03/13(火)00:13 AAS
使ったことないけどGistとか
957: 2012/03/13(火)00:14 AAS
&で空白を置換するか
upするならhpaste, codepad, pastebinとかいろいろあるよ
958: 2012/03/13(火)00:37 AAS
そうか!
(.) の二項演算版がonなんだな!
ならリファレンスに一言そう書きゃいいのに
959(1): 2012/03/13(火)00:37 AAS
ん?
じゃなくて &で空白を置換すればいいの?
960: 2012/03/13(火)00:42 AAS
>>959
ああボケてた。 だ
ごめんごめん
961(2): 2012/03/13(火)00:46 AAS
ここにレスすることにしたよ
$(isComeFrom 値構築子) とすると、次のコードが生成される
\x -> case x of 値構築子 -> True; otherwise -> False
値構築子の引数の数も自動的に考慮される
[使用例] filter $(isComeFrom V1) [V2, V1, V3, V1, V6, V1]
{-# LANGUAGE TemplateHaskell #-}
module PatternMatch where
import Language.Haskell.TH
isComeFrom :: Name -> ExpQ
isComeFrom vc = do
i <- reify vc
case i of
DataConI _ t _ _ -> [| \x -> $(caseE [|x|] (alts $ dcArgCnt t)) |]
otherwise -> error "The argument of $(isComeFrom) \
\template must be a data constructor."
where alts n =
[ match (conP vc (replicate n wildP)) (normalB [|True|]) []
, match wildP (normalB [|False|]) []
]
dcArgCnt :: Type -> Int
dcArgCnt (AppT _ t) = 1 + dcArgCnt t
dcArgCnt _ = 0
962: 961 2012/03/13(火)00:51 AAS
>>961
実は俺 >>946 なんだが、
パターンマッチ書くのも、otherwise 書くのも面倒になってきたから、
テンプレート作って自動化させた
これ、俺の中では結構需要あって、ただいま絶賛大ヒット中
ただ、テンプレートの関数名がダサいし長いんだが、良い案が思いつかん
ところで、やっぱ個人的にはプロポーショナルなフォントだと見難いな
963: 961 2012/03/13(火)00:58 AAS
>>961
すまん、使用例でアポストロフィを書き忘れてた
ついでだから、もう少し詳細な使用例
data T = V1 Int Int Int
| V2 Int Double String
| V3 String Int Int Int Int Int Int
t1 = V1 0 0 0
t2 = V2 0 0 "a"
t3 = V3 "a" 0 0 0 0 0 0
filter $(isComeFrom 'V3) [t1, t2, t3, t2, t3, t1]
計算結果
[t3, t3]
上下前次1-新書関写板覧索設栞歴
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 0.314s*