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

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

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

1 :デフォルトの名無しさん:2012/01/02(月) 22:19:28.26
haskell.org
ttp://www.haskell.org/

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

過去ログ
関数型プログラミング言語Haskell
Part1 ttp://pc.2ch.net/tech/kako/996/996131288.html
Part2 ttp://pc2.2ch.net/test/read.cgi/tech/1013846140/
Part3 ttp://pc8.2ch.net/test/read.cgi/tech/1076418993/
Part4 ttp://pc8.2ch.net/test/read.cgi/tech/1140717775/
Part5 ttp://pc8.2ch.net/test/read.cgi/tech/1149263630/
Part6 ttp://pc11.2ch.net/test/read.cgi/tech/1162902266/
Part7 ttp://pc11.2ch.net/test/read.cgi/tech/1174211797/
Part8 ttp://pc11.2ch.net/test/read.cgi/tech/1193743693/
Part9 ttp://pc11.2ch.net/test/read.cgi/tech/1211010089/
Part10 ttp://pc12.2ch.net/test/read.cgi/tech/1231861873/
Part11 ttp://pc12.2ch.net/test/read.cgi/tech/1252382593/
Part12 ttp://hibari.2ch.net/test/read.cgi/tech/1272536128/
Part13 ttp://hibari.2ch.net/test/read.cgi/tech/1286706874/
Part14 ttp://hibari.2ch.net/test/read.cgi/tech/1299385928/
Part15 ttp://hibari.2ch.net/test/read.cgi/tech/1310199414/
Part16 ttp://toro.2ch.net/test/read.cgi/tech/1317958045/

841 :デフォルトの名無しさん:2012/03/09(金) 12:43:36.01
>>839
一意に決まるのなら、 let t = CalendarTime { ctWDay = ??? の ??? の部分に
曜日を一意に決める関数(と日時などの引数)を記述すれば良いだけだと思うが

そんなもん一度作ってしまえば終わるやん


なぜ記入せなあかんのかは知らない

842 :デフォルトの名無しさん:2012/03/09(金) 16:20:51.07
>>840
じゃあ何使えばええねん

843 :デフォルトの名無しさん:2012/03/09(金) 19:07:16.04
>>842
time じゃいかんの?

844 :デフォルトの名無しさん:2012/03/09(金) 21:54:28.23
Haskellが活躍する領域って例えばどんなところでしょうか。
無限リストを扱う場合…とかではなく、xxをする場合に無限リストを扱うから便利だとか、そんな感じの具体例があると嬉しいです。

845 :デフォルトの名無しさん:2012/03/09(金) 22:23:50.51
コンピュータが人間に合わせてくれるのではなく、コンピュータに合わせて人間の頭を
作り変えろ、というのがHaskellの思想。

846 :デフォルトの名無しさん:2012/03/09(金) 22:33:53.73
Schemeスレでやれ

847 :デフォルトの名無しさん:2012/03/09(金) 22:36:35.18
プログラミング言語がコンピュータに合わせてくれるのではなく、プログラミング言語に合わせてコンピュータのCPUを
作り変えろ、というのがHaskellの思想。

848 :デフォルトの名無しさん:2012/03/09(金) 22:39:45.50
まずで?wそれもはやプログラミング言語ちゃう

849 :デフォルトの名無しさん:2012/03/09(金) 23:10:58.86
アセンブラやCはノイマン型コンピューターに寄り添ってるけど、
HaskellやProlog、SQLは数学に寄り添ってる。

850 :デフォルトの名無しさん:2012/03/09(金) 23:15:33.97
金融とか構文解析とか

851 :デフォルトの名無しさん:2012/03/09(金) 23:19:57.13
イスラエルの某諜報機関と深い関わりを持つ黒い言語Haskell。

852 :デフォルトの名無しさん:2012/03/10(土) 01:13:27.63
>>844
積極的な活躍はしないだろう
計算できない事をできないと見抜くとか
しなくていい事をしなくていいと見抜くとかそんな感じ

853 :デフォルトの名無しさん:2012/03/10(土) 06:27:35.26
>>847
つーか、それってLISPの頃からそうだし、
VM前提の言語(Java含む)もみんなそうだし、
普通のことだと思うけど?

854 :デフォルトの名無しさん:2012/03/10(土) 07:09:26.98
>>844
Haskellの特徴はこんなところです。

1 関数がファーストオブジェクト → アルゴリズムが単純になる
2 型推論           → 冗長な型指定を省略できる
3 参照透明性         → 状態変化によるバグが減る
4 遅延評価がデフォルト    → アルゴリズムが単純になる
5 文字列はリスト       → アルゴリズムが単純になる

1〜3は特に短所がありません。
しかし4〜5により実行時間に問題がでました。
Haskellの活躍はコーディング時間が実行時間より重要な領域に限られます。
つまり、Haskellが活躍する領域は仕様変更が頻繁な所です。

タイル型WMのXmonadが単純な記述で複雑な事ができるから人気があり、
DVCSのDarcsが遅いから使うだけのユーザに不人気なのが実例です。

855 :デフォルトの名無しさん:2012/03/10(土) 10:17:59.11
Haskell初心者なんだが、
1 関数がファーストオブジェクト → 値なのか関数なのかコードを見ただけで分からない(そのための型チェックというのは可読性という意味でずれてる気がする)
2 型推論           → 何処の型を省略してエラーになったのかわかりにくい(加減が重要?)
3 参照透明性         → 手続き脳の最大のハードル
4 遅延評価がデフォルト    → 遅延IOがつらい。Iterateeとか初心者には使える気がしない。
5 文字列はリスト       → String BS Textとかどれ選んだらいいのかわからないし文字コードでよくはまる。

どのくらいやればHaskellのメリットが出てくるのか教えて欲しい。
それとも他の言語と違ってプログラミングヘタレはお断り?

856 :デフォルトの名無しさん:2012/03/10(土) 10:44:16.15
>>854
>1 関数がファーストオブジェクト → アルゴリズムが単純になる
>2 型推論           → 冗長な型指定を省略できる

これらはML系を含むモダンな静的型付け関数型言語に共通な特徴

>3 参照透明性         → 状態変化によるバグが減る

正確には「参照透明性が強制される」と言うべき
結果として3Dレンダリング処理のように破壊的代入のほうが効率的なプログラムでは、
実行時間に問題が出る(もちろん多くのケースではバグが減る利点のほうが大きいけど)



857 :デフォルトの名無しさん:2012/03/10(土) 11:01:46.76
Haskellだと、あるものが値か関数かって迷い方はしないよね?
引数いくつ欲しいかなってのはよく迷うけど。

858 :デフォルトの名無しさん:2012/03/10(土) 11:25:43.63
高階関数や遅延評価あたりは、Haskellに限らず通常のプログラミング言語でも
導入がすすんでいくだろうから、知らないでは済まなくなるだろうね。
Haskellみたいにデフォルトですべてが遅延評価とかにはならないだろうが。

859 :デフォルトの名無しさん:2012/03/10(土) 11:28:29.83
>>856
参照透明性を保ったままでも破壊的操作はできるし、それがHaskellの売り
まだまだ構文的に面倒だって批判はあるだろうけど

860 :デフォルトの名無しさん:2012/03/10(土) 11:42:42.73
>>855
最初の三つは慣れるしかなさそうだけど、
>遅延IOがつらい。Iterateeとか初心者には使える気がしない。
普通の入力(getChar/getLine)でいいんじゃね
>String BS Textとかどれ選んだらいいのかわからないし文字コードでよくはまる。
バイト列ならByteString
性能が要らないUnicode文字列ならString
性能が要るUnicode文字列ならText
文字コードはWindowsでなけりゃ問題ない気がするけどどういう風にはまるんだろう

わかりやすいHaskellのメリットは、関数プログラミングよりもむしろ、
attoparsecやprettyみたいなコンビネータライブラリが使えることとか、
軽量スレッドとSTMのおかげでマルチスレッドが楽に書けることとかだと思う

861 :デフォルトの名無しさん:2012/03/10(土) 12:06:13.18
>>860
アドバイスありがとう
ネットで探すと日本語の扱いがみんな違ってて何処見たらいいのかよく分からない。
やりたいことはWindows上でMS932なCSVを読んだり吐いたりしたいんだが、
iconv使うのかとおもったら最近はSystem.IOらしいけどやり方がよく分からない。

862 :デフォルトの名無しさん:2012/03/10(土) 12:16:53.07
>>861
System.IOはロケールのエンコーディングを使う設計で、
基本的にはその通り動くんだけど、Windows上のマルチバイトだけは対応してない
今はどうするのが主流なのか分からんけどWindowsの人が教えてくれるだろう

863 :デフォルトの名無しさん:2012/03/10(土) 12:19:36.93
お客様の中でWindowsの人はいませんか〜

864 :デフォルトの名無しさん:2012/03/10(土) 12:34:45.83
この調子だと低級言語のようにbyte単位で頑張る方がメリットが大きいようだな

865 :デフォルトの名無しさん:2012/03/10(土) 12:36:31.12
hyde単位に見えた

866 :デフォルトの名無しさん:2012/03/10(土) 12:53:17.86
頑張ってtext-icuを入れるんだ

867 :デフォルトの名無しさん:2012/03/10(土) 13:38:04.21
そしたらWindowsではUTF8なら安心?


868 :デフォルトの名無しさん:2012/03/10(土) 14:03:48.63
>>866
icuin, icudt, icuuc ってこれどっから持ってくればいいの?

869 :デフォルトの名無しさん:2012/03/10(土) 14:46:24.04
持ってこなくてもパス通しておけばおk

870 :デフォルトの名無しさん:2012/03/10(土) 15:18:08.53
>>869
もしかして、Visual StudioとかMinGWの開発環境がインストールしてあれば普通にあるものなのか

871 :デフォルトの名無しさん:2012/03/10(土) 15:31:20.24
ttp://site.icu-project.org/download/
ここから適当なライブラリとヘッダをもってきてパス通したらインストールは通った
動かし方を勉強してみる

872 :デフォルトの名無しさん:2012/03/10(土) 20:18:52.16
インストールは成功したけど、実際に使おうとするとダメだ・・・
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:10.19
こういうところがハスケルのパッとしないところなんだよなあ

874 :デフォルトの名無しさん:2012/03/10(土) 20:48:07.81
使ってる環境にもよるんじゃないの?
ubuntuでは
apt-get install libicu-dev
cabal install text-icu
しただけだよ

875 :デフォルトの名無しさん:2012/03/10(土) 21:05:16.37
付属ライブラリは初期インストーラに全部入れておいてほしい
といか、むしろ、追加インストールは完全に不可能にしてほしい

876 :デフォルトの名無しさん:2012/03/10(土) 21:14:31.10
>>872はWindowsでやっとります。
Haskell だけじゃなくて、ruby、clojure、node とかをあえてWindowsで
いろいろ試してるんだけど、Windowsでは動かない追加モジュールってのは
他の言語環境でもけっこうありますな。

877 :デフォルトの名無しさん:2012/03/10(土) 21:36:42.17
パスを通した上でコンパイルしたものを実行してみそ
確か現行のHaskell Platformについてるghciはうまくshared libraryを使ってくれないとかあった筈
7.4.1は試してないからわからない


878 :デフォルトの名無しさん:2012/03/10(土) 22:07:07.45
>>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に追加
これで
ttp://hnakamur.blogspot.com/2011/07/ghctext-icu.html
にあるHello的なプログラムはビルド&実行出来たよ

879 :デフォルトの名無しさん:2012/03/10(土) 22:07:14.33
7.4.1ならいけた
icuuc49.dllみたいな名前だったのでそこからicuuc.dllへシンボリックリンク張るのがいるかも

880 :デフォルトの名無しさん:2012/03/10(土) 22:36:05.68
ある関数をポリモーフィックにしたいのだが、方法が分からない
ある関数とは以下のような目的のものだ

-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 :デフォルトの名無しさん:2012/03/10(土) 22:42:40.92
{-# LANGUAGE RankNTypes, ScopedTypeVariables #-}
プラグマを追加して
quantize :: forall a. (Integral a, Bounded a) => Double -> a
とシグニチャを変更することでlet内で使ってるaとquantizeの型シグニチャ内でのaを同じものとして指定する

882 :デフォルトの名無しさん:2012/03/10(土) 23:30:31.55
>>881
助かった
ありがと

883 :デフォルトの名無しさん:2012/03/10(土) 23:44:13.32
>>880
間は適当に補間したいと言ったが、私が例示したものだと、
変換先が符号付き整数型の場合 0.0 --> -1 と変換されて、
美しくない

私が今作っているシステムの運用上はこれで全く問題ないのだが、
0.0 --> 0 となってくれると気持ちが晴れる

条件分岐を使うくらいならこのままにするのだが、
なにか案があればお聞きしたい

884 :デフォルトの名無しさん:2012/03/10(土) 23:48:10.20
>>883
すまん、0.0 だけ例外的に 0 に補間されるより、
やはり一様に線形補間の方が美しいな

>>883 は忘れてくれ

885 :デフォルトの名無しさん:2012/03/11(日) 08:15:52.90
ありがとう。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:22.71
やっぱりtext-icuとByteStringで中身の文字列は明示的に扱うというのが確実なのね。
情報ありがとう

887 :デフォルトの名無しさん:2012/03/11(日) 12:34:25.23
cabal でパッケージをインストールしようとすると、
時々途中でコンパイルが止まってしまう

[Ctrl + C] で処理を抜けてすぐにもう一度 cabal コマンドを実行すると、
今度は止まらずにインストール作業が進むことが多い

これって何なんだろ

[環境]
Windows7
GHC 7.4.1
cabal-install 0.10.2
cabal 1.10.2.0

888 :デフォルトの名無しさん:2012/03/11(日) 13:41:15.58
>>887
Haskellのフォルダへの書き込みが管理者権限オンリーになってるとか

889 :デフォルトの名無しさん:2012/03/11(日) 13:47:40.60
>>888
コマンドプロンプト自体を管理者権限で立ち上げてるから問題ないと思うんだが

ただ、これが問題だったとしても、インストールできたり止まったりというのは何故?
管理者権限オンリーが問題だったら毎回止まるはずじゃない?

890 :デフォルトの名無しさん:2012/03/11(日) 14:07:27.08
止まってCtrl+Cしたときに失敗してるのに成功したようなテンポラリが作られてるかもしれん
なので、2度目も止まってないだけでインストールできてないかもしれん

止まるときのプロンプトのメッセージを表示すればもっとヒントが降りてくるかもしれん

891 :デフォルトの名無しさん:2012/03/11(日) 14:21:47.94
パイプを閉じてない等の理由で、子プロセスが終了しないとか。
makeの子プロセスなら、強制終了してもう一回makeすれば次に進む気がする。

892 :デフォルトの名無しさん:2012/03/11(日) 14:31:27.47
Haskellインストールしなおして、cacls でフォルダ権限を全員全部OKにしてからやるとか

893 :デフォルトの名無しさん:2012/03/11(日) 14:39:52.11
>>890
ごめん、止まるという言い方が曖昧だったかも
フリーズする(しているように感じる)という意味

> 2度目も止まってないだけでインストールできてないかもしれん
とりあえず、今のところ問題なくライブラリの関数は使えている
ドキュメントもインストールされている

と思うんだが、正しくインストールされているかどうか確認しようがないよね


>>891
フリーズは、configure 段階やドキュメントのインストール段階ではなく、
いくつかの *.hs ファイルをコンパイルしている段階でしか起きない

例えば計20個の *.hs ファイルをコンパイルするとき、
[1/20] ***.hs とか [13/20] ***.hs とかって表示されるよね
この段階で、何個目かの *.hs ファイルのコンパイル時にフリーズする
アレしに行って1時間位して戻ってきてもまだコンパイルが終わらない

で、[Ctrl + C] で抜け出すんだけど、すぐにもう一度 cabal install すると、
今度はすんなりインストールできたりする
あるいは、今度は別の *.hs ファイルのコンパイルでフリーズする事もある
さっきも language-c パッケージで5回くらいでやっとインストールできた

894 :デフォルトの名無しさん:2012/03/11(日) 14:43:03.07
>>892
この場合、どこのフォルダの ACL を変えればいい?

cabal パッケージがインストールされる先のフォルダ?

895 :デフォルトの名無しさん:2012/03/11(日) 14:45:27.18
>>894
HaskellPlatform全部と、個人のローカルのライブラリインストール先フォルダ

896 :デフォルトの名無しさん:2012/03/11(日) 14:51:30.25
>>893
いくつかのライブラリは、スタブからWindowsの環境を読んでhsファイルを生成した後でそのhsファイルをコンパイルしてる
Windowsの環境を設定してなくて、その環境を読む段階で止まってるかも
emacsのシェルモードか何かで作業中のプロンプトのメッセージを全部テキストに保存して、どこかにアップすれば親切な人が何かしてくれるよ

つーか、もともとインストールされてるモノを再インストールしようとしてるというオチじゃ…

897 :デフォルトの名無しさん:2012/03/11(日) 15:17:52.72
>>895
それやってみて、しばらく様子見てみる


>>896
> Windowsの環境を設定してなくて、その環境を読む段階で止まってるかも

フリーズした後で、そのコンソールを閉じず、すぐに cabal install した時に
問題なくインストールできてしまうのも、それで説明付くということ?

> emacsのシェルモードか何かで・・・
今度何かパッケージをインストールする時には -v3 オプションつけて、
メッセージをリダイレクトするように覚えておくよ
(今のところ、インストールしたいパッケージは特にない)

> つーか、もともとインストールされてるモノを

それはない
たまたま今回は cabal info で未インストールなのを確認済みだし

っていうか、cabal って同じバージョンのパッケージは、
--reinstall オプションを付けないと再インストールできなくないか?

できたとしても、それでフリーズするメカニズムが分からんが

898 :デフォルトの名無しさん:2012/03/11(日) 18:40:33.74
>>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:20.69
>>881
ScopedTypeVariablesはデフォルトにしてほしいよね。
後方互換性ばっさりになるから、そうそうできないだろうけど。

900 :デフォルトの名無しさん:2012/03/11(日) 18:59:41.81
ScopedTypeVariablesで壊れる互換性ってほとんどないような
forallって名前の型変数を使ってるコードくらい?

901 :デフォルトの名無しさん:2012/03/11(日) 22:23:23.76
Haskellのコードって長くなると、どんどんインデントが深くなって困るんだけど
有効な対策ってある?
if .. then .. else doの下でインデントを強制的に浅くする方法が、最も多機能なcaseで
使えないのが残念。

902 : [―{}@{}@{}-] デフォルトの名無しさん:2012/03/11(日) 22:35:12.33
改行でインデントを減らせるなら積極的に改行する
インデントをスペース二個にする
それでも足りないなら、多分書いてる関数が大きすぎるので分割

903 :デフォルトの名無しさん:2012/03/11(日) 22:40:15.06
>>898
>1
GHCi使えっていうのは、JavaでEclipse使えば問題ないと言ってるのと同じ気がする
多分、ふつうならここはこう書くみたいな文化というか慣れなんだろう
>2
自分のコードについてはそのとおり
ライブラリとか他人のコードでポイントフリーされてた時が困る
>4
人間が忘れないようにするか、今ならConduit使うということか
>5
結局Windowsは今でも開発向きではないという事なのか
アドバイスありがとう

904 :デフォルトの名無しさん:2012/03/11(日) 22:56:17.47
値なのか関数なのかコードを見ただけで分からない、っていうけど、
全部関数なんだから値がどうとか考えてたらだめだべ。
"ABC" は String を返す関数。
123 は Int (というか Num a => a) を返す関数。
全部関数。

905 :デフォルトの名無しさん:2012/03/11(日) 23:07:02.85
>>901
基本的にネストが深くなりすぎるのはどこかアルゴリズムがおかしいんだよ。
書き方じゃなくて、アルゴリズムを見なおしたほうがいいよ。

906 :デフォルトの名無しさん:2012/03/11(日) 23:07:30.60
どっちかというと全部値と言うべき

907 :901:2012/03/11(日) 23:11:42.32
>>902,905
関数が長すぎたり、アルゴリズムがおかしいってのは分かるんだけど
条件分岐やパターンマッチングで必ず一段下がるってのはHaskellの特性だと
思うんだよ。
Cならif (hoge) return;で終わるようなパターンが書き辛い

908 :デフォルトの名無しさん:2012/03/11(日) 23:14:16.21
>>905
アルゴリズムを見ていないのに、おかしいと断言するんですか?

909 :デフォルトの名無しさん:2012/03/11(日) 23:27:59.79
>>908
するよ。たいていはネストを深くしない書き方できるし。


910 :デフォルトの名無しさん:2012/03/11(日) 23:41:58.28
>> 907
| ∧∧
|(´・ω・`)
|o   ヾ
|―u' [Maybeモナド when unless] <コトッ

911 :901:2012/03/11(日) 23:44:57.46
>>910
たとえばCだと
if (hoge) return;
... <- この部分はifと同じインデントの深さ

Haskellのwhenやunlessだと
unless hoge $ do
... <- ここで一段深くなる

912 :デフォルトの名無しさん:2012/03/12(月) 00:20:43.69
Windowsでの日本語取扱いの面倒くささがHaskellのWindowsへの進出を妨げている

913 :デフォルトの名無しさん:2012/03/12(月) 00:23:33.07
unless (not hoge) (return ())
例えがよく分からんよw

914 :901:2012/03/12(月) 00:31:48.93
>>913
つまり、関数の途中で、条件によっては処理をやめる必要がある時、
Cなら続行する部分をインデント無しにできるが、Haskellなら一段必要ってこと。

>>901にも書いた if .. then .. else doで強制的にインデントを無くせるけど、ダサいでしょ?

915 :デフォルトの名無しさん:2012/03/12(月) 00:34:20.31
寧ろHaskellで書くようになってから
GVimで:vsした画面の幅(大体80文字未満)で賄えるようにコーディングする癖ついた
縦に長くはなるが、実は読む時その方が頭に入ってくる事が判った

横に広がらずにコンパクトに書けた時に脳内麻薬が分泌されるようになった

916 :デフォルトの名無しさん:2012/03/12(月) 00:38:24.73
コンパクトは適切じゃないな
なにしろ縦には長いのだから

スリム
あるいはナローに書けると嬉しい

ナローライティングを提唱しようか

917 :デフォルトの名無しさん:2012/03/12(月) 00:50:32.10
>>914
ごめん、ちょっと何言ってんだかかわんない

918 :デフォルトの名無しさん:2012/03/12(月) 00:51:29.41
>>914
自分もわからん。
実際に長くなる例を書いてみて。



919 :901:2012/03/12(月) 00:51:54.02
>>914

分かりにくいだろうから、極端な例を作った↓
http://pastebin.com/rM6A18Hf

920 :デフォルトの名無しさん:2012/03/12(月) 00:55:16.38
>>911
それ、一段深くする必要ないでしょ。

921 :デフォルトの名無しさん:2012/03/12(月) 01:04:09.04
ソースコードはダサいかクールかじゃない
過去のソースを読んですぐ当時の思考を思い出せるかどうかだ

922 :デフォルトの名無しさん:2012/03/12(月) 01:21:21.79
>>921
それよく言われるけど、現実問題、「すぐ当時の思考を思い出せる」ところまでやるのは非効率だと思っている。
それよりは常に全体のスタイルやフレームワークを統一するように意識したほうがよい。

923 :デフォルトの名無しさん:2012/03/12(月) 01:34:27.84
>>922
よく言われるのか

今さっき俺が思い至った事を吟味せず書いただけだけど

924 :デフォルトの名無しさん:2012/03/12(月) 03:20:48.43
>>919

これってつまり、実はインデントはあんまり関係なくて、
Haskell でショートカットがやりたい、ってこと?

継続モナドとか使えばできなくはないと思うけれど、
たぶんかえって読みにくくなるので、あっちこっちで
条件判断しなくていいように書きかたを変えるのが
一番いいと思う。



925 :デフォルトの名無しさん:2012/03/12(月) 07:45:47.50
>>897
単純にHDDかマザーボードに不良があるように思えるなぁ

926 :デフォルトの名無しさん:2012/03/12(月) 10:24:16.94
この手の処理こそMaybeモナドの出番のような

927 :デフォルトの名無しさん:2012/03/12(月) 10:26:09.62
>>>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:26.32
半角スペース消し飛ぶの忘れてたわ・・・・

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:18.81
haskell板でやるべき

930 :901:2012/03/12(月) 10:40:50.31
>>924
関係ないことはないんだけど、C並にシンプルに中止をしたいってこと。

>>926,927
ご指摘はごもっとも。
でも今度はliftIO地獄になる。特にGUIなプログラムだと。

俺がインデントインデントと言いすぎた所為で、話が噛み合わなくなって
しまった。申し訳無い。

931 :デフォルトの名無しさん:2012/03/12(月) 10:51:17.06
結局何がしたかったの?

932 :デフォルトの名無しさん:2012/03/12(月) 11:07:36.66
GUIってことはイベント処理がしたかったのかな・・・

しかしlift地獄にならないためのliftIOなんだが、
liftIO地獄とはまた手厳しい御仁もいたものだ
まあ機能をフラットには合成できないのがモナド変換子の弱点なのは確かだが

933 :デフォルトの名無しさん:2012/03/12(月) 11:08:12.87
LocalTime何で直接差を取れないんだよ

LocalTime d1 tod1

LocalTime d2 tod2
の差を取るのに一々

(diffDays d1 d2, tod1 |-| tod2) where
  (|-|) = (-) `on` timeOfDayToTime

しないといけないとかどんだけサドだよ

localTimeToDiffTime
があれば
Num DiffTime
なんだから一発なのに

934 :デフォルトの名無しさん:2012/03/12(月) 13:09:35.97
timezoneが一致しないかもしれない

935 :デフォルトの名無しさん:2012/03/12(月) 13:29:43.53
ドラクエ2のサマルトリア王子仲間にする時あるいは
役所に何か申請しに行く時並に
モジュールリファレンスたらい回しくらったぜよ

パズルかって

936 :デフォルトの名無しさん:2012/03/12(月) 13:47:23.56


937 :デフォルトの名無しさん:2012/03/12(月) 15:06:39.34
お前ら本当にごみだな

何がHaskellだよ
ばかじゃん?気持ち悪い
死ね

お前らさGlenn Seemannって知ってる?
まあお前らよりすげえやつなんだけどお前らはカスだから比べ物にならないけどさ
Hasekellやって黒いターミナル画面に計算結果出して楽しいの?馬鹿?
死ねって
お前ら本当にごみだよな
 ゲームすらろくにつくれねえごみ 
ねえ?わかってんのか?

ゲーム作る人>>>>>>>>>>>>>>>>>お前ら
食べ物作る人>>>>>>>>>>>>>>>>お前ら

938 :デフォルトの名無しさん:2012/03/12(月) 15:07:35.62
お前ら何も生産性がないよな
なあ?馬鹿?死ね

939 :デフォルトの名無しさん:2012/03/12(月) 15:08:04.39
目覚めたか?死んどけ
じゃあなカス

940 :デフォルトの名無しさん:2012/03/12(月) 15:16:01.87
他人のふんどしで相撲を取る。これが俺の生き様

941 :デフォルトの名無しさん:2012/03/12(月) 15:31:07.39
いつもながら自然言語処理で扱いやすい文体でとてもよろしい

942 :デフォルトの名無しさん:2012/03/12(月) 17:15:41.64
【3Dゲームエンジン】Unity 10
http://toro.2ch.net/test/read.cgi/gamedev/1331217117

ここの無様なクソゲーしか作れないかわいそうなやつらをなじってください

私が「クソゲーしか作れないのか?!!!」と強烈批判すると

クズ「そのクソゲーすら作れないお前が文句いうな」

とかいってきます

どうしましょう?

私はゲーム開発者ではありません ゲームファンです

やはり彼らは、隠しているのではなく
公に自分のゲームを見せつけています
それを評価しているだけなのに「文句言われます」
それって意味わかりませんよね?

文句言われるなら見せるな作るなって事です

なんとかいってやってください
インテリゲンチャなHaskellハッカーさんたち

やはり

943 :デフォルトの名無しさん:2012/03/12(月) 18:40:09.87
↑この人、前はもう少し日本語がまともだったような気がするんだが

944 :デフォルトの名無しさん:2012/03/12(月) 19:41:09.23
俺はここのスレのやつが一番いいと思ってる
こいつらの受け答えはむかつかない

凄いいいやつだらけだなここのスレは

じゃあな
また今度会おうぜ

945 :デフォルトの名無しさん:2012/03/12(月) 20:07:35.02
ええ、お待ちしております

946 :デフォルトの名無しさん:2012/03/12(月) 20:36:58.76
data T = V1 Int Int Int
   | V2 Int Double String
   | V3 String Int Int Int Int Int Int

なんていう型を要素として持つリストがあってさ、
そのリストの中から V3 の値構築子で作ったものだけが欲しい場合、

f :: [T] -> [T]
f = filter g

この関数 g は

g (V3 _ _ _ _ _ _ _) = True
g _ = False

とか case of を使って作る事になるが、アンダーバーが鬱陶しい

同じ(qualified な)名前の値構築子で引数の数(や型)が異なるものなんて無いのだから、
V3 にマッチするかどうか調べるのにアンダーバーすら書きたくないのが本音

でも現状、こうやってアンダーバーを書き連ねるしか方法は無いんだよね

947 :デフォルトの名無しさん:2012/03/12(月) 20:48:58.31
レコード構文を使いなされ…

948 :デフォルトの名無しさん:2012/03/12(月) 21:06:32.92
>>947
レコード構文ってパターンマッチにも使えるのか

すげー 感動したぜ
ありがと

949 :デフォルトの名無しさん:2012/03/12(月) 21:54:32.91
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 :デフォルトの名無しさん:2012/03/12(月) 22:29:44.24
>>949
俺(>>946)に対するレス?

俺はデータ型の合理的な運用という高レベルじゃなく、
単にパターンマッチの記述で楽したいという低レベルの質問をしただけだよ

むちゃくちゃ適当に書いた例が悪かったか?

951 :デフォルトの名無しさん:2012/03/12(月) 23:12:27.45
>>950
いや全員に訊いた

952 :デフォルトの名無しさん:2012/03/12(月) 23:45:01.41
>>949
上のタイプの宣言なら
getString (SomeObject _ str) = str
みたいに、ObjectTypeに関わらず文字列を取得するような関数が容易に書ける。
下は全部のパターン網羅しないと無理。

微々たる違いとしては、内部的にはSomeObjectのコンストラクタ情報分サイズ増える。
(ObjectType, String)をnewtypeでラップしてやれば解決だけど。

違いはこんなとこじゃね?
目的に沿ったものを好きに選択しる

953 :952:2012/03/13(火) 00:02:44.09
わるい、よく考えたらサイズかわんねーな。
微々たる違い〜云々のとこは忘れてくれ…。

954 :デフォルトの名無しさん:2012/03/13(火) 00:07:48.75
Template Haskell で20行未満の面白いテンプレートを作ったんで見てほしいんだが、
ここに書くと空白文字使えないんで見難くなる
(かといって、全角空白いれるとコピペして即実行はできんし)

どこか、コード片をアップできるところ無い?

955 :はちみつ餃子 ◆8X2XSCHEME :2012/03/13(火) 00:11:55.85
ブレース記法

956 :デフォルトの名無しさん:2012/03/13(火) 00:13:09.67
使ったことないけどGistとか

957 :デフォルトの名無しさん:2012/03/13(火) 00:14:57.80
&amp;で空白を置換するか
upするならhpaste, codepad, pastebinとかいろいろあるよ

958 :デフォルトの名無しさん:2012/03/13(火) 00:37:30.07
そうか!

(.) の二項演算版がonなんだな!

ならリファレンスに一言そう書きゃいいのに

959 :デフォルトの名無しさん:2012/03/13(火) 00:37:31.14
ん?

  じゃなくて &で空白を置換すればいいの?

960 :デフォルトの名無しさん:2012/03/13(火) 00:42:10.98
>>959
ああボケてた。&nbsp;だ
ごめんごめん

961 :デフォルトの名無しさん:2012/03/13(火) 00:46:04.69
ここにレスすることにしたよ

$(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:04.94
>>961

実は俺 >>946 なんだが、
パターンマッチ書くのも、otherwise 書くのも面倒になってきたから、
テンプレート作って自動化させた

これ、俺の中では結構需要あって、ただいま絶賛大ヒット中

ただ、テンプレートの関数名がダサいし長いんだが、良い案が思いつかん


ところで、やっぱ個人的にはプロポーショナルなフォントだと見難いな

963 :961:2012/03/13(火) 00:58:35.61
>>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]

964 :デフォルトの名無しさん:2012/03/13(火) 20:49:01.02
Data,TypeableをTの定義でderivingして
template HaskellでV3という名前からtoConstr $ V3 undefined undefined undefined ...という式を作るテンプレートを書き(これをtoConstr'とする)
filter (\x -> $(toConstr' 'V3) == toConstr x) [t1..]
という手を考えたけどただの濫用だわな


965 :デフォルトの名無しさん:2012/03/13(火) 21:09:34.14
白鳥のばた足か
邪悪な発想か
それが問題だ


正しい思考パラダイムにはパラダイス
邪悪な思考パラダイムにはパラライズ


水が高いところから低い所へ流れるように
道理の設計を

966 :デフォルトの名無しさん:2012/03/14(水) 02:10:43.38
低きにながれるのは当たり前だろ


967 :デフォルトの名無しさん:2012/03/14(水) 07:09:39.37
>>966
何を言ってるの?

968 :デフォルトの名無しさん:2012/03/14(水) 08:25:31.43
地球には重力があると言ってるんだろう

969 :デフォルトの名無しさん:2012/03/14(水) 08:41:51.02
iconvによるエンコーディング変換って
instance Showの度に挿むべき?

それともmainで最後の出力に一括のみすべき?


前者はUTF-8以外のコンソールでのインタプリタで開発する時に便利だけど
なんか違う気がする

後者は正式な感じだけど、開発時に不便

970 :デフォルトの名無しさん:2012/03/14(水) 10:33:10.69
showで変換したいってのがよくわからんが…
入出力の前後で変換しないとダメなんじゃないか?
Haskell内じゃUnicodeとLatin1以外ろくに使えないし

971 :デフォルトの名無しさん:2012/03/14(水) 10:59:29.93
そうでした

最初のテストがなまじIOで正しく表示されたもんで勘違いしてました

972 :デフォルトの名無しさん:2012/03/14(水) 11:45:55.16
あ、いや、出力オンリーならやはり正しく表示されますね

文字列リテラルに日本語文字を使用したデータが正しく構築されてるか
インタプリタで覗く用途としてのSJIS変換版showはSJISコンソール上のGHCiで機能します

showの実装の方針は、

@Read型クラスのインスタンスでもある場合は
showとreadが逆関数の関係になるように、

ARead型クラスのインスタンスでない場合は
ヒューマンリーダブルに

であってますか?

973 :デフォルトの名無しさん:2012/03/14(水) 12:25:34.60
いや、showで変換するってことはString = [Char]だけど中身はSJISとかになってるってことでしょ?
でもChar型のエンコードはule4って規定があるわけよ。
Windowsではたまたま表示だけうまくいくかもしんないけど、
ロケールとか考慮して入出力で変換してくれる他の環境じゃ化けるだろうし、
そもそも、そのshowで生成した文字列は表示以外でボロクソになるんじゃないか?
それってshowの機能としてどうなのよ。

974 :デフォルトの名無しさん:2012/03/14(水) 12:27:53.67
すまん、ucs4の間違い。ule4ってなんだ…

975 :デフォルトの名無しさん:2012/03/14(水) 17:37:24.31
どうやらHaskellのスレッドはCやErlangを超えて最速みたいだな
http://shootout.alioth.debian.org/u64q/performance.php?test=threadring

976 :デフォルトの名無しさん:2012/03/14(水) 17:50:32.01
shootoutは、その言語の達人ががんばってめちゃくちゃチューニングしてるかどうかで
だいぶ違ってくるって話がなかったっけ?

977 :デフォルトの名無しさん:2012/03/14(水) 18:16:01.71
ここだけ、いつも新着レスがある感じだもんね。でもそんなに使われている印象は受けないけど、興味をそれだけ惹き付けるということなのか。

978 :デフォルトの名無しさん:2012/03/14(水) 18:20:43.67
>>975
Erlangのはプロセスだから直接比較しても意味ねえだろw

979 :デフォルトの名無しさん:2012/03/14(水) 19:17:31.52
Erlangでプロセスと呼ぶものはユーザスレッドね。

980 :デフォルトの名無しさん:2012/03/14(水) 19:26:12.43
ユーザスレッドによって実装されているというだけで、
メッセージによってのみ結合されているのだから
スレッドと直接比較しても意味ねえよw

981 :デフォルトの名無しさん:2012/03/14(水) 21:20:06.20
すてま

982 :デフォルトの名無しさん:2012/03/14(水) 22:18:19.46
まてす

983 :デフォルトの名無しさん:2012/03/15(木) 05:00:15.45
末尾再帰最適化って
@
foldl
foldl'
どちらでもかかりますか?

サンクを忘却していくfoldl'の方だけですか?


Aインタプリタでもかかりますか?

984 :デフォルトの名無しさん:2012/03/15(木) 07:20:31.53
>>983
「かかる」というのが最終的にどういう状態になるのを期待しているのか不明だが

ライブラリドキュメントで foldl や foldl' のソースを見れば分かるが、
どちらも関数全体の評価の最後に自分自身を評価しているから末尾再帰だ

そして、末尾再帰の形になっているものは、
コンパイルしてもインタープリタでも同じように評価される
もちろん hugs を使ってもだ

985 :デフォルトの名無しさん:2012/03/15(木) 07:45:54.17
>>976
寧ろ、そのチューニングに興味あるな。

986 :デフォルトの名無しさん:2012/03/15(木) 08:40:45.02
>>984
遅延の末尾再帰ってサンク残しますよね

正格な末尾再帰なら手続き型言語のforループのように
一定空間で走る事はすんなり想像できます
しかし遅延でサンク残すバージョンだと
どう最適化するのでしょう?
サンクのせいで空間が膨れ上がり続けますよね
どうもイメージ湧かないのです

987 :デフォルトの名無しさん:2012/03/15(木) 09:59:57.14
foldlもfoldl'も呼び出し元に戻らないって意味で末尾再帰最適化はするんじゃないの?
非正格なfoldlでサンクが膨れ上がるのを何とかするのは末尾再帰最適化とは関係なくて、
それを勝手に正格に最適化されても困るから正格動作するfoldl'が用意されてるんだろ。

988 :デフォルトの名無しさん:2012/03/15(木) 10:19:21.58
末尾再帰最適化はスタック膨れ上がるのを阻止するだけですか

989 :デフォルトの名無しさん:2012/03/15(木) 10:37:19.93
そうです。

990 :デフォルトの名無しさん:2012/03/15(木) 10:40:26.18
ありがとうございました

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

★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.02 2018/11/22 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)