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

関数型プログラミング言語Haskell Part27_©5ch.io

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん 転載ダメ©2ch.net2015/01/08(木) 21:02:35.67ID:IQPOX3u7
関数型プログラミング言語 Haskell について語るスレです。

haskell.org (公式サイト)
http://www.haskell.org/

前スレ
関数型プログラミング言語Haskell Part26
http://peace.2ch.net/test/read.cgi/tech/1406436392/
0652デフォルトの名無しさん2015/02/22(日) 11:16:44.39ID:zFsBha6g
>>644
特別なことはなにも言ってないw
純粋な関数とは数学的意味での関数ということ。
表現から値が一意に決まる。

>>645
わからないのか?

>>651
何を言ってるの?
0653デフォルトの名無しさん2015/02/22(日) 12:47:55.99ID:nNPYfFU0
何を言ってるのかわからない情報弱者を助けるべきというのは正しい
もし弱者のふりをする強者がいたとしも考えを変えるべきではない
弱者のふりをする強者は、弱者を助ける政策を変えさせようとするテロリストだから
0654デフォルトの名無しさん2015/02/22(日) 13:29:41.18ID:0njaRTk3
作用のない関数って何者なんだろう?
xを入力するとxがそのまま帰ってくる関数(?)しか思いつかない
0655デフォルトの名無しさん2015/02/22(日) 13:34:08.70ID:jAanobMm
呼ぶことはできるけど何もしないし何も返さない、純粋階段みたいな代物なんだろう。
0656デフォルトの名無しさん2015/02/22(日) 13:37:05.55ID:zFsBha6g
>>648
出力や破壊的代入は非決定性とは関係ないだろうね
0657デフォルトの名無しさん2015/02/22(日) 13:51:59.84ID:zFsBha6g
>>654 >>655
作用なんて概念がどこで必要になるか考えてみ
0658デフォルトの名無しさん2015/02/22(日) 13:57:27.04ID:0njaRTk3
>>657
数学的意味でっていうのも含めて関数の時点で作用があるとしか思えないので
ぜひ作用のない関数の例を教えてほしい
0659デフォルトの名無しさん2015/02/22(日) 14:01:23.55ID:0njaRTk3
あ、ちなみに、入出力が写像である=入力を対応する出力に変換する=作用だと思っている
この言葉の定義が違うのかな?
0660デフォルトの名無しさん2015/02/22(日) 14:33:32.11ID:nNPYfFU0
>>648
入力は IO a
出力は a -> IO ()
この IO () は型引数がいらないのでMonadである必要はなくてMonoidでもよかった
0661デフォルトの名無しさん2015/02/22(日) 16:22:04.52ID:U2leqzH6
>>645はきちんとわかってるが>>652はなにもわかってない。
0662デフォルトの名無しさん2015/02/22(日) 16:22:49.66ID:qqnO2/LE
なんか非常どうでもいい事で議論になってるんだけど
それ別のところでやってくんない?
haskellと関係ないし
0663デフォルトの名無しさん2015/02/22(日) 16:33:25.93ID:PSZ9BlIS
cabal instll --dependencies-only
とやってもインストールされないパッケージがある。

作業の流れはこう。

$ cabal sandbox init
$ cabal init

*.cabal ファイルの build-depends を埋める。

$ cabal install --dependencies-only
$ cabal configure --enable-test

最後の段階でエラーメッセージが出力される。
cabal: At least the following dependencies are missing:
test-framework-hunit ==0.3.*

*.cabal ファイルにはちゃんと

Test-Suite Something
build-depends: ・・・ test-framework-hunit >= 0.3 && < 0.4 ・・・

と書かれてるんたが。
何でだろ?
0664デフォルトの名無しさん2015/02/22(日) 16:37:32.92ID:PSZ9BlIS
>>663
書き忘れたが、*.cabal ファイルの build-depends に書いた他のパッケージ、
たとえば test-framework-quickcheck などはちゃんとインストールされた。

test-frmework-hunit だけがインストールされない。
0665デフォルトの名無しさん2015/02/22(日) 16:51:49.20ID:PSZ9BlIS
>>664
自己解決した。
cabal install の方にも --enable-tests オプションがいるのか。

流れをぶった切ってすまんかった。
議論を続けてくれ。
0666デフォルトの名無しさん2015/02/22(日) 18:38:37.57ID:zFsBha6g
>>659
純粋な関数にとって、ここの「変換する」、「作用」は余計な言葉だね
0667デフォルトの名無しさん2015/02/22(日) 23:06:21.86ID:+tjqckF6
午前10時ごろ、福島第一原発で、原発の港湾につながる排水路に設置されている放射性物質を検知するモニターの警報が鳴りました。
数値は通常、1リットルあたり100ベクレル以下ですが、最高で7230ベクレルを記録。
このため、東京電力は、排水路のゲートを閉めたほか、汚染水の移送作業を停止しました。

汚染水のタンクの水位計に目立った変化などはないということですが、東京電力は、汚染水が港湾内に流出したとみて原因を調べています。
0668デフォルトの名無しさん2015/02/23(月) 03:00:06.38ID:yHlUAJts
命令型言語の典型的な命令だって、表示意味論からすれば
可能な機械状態の集合Sの直積S×Sの部分集合にほかならない。
これはSからSへの純粋な関数そのものだ。
0669デフォルトの名無しさん2015/02/23(月) 07:55:17.60ID:XYitOeCr
きれいはきたない、きたないはきれい
0670デフォルトの名無しさん2015/02/23(月) 20:41:44.57ID:l7nfI0Hl
今ホットなライブラリは?
0671デフォルトの名無しさん2015/02/23(月) 23:05:43.29ID:QYJUtpb4
関数プログラミング言語Haskellから668へひと言ある?
0672デフォルトの名無しさん2015/02/23(月) 23:33:39.87ID:8CPFjaoD
>>670
世界で、あるいは日本で話題になっているものは残念ながら知らないが、
今自分の中でホットなのは Reflection。

Haskell でモックを作れないかと調べてたら、こんなのがあった。
http://blog.nonowarn.jp/post/184938189/mocking-in-haskell-with-reflection-type-class
古いネタだけどね。
0673デフォルトの名無しさん2015/02/23(月) 23:46:23.43ID:8CPFjaoD
>>670
ちなみに、私はモックをきっかけに reflection を知ったが、
このライブラリ自体はかなり凄いことをやってのけてて、
応用(適用)範囲も広いと思う。

http://cx4a.org/posts/2014-06-03-solve-the-configurations-problem-for-haskell.html
0674デフォルトの名無しさん2015/02/24(火) 00:00:19.36ID:2W8BrWDD
>>673
仕組みは分からんけどおもしろいアプローチだね
0675デフォルトの名無しさん2015/02/24(火) 00:09:48.65ID:sS4fe1na
>>673
これHaskellの仕様外なのでGHCの実装が変わったら使えなくなるということはありませんか?
0676デフォルトの名無しさん2015/02/24(火) 03:27:43.34ID:8m2gPI9o
>>671
わかってないのかもしらんが、>>668のような事情があるから
Haskellの内部で命令型言語を容易に再発明できるのだよ。
0677デフォルトの名無しさん2015/02/24(火) 08:03:23.82ID:S2pCR91J
事情w
関数型言語は命令型言語、命令型言語は関数型言語
0678デフォルトの名無しさん2015/02/24(火) 08:28:54.89ID:UvByGB8V
ハスケルなら脱アルゴリズムできる??
0679デフォルトの名無しさん2015/02/24(火) 08:59:18.55ID:XZZcWcPm
Haskellの功績は、命令型には数学的根拠がないとかいう俗説を反証したこと
0680デフォルトの名無しさん2015/02/24(火) 17:54:38.62ID:DnqBFQEe
>>=って引数の順序逆じゃね?
FunctorもApplicativeも関数→データ→返り値なのに何でMonadだけデータ→関数→返り値なの?
0681デフォルトの名無しさん2015/02/24(火) 18:08:03.66ID:Qwy2iHqI
>>680
> >>=って引数の順序逆じゃね?

なんでだろうね

逆がいいなら =<< もあるが
0682デフォルトの名無しさん2015/02/24(火) 18:55:37.66ID:8m2gPI9o
>>680
>何でMonadだけデータ→関数→返り値なの?

関数を後ろにしないとラムダ式のネストを連鎖させて書きにくいからだろう。
0683デフォルトの名無しさん2015/02/24(火) 20:29:32.00ID:9OYj7FQ2
中置記法なんだから引数が逆だったら使ったときに見た目がキモイ
0684デフォルトの名無しさん2015/02/24(火) 21:18:59.73ID:Egwh0d/F
>>675
使えなくなるかもね。
ただ、reflection パッケージはつい最近も更新されてはいる。

命令型言語のグローバル変数のようなことがしたいのなら、
ghc の言語拡張 ImplicitParams というのもある。
0685デフォルトの名無しさん2015/02/25(水) 11:25:52.12ID:EI9coWAt
>>643
純粋な関数の作用は「値を返すこと」だよ。Haskellでは「普通の意味では値を返さない」関数も ()::()を返すことによって
形式上は値を返す。
0686デフォルトの名無しさん2015/02/25(水) 11:30:47.69ID:EI9coWAt
>>681
ある値に次々と関数を適用する場面を考える。最初の値をxとしよう。

1.まず f を適用すると f x になる
2.つぎに、この結果に対して g を適用すると g ( f x) となる。
3.つぎに、この結果に対して h を適用すると h ( g ( f x ) ) となる。

こうしてみると、思考の流れである『 to x, apply f, then apply g, then apply h ...』 と左右が逆になってる。

>>= はKleisli射に対して x f g h の順番で書けるように工夫したものだと、言える。(ざっくりした説明)
0687デフォルトの名無しさん2015/02/25(水) 13:41:55.23ID:20DVabgT
珠玉のアルゴリズムデザインの話が出ないな
このスレの住人とて捻り鉢巻な難易度なのだろう
0688デフォルトの名無しさん2015/02/25(水) 13:59:16.45ID:zpTHLWvM
>>668
>>676
>>677
>>679
例えば、
x=1; y=2; x=x+y; print x; print y
という命令型プログラムを純粋関数で書くと
どうなるのでしょうか
0689デフォルトの名無しさん2015/02/25(水) 17:10:15.53ID:4X+FbhYD
>>688

メモリの値とターミナルの状態という機械状態を
S=<("x",Vx),("y",Vy),(T)>と表すとして
だとして、

x=1;
→ 関数(f1) --- f1 <("x",Vx),("y",Vy),(T)> = <("x",1),("y",Vy),(T)>
y=2;
→ 関数(f2) --- f2 <("x",Vx),("y",Vy),(T)> = <("x",Vx),("y",2),(T)>
x=x+y;
→ 関数f3 --- f3 <("x",Vx),("y",Vy),(T)> = <("x",Vx+Vy),("y",Vy),(T)>
print x;
→ 関数f4 --- f4 <("x",Vx),("y",Vy),(T)> = <("x",Vx),("y",Vy),(T++show Vx)>
print y;
→関数f5 --- f5 <("x",Vx),("y",Vy),(T)> = <("x",Vx),("y",Vy),(T++show Vy)>

で、これを(逐次実行は関数合成として理解できるので)関数合成すると
f5 . f4 . f3 . f2 . f1 <("x",Vx),("y",Vy),(T)> = <("x",3),("y",2),(T++ "3" ++ "2" )>
という関数になる。
0690デフォルトの名無しさん2015/02/25(水) 17:16:52.68ID:GkGCDPjk
>>688
newIORef 1 >>= \ x ->
newIORef 2 >>= \ y ->
(fmap (+) (readIORef x) <*> readIORef y) >>= writeIORef x >>= \ () ->
readIORef x >>= print >>= \ () ->
readIORef y >>= print
0691デフォルトの名無しさん2015/02/25(水) 17:17:12.91ID:4X+FbhYD
あ、書き落としてたが、これらの関数・写像は
S → S なので、そのグラフはS×Sで、
つまり命令形の手続きはSの直積の部分集合と同一視できるということになる(というか数学的には同一)。
0692デフォルトの名無しさん2015/02/25(水) 17:18:00.41ID:4X+FbhYD
>>690
あ、そういう答えを要求してるんだったのか……
0693デフォルトの名無しさん2015/02/25(水) 20:03:19.53ID:zpTHLWvM
期待していたのは、>>689のほうの答えでした。いま熟読中です。
今の時点で気になっているのは、ここにある各演算毎の関数的定義は、
演算が置かれている場所や状態空間が少し変わると、同じ演算なのに
変わってしまうということはないのでしょうか?
例えば、状態空間の中にzが加わると、同じ演算の関数定義が変わってしまう
ということはないのでしょうか?
もしそうだとすると、命令型の手続きを純粋関数で書けるというのはやや
誤解を生じるのではないかと思うのですが。
0694デフォルトの名無しさん2015/02/25(水) 20:13:44.32ID:YonVottM
>>684
ありがとうございます
互換性に不安を抱えたまま開発を続けるのはつらいのでReflectionを使わない方法を模索することにします
0695デフォルトの名無しさん2015/02/25(水) 21:40:11.60ID:4X+FbhYD
>>693
>演算が置かれている場所や状態空間が少し変わると、同じ演算なのに
>変わってしまうということはないのでしょうか?

というか、逐次実行が関数合成になるように状態空間を定めるので、話は逆。
手続が内部で持ってる状態を全部引数に蓄積子として突っ込んでいけば
最終的に必ず純粋な関数になるので大丈夫、というだけの話ではあり。
0696デフォルトの名無しさん2015/02/25(水) 21:48:26.31ID:Slhdy+4b
>>693「もしそうだとすると」で前後が繋がってない。
各行は定義ではなく、具体的な状態Sが関数適用でどう変化しているかを述べていて、
>>688は説明を簡単にするためにxとyとターミナルの状態のみを扱っている

例えばx=1という式はx以外の変数やターミナルの状態を変えないから、
f1 <("x", _), vars, T > = <("x", 1), vars, T>
みたいに書ける。これならzをどこに入れようが定義は変わらない。
0697デフォルトの名無しさん2015/02/25(水) 22:52:25.07ID:zpTHLWvM
ということは、やはり>>677などがいうように、関数型と命令型を理論的に区別することは
できないということなのでしょうか
0698デフォルトの名無しさん2015/02/26(木) 01:10:29.61ID:XuDII8Li
関数型内部に命令型言語を作るのは難しくないが、逆は難しい。
しかし、それは人間的困難に過ぎないので、そこを捨象すれば
チューリングマシンとラムダ算法が等価であるというのとまったく同じ意味において、
両者は等価であり、区別することはできない。
0699デフォルトの名無しさん2015/02/26(木) 02:12:16.21ID:D8nkDIff
グローバル変数があるようなプログラムだって、その全てを変数として引き回すように変形すれば純粋関数的になっちゃう。
モナドは暗黙の状態引き渡しをやる仕組みと言えなくもないし、部分的には命令型的パラダイムを導入してるという考え方はできる。
0700デフォルトの名無しさん2015/02/26(木) 08:46:56.43ID:y/w7Kxu/
正直、現代情報技術はそろそろアルゴリズムから脱却しても良いのでは?
0701デフォルトの名無しさん2015/02/26(木) 10:19:14.44ID:WaBGyhy5
>>700
お前、毛の壁ナイズされ過ぎ。
0702デフォルトの名無しさん2015/02/26(木) 10:34:39.06ID:BNBT94Ul
知ってて使うのと知らんで使うのじゃ雲泥
0703デフォルトの名無しさん2015/02/26(木) 11:05:53.08ID:QQhjsWl0
だからモナドじゃなくIO型って言えよ。初学者には害悪にしかならん。
0704デフォルトの名無しさん2015/02/26(木) 11:15:19.32ID:btOYc4SG
[´・_ ← 尊敬するHaskellerの再就職決まったみたいでなにより
0705デフォルトの名無しさん2015/02/26(木) 11:31:19.10ID:dD65fmOl
1週間で初心者から脱却するみたいな考えが悪い
スポーツとかなら10年かかっても不思議ではないのに
0706デフォルトの名無しさん2015/02/26(木) 11:59:30.21ID:QQhjsWl0
だから何で馬鹿な方向に誘導してんだ馬鹿。モナドだから何がいいのか分かっているのか馬鹿。
「XはYである」と言うならYと見なした理由もちゃんと書け馬鹿。XをYと見なした時にどんだけ便利なのか書け馬鹿。
おめーは自然数を教えるのにチャーチ数を教えるのか馬鹿。
おめーは「脳はコンピュータと言える」とか言って脳の研究でコンピュータを調べるのか馬鹿。
そんな絶望的な馬鹿なら10年かかっても不思議じゃねーよ。
0707デフォルトの名無しさん2015/02/26(木) 12:00:51.61ID:btOYc4SG
>>705
早期教育が必要
0708デフォルトの名無しさん2015/02/26(木) 14:42:26.59ID:dD65fmOl
現代情報技術は嘘つきとか馬鹿とかがうようよしてるという前提で時間を見積もらないと
0709デフォルトの名無しさん2015/02/26(木) 21:35:55.82ID:+ZHOz+Fz
>>700

その通りだと思う。
しかしその具体的な動きはすでにあるのかな?

>>701

いや、Okabe氏は素晴らしいと思うよ。
彼にはもっともっと発信してほしい。
0710デフォルトの名無しさん2015/02/26(木) 22:40:22.30ID:u37SJBGi
haskell大好きおじさんて馬鹿ばっか
他の言語書いたことないやつとかhaskell語るなよ
0711デフォルトの名無しさん2015/02/27(金) 13:21:41.48ID:luo4R3jS
>>709
俺も俺も。ああいうキチガイ芸人にはもっと発信して欲しかった。Qiitaの運営も見る目がない。
0712デフォルトの名無しさん2015/02/27(金) 18:39:34.08ID:/mo2HZHK
プログラミング芸人か新ジャンル
0713デフォルトの名無しさん2015/02/27(金) 20:57:22.30ID:QBCyKoap
>>710
haskellやってる人で他の言語やった事ない人ってすごい少数派だと思うぞ
0714デフォルトの名無しさん2015/02/27(金) 21:55:00.85ID:6wGrZzep
FFIがある以上、Haskellが最初の言語でも最終的にはC/C++は必要になる
0715デフォルトの名無しさん2015/02/28(土) 07:19:37.54ID:dnl6aVQ8
SQLやcabalの質問に対するレスの少なさや、スノッブが好きそうな話題には食いつくあたりを見ると、
他言語はおろかhaskellを使っているかも怪しい。
0716デフォルトの名無しさん2015/02/28(土) 11:31:00.53ID:/a49nmDi
静的型付けのレスが少ないということは
本当はPython使ってるだろ
0717デフォルトの名無しさん2015/02/28(土) 12:00:03.72ID:lNsAK58t
Python 使ってて動的型楽だな&amp;#12316;&amp;#12316;静的だるいと思ってましたが Haskell に出会って改心しました
0718デフォルトの名無しさん2015/02/28(土) 12:18:51.86ID:d9oEn1cs
Haskellでアプリ書いてる人なんていないでしょ
0719デフォルトの名無しさん2015/02/28(土) 12:53:22.56ID:/a49nmDi
でもネイティブアプリを作れないやつよりはまともだよ
0720デフォルトの名無しさん2015/02/28(土) 14:57:14.27ID:WBmhRPKM
むしろ書き捨てるスクリプトの類をHaskellで書くことが殆どになった。
Parsecが激しく便利なのでやめられないし、グルー言語としても優秀。
後はふと思いついたことをプロトタイピングして試すのにとても便利。
モナドの中を除いてコードをどこにどういう順番で書いても大丈夫なのが地味に利く。
0721デフォルトの名無しさん2015/02/28(土) 17:21:51.10ID:+vurDehh
>>720
>後はふと思いついたことをプロトタイピングして試すのにとても便利。

ここは禿しく同意
0722デフォルトの名無しさん2015/02/28(土) 17:34:44.86ID:ww/ZmHX+
haskellって今盛り上がってるの?
0723デフォルトの名無しさん2015/02/28(土) 17:35:54.16ID:ww/ZmHX+
>>716
あのスレID付く前は勢いすごかったのにな
0724デフォルトの名無しさん2015/02/28(土) 17:37:41.63ID:0XiMknGf
>>722
n年前から「今年盛り上がる」って言われ続けてる
0725デフォルトの名無しさん2015/02/28(土) 20:20:30.25ID:4FBvatWb
盛り上がるっていうのが業務系システムやwebサービスの開発に使われるって意味なら、そんな日はまず来ないと思うよ
0726デフォルトの名無しさん2015/02/28(土) 20:27:53.14ID:Ywc+frof
とあるヘッジファンドのシステムがOCamlで作られているそうな
0727デフォルトの名無しさん2015/02/28(土) 20:51:48.98ID:0l2BG5kB
東京電力福島第一原子力発電所の事故では、緊急時の作業員の被ばく線量の上限の値が
急きょ引き上げられるなど、対応の不備が指摘されました。
この問題を話し合うシンポジウムが28日東京で開かれ、上限の引き上げや事前の同意の
必要性について意見が交わされました。

4年前の原発事故では、当初100ミリシーベルトとしていた緊急時の被ばく限度が収束作業に
支障が出るとして、事故の3日後、急きょ250ミリシーベルトに引き上げられました。
事故の6日後、政府はさらに国際機関が推奨している500ミリシーベルトへの引き上げを検討しましたが、
事故対応に当たった防衛省や警察庁からも反対の声が上がり、見送られました。
シンポジウムは放射線防護の専門家で作る日本保健物理学会が開き、東京電力の担当者は、
174人が100ミリシーベルトを超え、250ミリシーベルトを超えた作業員も6人いたことを報告し、
「引き上げがなければ作業はより難しかった」と話しました。
パネリストからは、「国際的な基準に合わせるべきだ」といった意見の一方、
「250ミリシーベルトも500ミリシーベルトも医学的な根拠となるデータが少なく、納得が得られるか疑問だ」
といった意見も出されました。
また、数字の議論だけでなく、事前に同意を得ることや、長期的な健康調査も重要な検討事項
だという指摘が出されていました。

作業員の被ばく限度について原子力規制委員会は、250ミリシーベルトへの引き上げを軸に、
事前の意思確認や教育などを事業者に求めていく方向で検討することにしています。

一方で、上限の引き上げについては労働者団体などが反対しているほか、
厚生労働省が慎重な姿勢を見せています。
原発事故以降、廃炉現場での被ばく対策を求めるなど、作業員の支援をしている東京労働安全衛生センターの
飯田勝泰事務局長は、「被ばくを余儀なくされる人たちが生涯背負う健康リスクに誰が責任を負うのか、
その後に生じるさまざまな問題に対してどれだけサポートや補償などがあるかを含めて、
当事者を交えて議論すべきだ」と訴えています。
0728デフォルトの名無しさん2015/02/28(土) 22:05:28.81ID:BICS2QXM
>>726
おいHaskellerを刺激するなよ
0729デフォルトの名無しさん2015/02/28(土) 23:57:43.09ID:Nt6Wj8CT
ヘッジファンドとか、虚業の世界で使われていると聞いても嬉しくない。
0730デフォルトの名無しさん2015/03/01(日) 00:00:10.61ID:fa5PZpFW
しかし、現在の東大のトップクラスの人材はゴールドマン・サックスみたいな外資系投資銀行か
ヘッジファンドに就職するもんだよ。
0731KenOkabe2015/03/01(日) 00:24:52.20ID:pyXXwOct
知ったかぶりしかできない生半可通の巣窟スレ
0732デフォルトの名無しさん2015/03/01(日) 12:33:53.88ID:V/GWmw6D
例えばこのような型クラスとそのインスタンス型があるとします。

class ABC t where
 abc :: t -> IO Int

data X = 何か
instnce ABC X where
 abc x = 何か

アプリケーションの本番環境ではこれでいいのですが、
この型Xの値を使う環境の方をデバッグしたりテストする場合に問題が起きました。

abc関数をX型の値に適用したとき、戻り値を以前戻した値に基づいて計算したいとか、
適用する度に予め用意したリストから順に値を戻したいという場合があります。

例えば初めての適用なら5::IO Intを、2回目の適用なら13::IO Intを戻したいとか。
前回10::IO Intを戻したなら、今回はerror関数を使って例外を投げるとか。
状態を保存しないとできないことです。

このようなことが本番環境でも必要なら、ABC型クラスの定義を例えば下記のように変え、

class ABC t where
 abc :: t -> IO (Int, t)

X型の値の中に状態を保存するようにします(要はMap型などと同じやり方です)。

しかし、今回はデバッグやテストのためだけです。
そのためだけに全体のアーキテクチャを変えてしまうのは如何なものかとも思うのですが、
デバッグやテスト優先で変えるべきでしょうか。
それとも、関数を使用する側は変えなくても良い、
あるいは変えるとしても些細な修正ですむ方法があるでしょうか。
0733デフォルトの名無しさん2015/03/01(日) 12:46:43.60ID:FWNFrpmY
type synonym とか?
0734デフォルトの名無しさん2015/03/01(日) 13:21:28.34ID:OeCCJL5w
>>732
unsafePerformIO使う(というかまさに使いドコロ)。
0735デフォルトの名無しさん2015/03/01(日) 14:22:17.54ID:y+77PkOT
global_abc = unsafePerformIO (newIORef [5, 13])
abc x = do{(y:ys)<-readIORef global_abc; writeIORef global_abc ys; return y}
0736デフォルトの名無しさん2015/03/01(日) 15:10:50.59ID:V/GWmw6D
>>734 >>735
デバッグやテストが目的なら躊躇せずSystem.IO.Unsfe系を使いましょうと言うことですか。

本番環境ではさすがに使いたくないですが、本番環境を汚さずにデバッグやテストするのが目的なら、
悩んで複雑な仕組みを構築するより、気をつけてUnsafe系を使う方法を考えた方が建設的てすね。

アドバイスありがとうございます。


>>733
どういうことでしょうか。
0737デフォルトの名無しさん2015/03/01(日) 15:42:52.81ID:YT+HWRLq
abc : t -> IO Intからabct : t -> IO (Int, t)を作ればいいんじゃないかと思うんだけど駄目なのか
abct t = do
0738デフォルトの名無しさん2015/03/01(日) 15:45:51.87ID:YT+HWRLq
途中で送っちゃった
abct t = do
r <- abc t
return (r, t)
0739デフォルトの名無しさん2015/03/01(日) 17:59:38.32ID:V/GWmw6D
>>738

>>732でも言いましたが、本番環境でも状態を保存する必要があるのなら
私も迷わずその方法を採用したいと思います。

しかし、今回はデバッグやテストのためたけの仕組みです。
abc関数を使用する(呼ぶ)側にはあまり手を着けたくないというのが正直なところです。
多少修正する程度でしたらまだいいのですが、戻り値で状態を返し、
関数の呼び出し側でそれを保持するとなると、アプリケーションの作り方にまで影響が及びます。

できればそれはちょっと避けたいな、と。
0740デフォルトの名無しさん2015/03/01(日) 18:02:35.56ID:DwkMIW7d
モナドの出番では
Writerモナドとか
0741デフォルトの名無しさん2015/03/01(日) 19:28:30.37ID:YT+HWRLq
>>739
デバッグ用テスト用のファイル/モジュールでt -> IO (Int, t)を返す関数を定義すれば本番用のコードを汚さないよ?
0742デフォルトの名無しさん2015/03/01(日) 19:54:14.26ID:2wRYmT3l
MonadIOにしとけば困らなかったのに
0743デフォルトの名無しさん2015/03/01(日) 22:48:32.59ID:V/GWmw6D
>>741
後出しじゃんけんのようで本当にすいません。
結局やりたいのはこういうことです。

本番環境
ModuleA
  ABCクラスのインスタンス型の値を使う
ModuleB
  ABCクラスの定義(abc :: t -> IO Int)
ModuleC
  ABCクラスのインスタンス型Xの定義
ModuleD
  ABCクラスのインスタンス型Yの定義

テストやデバッグ用
ModuleX
  ModuleAの関数のテストやデバッグのために
  ABCクラスのインスタンス型Zの定義
  要するにスタブとかダミーみたいなもの
  ただし、状態を保ちたい

ABCクラスのインスタンス型の値の状態を保つことは、
本番環境では不要なことなんです。
状態を保たなくてもアプリケーションの処理は問題なく回ります。
本番環境に無くても良い余計な処理は入れたくないです。

ModuleAから呼ぶ関数はModuleBで定義したABCクラスのabc関数であって、
>>738のabct関数をModuleXで定義しても、ModuleAからは呼ばれません。

トンチンカンなことを言っていたらごめんなさい。
0744デフォルトの名無しさん2015/03/01(日) 23:04:42.28ID:V/GWmw6D
>>740
Writer Int型を使うということでしょうか。
今回の目的を達成するためにはどのように使えばよいか考えてみましたが、
すいません、よく分かりませんでした。
どのように使えばよいのでしょうか。

>>742
こちらも、どのように使えば目的が達成できるか、分かりませんでした。


お二人とも、簡単な例を示していただけると助かります。
0745デフォルトの名無しさん2015/03/02(月) 00:13:52.37ID:6Ba1RdPX
>>732
すいません、これがマズい言い方でした。

> アプリケーションの本番環境ではこれでいいのですが、
> この型Xの値を使う環境の方をデバッグしたりテストする場合に問題が起きました。

これでは、型Xを使う側は本番環境ではないように聞こえますね。

ここで言いたかったことは>>743の前半の状況です。
紛らわしくてごめんなさい。
0746デフォルトの名無しさん2015/03/02(月) 01:22:46.34ID:Sw+/g9Qu
>本番環境に無くても良い余計な処理は入れたくないです。

例えばnewが不要な所ではstatic変数を使いたいとか
たまにそういう人いるよね
0747デフォルトの名無しさん2015/03/02(月) 06:52:05.12ID:6Ba1RdPX
>>746
良くないことでしょうか。
0748デフォルトの名無しさん2015/03/02(月) 07:15:11.30ID:IugrOvyf
二分木定義から二分探索木作りたのですが教えていただけませんか
data BinTree = Empty | Node{val :: a, left :: BinTree a, right :: BinTree a} deriving Show
newtype BinSrchTree a = BinTree a deriving (Show, Eq, Ord)
main = print (Empty :: BinSrchTree Int) --BinSrchTree IntがBinTree a0に一致しない言われる
0749デフォルトの名無しさん2015/03/02(月) 09:57:42.00ID:oxqFLeZk
data BinTree a = Empty | Node{val :: a, left :: BinTree a, right :: BinTree a} deriving Show
newtype BinSrchTree a = BS (BinTree a) deriving Show
main = print (BS Empty :: BinSrchTree Int)

ghci> main
BS Empty
0750デフォルトの名無しさん2015/03/02(月) 10:08:38.53ID:IugrOvyf
なるほどコンストラクタ見落としていました
ありがとうございます
0751デフォルトの名無しさん2015/03/02(月) 11:04:53.22ID:Sw+/g9Qu
>>747
static変数というかグローバル変数は
引数や戻り値の型を無視してデータの受け渡しをするので型システムにとっては悪い
■ このスレッドは過去ログ倉庫に格納されています