関数型プログラミング言語Haskell Part27_©5ch.io
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん 転載ダメ©2ch.net
2015/01/08(木) 21:02:35.67ID:IQPOX3u7haskell.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特別なことはなにも言ってないw
純粋な関数とは数学的意味での関数ということ。
表現から値が一意に決まる。
>>645
わからないのか?
>>651
何を言ってるの?
0653デフォルトの名無しさん
2015/02/22(日) 12:47:55.99ID:nNPYfFU0もし弱者のふりをする強者がいたとしも考えを変えるべきではない
弱者のふりをする強者は、弱者を助ける政策を変えさせようとするテロリストだから
0654デフォルトの名無しさん
2015/02/22(日) 13:29:41.18ID:0njaRTk3xを入力するとxがそのまま帰ってくる関数(?)しか思いつかない
0655デフォルトの名無しさん
2015/02/22(日) 13:34:08.70ID:jAanobMm0656デフォルトの名無しさん
2015/02/22(日) 13:37:05.55ID:zFsBha6g出力や破壊的代入は非決定性とは関係ないだろうね
0657デフォルトの名無しさん
2015/02/22(日) 13:51:59.84ID:zFsBha6g作用なんて概念がどこで必要になるか考えてみ
0658デフォルトの名無しさん
2015/02/22(日) 13:57:27.04ID:0njaRTk3数学的意味でっていうのも含めて関数の時点で作用があるとしか思えないので
ぜひ作用のない関数の例を教えてほしい
0659デフォルトの名無しさん
2015/02/22(日) 14:01:23.55ID:0njaRTk3この言葉の定義が違うのかな?
0660デフォルトの名無しさん
2015/02/22(日) 14:33:32.11ID:nNPYfFU0入力は IO a
出力は a -> IO ()
この IO () は型引数がいらないのでMonadである必要はなくてMonoidでもよかった
0662デフォルトの名無しさん
2015/02/22(日) 16:22:49.66ID:qqnO2/LEそれ別のところでやってくんない?
haskellと関係ないし
0663デフォルトの名無しさん
2015/02/22(日) 16:33:25.93ID:PSZ9BlISとやってもインストールされないパッケージがある。
作業の流れはこう。
$ 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書き忘れたが、*.cabal ファイルの build-depends に書いた他のパッケージ、
たとえば test-framework-quickcheck などはちゃんとインストールされた。
test-frmework-hunit だけがインストールされない。
0665デフォルトの名無しさん
2015/02/22(日) 16:51:49.20ID:PSZ9BlIS自己解決した。
cabal install の方にも --enable-tests オプションがいるのか。
流れをぶった切ってすまんかった。
議論を続けてくれ。
0666デフォルトの名無しさん
2015/02/22(日) 18:38:37.57ID:zFsBha6g純粋な関数にとって、ここの「変換する」、「作用」は余計な言葉だね
0667デフォルトの名無しさん
2015/02/22(日) 23:06:21.86ID:+tjqckF6数値は通常、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:XYitOeCr0670デフォルトの名無しさん
2015/02/23(月) 20:41:44.57ID:l7nfI0Hl0671デフォルトの名無しさん
2015/02/23(月) 23:05:43.29ID:QYJUtpb40672デフォルトの名無しさん
2015/02/23(月) 23:33:39.87ID:8CPFjaoD世界で、あるいは日本で話題になっているものは残念ながら知らないが、
今自分の中でホットなのは Reflection。
Haskell でモックを作れないかと調べてたら、こんなのがあった。
http://blog.nonowarn.jp/post/184938189/mocking-in-haskell-with-reflection-type-class
古いネタだけどね。
0673デフォルトの名無しさん
2015/02/23(月) 23:46:23.43ID:8CPFjaoDちなみに、私はモックをきっかけに reflection を知ったが、
このライブラリ自体はかなり凄いことをやってのけてて、
応用(適用)範囲も広いと思う。
http://cx4a.org/posts/2014-06-03-solve-the-configurations-problem-for-haskell.html
0674デフォルトの名無しさん
2015/02/24(火) 00:00:19.36ID:2W8BrWDD仕組みは分からんけどおもしろいアプローチだね
0675デフォルトの名無しさん
2015/02/24(火) 00:09:48.65ID:sS4fe1naこれHaskellの仕様外なのでGHCの実装が変わったら使えなくなるということはありませんか?
0676デフォルトの名無しさん
2015/02/24(火) 03:27:43.34ID:8m2gPI9oわかってないのかもしらんが、>>668のような事情があるから
Haskellの内部で命令型言語を容易に再発明できるのだよ。
0677デフォルトの名無しさん
2015/02/24(火) 08:03:23.82ID:S2pCR91J関数型言語は命令型言語、命令型言語は関数型言語
0678デフォルトの名無しさん
2015/02/24(火) 08:28:54.89ID:UvByGB8V0679デフォルトの名無しさん
2015/02/24(火) 08:59:18.55ID:XZZcWcPm0680デフォルトの名無しさん
2015/02/24(火) 17:54:38.62ID:DnqBFQEeFunctorもApplicativeも関数→データ→返り値なのに何でMonadだけデータ→関数→返り値なの?
0681デフォルトの名無しさん
2015/02/24(火) 18:08:03.66ID:Qwy2iHqI> >>=って引数の順序逆じゃね?
なんでだろうね
逆がいいなら =<< もあるが
0682デフォルトの名無しさん
2015/02/24(火) 18:55:37.66ID:8m2gPI9o>何でMonadだけデータ→関数→返り値なの?
関数を後ろにしないとラムダ式のネストを連鎖させて書きにくいからだろう。
0683デフォルトの名無しさん
2015/02/24(火) 20:29:32.00ID:9OYj7FQ20684デフォルトの名無しさん
2015/02/24(火) 21:18:59.73ID:Egwh0d/F使えなくなるかもね。
ただ、reflection パッケージはつい最近も更新されてはいる。
命令型言語のグローバル変数のようなことがしたいのなら、
ghc の言語拡張 ImplicitParams というのもある。
0685デフォルトの名無しさん
2015/02/25(水) 11:25:52.12ID:EI9coWAt純粋な関数の作用は「値を返すこと」だよ。Haskellでは「普通の意味では値を返さない」関数も ()::()を返すことによって
形式上は値を返す。
0686デフォルトの名無しさん
2015/02/25(水) 11:30:47.69ID:EI9coWAtある値に次々と関数を適用する場面を考える。最初の値を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>>676
>>677
>>679
例えば、
x=1; y=2; x=x+y; print x; print y
という命令型プログラムを純粋関数で書くと
どうなるのでしょうか
0689デフォルトの名無しさん
2015/02/25(水) 17:10:15.53ID:4X+FbhYDメモリの値とターミナルの状態という機械状態を
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:GkGCDPjknewIORef 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+FbhYDS → S なので、そのグラフはS×Sで、
つまり命令形の手続きはSの直積の部分集合と同一視できるということになる(というか数学的には同一)。
0692デフォルトの名無しさん
2015/02/25(水) 17:18:00.41ID:4X+FbhYDあ、そういう答えを要求してるんだったのか……
0693デフォルトの名無しさん
2015/02/25(水) 20:03:19.53ID:zpTHLWvM今の時点で気になっているのは、ここにある各演算毎の関数的定義は、
演算が置かれている場所や状態空間が少し変わると、同じ演算なのに
変わってしまうということはないのでしょうか?
例えば、状態空間の中にzが加わると、同じ演算の関数定義が変わってしまう
ということはないのでしょうか?
もしそうだとすると、命令型の手続きを純粋関数で書けるというのはやや
誤解を生じるのではないかと思うのですが。
0694デフォルトの名無しさん
2015/02/25(水) 20:13:44.32ID:YonVottMありがとうございます
互換性に不安を抱えたまま開発を続けるのはつらいのでReflectionを使わない方法を模索することにします
0695デフォルトの名無しさん
2015/02/25(水) 21:40:11.60ID:4X+FbhYD>演算が置かれている場所や状態空間が少し変わると、同じ演算なのに
>変わってしまうということはないのでしょうか?
というか、逐次実行が関数合成になるように状態空間を定めるので、話は逆。
手続が内部で持ってる状態を全部引数に蓄積子として突っ込んでいけば
最終的に必ず純粋な関数になるので大丈夫、というだけの話ではあり。
0696デフォルトの名無しさん
2015/02/25(水) 21:48:26.31ID:Slhdy+4b各行は定義ではなく、具体的な状態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できないということなのでしょうか
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お前、毛の壁ナイズされ過ぎ。
0702デフォルトの名無しさん
2015/02/26(木) 10:34:39.06ID:BNBT94Ul0703デフォルトの名無しさん
2015/02/26(木) 11:05:53.08ID:QQhjsWl00704デフォルトの名無しさん
2015/02/26(木) 11:15:19.32ID:btOYc4SG0705デフォルトの名無しさん
2015/02/26(木) 11:31:19.10ID:dD65fmOlスポーツとかなら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早期教育が必要
0708デフォルトの名無しさん
2015/02/26(木) 14:42:26.59ID:dD65fmOl0709デフォルトの名無しさん
2015/02/26(木) 21:35:55.82ID:+ZHOz+Fzその通りだと思う。
しかしその具体的な動きはすでにあるのかな?
>>701
いや、Okabe氏は素晴らしいと思うよ。
彼にはもっともっと発信してほしい。
0710デフォルトの名無しさん
2015/02/26(木) 22:40:22.30ID:u37SJBGi他の言語書いたことないやつとかhaskell語るなよ
0711デフォルトの名無しさん
2015/02/27(金) 13:21:41.48ID:luo4R3jS俺も俺も。ああいうキチガイ芸人にはもっと発信して欲しかった。Qiitaの運営も見る目がない。
0712デフォルトの名無しさん
2015/02/27(金) 18:39:34.08ID:/mo2HZHK0713デフォルトの名無しさん
2015/02/27(金) 20:57:22.30ID:QBCyKoaphaskellやってる人で他の言語やった事ない人ってすごい少数派だと思うぞ
0714デフォルトの名無しさん
2015/02/27(金) 21:55:00.85ID:6wGrZzep0715デフォルトの名無しさん
2015/02/28(土) 07:19:37.54ID:dnl6aVQ8他言語はおろかhaskellを使っているかも怪しい。
0716デフォルトの名無しさん
2015/02/28(土) 11:31:00.53ID:/a49nmDi本当はPython使ってるだろ
0717デフォルトの名無しさん
2015/02/28(土) 12:00:03.72ID:lNsAK58t0718デフォルトの名無しさん
2015/02/28(土) 12:18:51.86ID:d9oEn1cs0719デフォルトの名無しさん
2015/02/28(土) 12:53:22.56ID:/a49nmDi0720デフォルトの名無しさん
2015/02/28(土) 14:57:14.27ID:WBmhRPKMParsecが激しく便利なのでやめられないし、グルー言語としても優秀。
後はふと思いついたことをプロトタイピングして試すのにとても便利。
モナドの中を除いてコードをどこにどういう順番で書いても大丈夫なのが地味に利く。
0721デフォルトの名無しさん
2015/02/28(土) 17:21:51.10ID:+vurDehh>後はふと思いついたことをプロトタイピングして試すのにとても便利。
ここは禿しく同意
0722デフォルトの名無しさん
2015/02/28(土) 17:34:44.86ID:ww/ZmHX+0723デフォルトの名無しさん
2015/02/28(土) 17:35:54.16ID:ww/ZmHX+あのスレID付く前は勢いすごかったのにな
0724デフォルトの名無しさん
2015/02/28(土) 17:37:41.63ID:0XiMknGfn年前から「今年盛り上がる」って言われ続けてる
0725デフォルトの名無しさん
2015/02/28(土) 20:20:30.25ID:4FBvatWb0726デフォルトの名無しさん
2015/02/28(土) 20:27:53.14ID:Ywc+frof0727デフォルトの名無しさん
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おいHaskellerを刺激するなよ
0729デフォルトの名無しさん
2015/02/28(土) 23:57:43.09ID:Nt6Wj8CT0730デフォルトの名無しさん
2015/03/01(日) 00:00:10.61ID:fa5PZpFWヘッジファンドに就職するもんだよ。
0731KenOkabe
2015/03/01(日) 00:24:52.20ID:pyXXwOct0732デフォルトの名無しさん
2015/03/01(日) 12:33:53.88ID:V/GWmw6Dclass 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:FWNFrpmY0734デフォルトの名無しさん
2015/03/01(日) 13:21:28.34ID:OeCCJL5wunsafePerformIO使う(というかまさに使いドコロ)。
0735デフォルトの名無しさん
2015/03/01(日) 14:22:17.54ID:y+77PkOTabc x = do{(y:ys)<-readIORef global_abc; writeIORef global_abc ys; return y}
0736デフォルトの名無しさん
2015/03/01(日) 15:10:50.59ID:V/GWmw6Dデバッグやテストが目的なら躊躇せずSystem.IO.Unsfe系を使いましょうと言うことですか。
本番環境ではさすがに使いたくないですが、本番環境を汚さずにデバッグやテストするのが目的なら、
悩んで複雑な仕組みを構築するより、気をつけてUnsafe系を使う方法を考えた方が建設的てすね。
アドバイスありがとうございます。
>>733
どういうことでしょうか。
0737デフォルトの名無しさん
2015/03/01(日) 15:42:52.81ID:YT+HWRLqabct t = do
0738デフォルトの名無しさん
2015/03/01(日) 15:45:51.87ID:YT+HWRLqabct t = do
r <- abc t
return (r, t)
0739デフォルトの名無しさん
2015/03/01(日) 17:59:38.32ID:V/GWmw6D>>732でも言いましたが、本番環境でも状態を保存する必要があるのなら
私も迷わずその方法を採用したいと思います。
しかし、今回はデバッグやテストのためたけの仕組みです。
abc関数を使用する(呼ぶ)側にはあまり手を着けたくないというのが正直なところです。
多少修正する程度でしたらまだいいのですが、戻り値で状態を返し、
関数の呼び出し側でそれを保持するとなると、アプリケーションの作り方にまで影響が及びます。
できればそれはちょっと避けたいな、と。
0740デフォルトの名無しさん
2015/03/01(日) 18:02:35.56ID:DwkMIW7dWriterモナドとか
0741デフォルトの名無しさん
2015/03/01(日) 19:28:30.37ID:YT+HWRLqデバッグ用テスト用のファイル/モジュールでt -> IO (Int, t)を返す関数を定義すれば本番用のコードを汚さないよ?
0742デフォルトの名無しさん
2015/03/01(日) 19:54:14.26ID:2wRYmT3l0743デフォルトの名無しさん
2015/03/01(日) 22:48:32.59ID:V/GWmw6D後出しじゃんけんのようで本当にすいません。
結局やりたいのはこういうことです。
本番環境
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/GWmw6DWriter Int型を使うということでしょうか。
今回の目的を達成するためにはどのように使えばよいか考えてみましたが、
すいません、よく分かりませんでした。
どのように使えばよいのでしょうか。
>>742
こちらも、どのように使えば目的が達成できるか、分かりませんでした。
お二人とも、簡単な例を示していただけると助かります。
0745デフォルトの名無しさん
2015/03/02(月) 00:13:52.37ID:6Ba1RdPXすいません、これがマズい言い方でした。
> アプリケーションの本番環境ではこれでいいのですが、
> この型Xの値を使う環境の方をデバッグしたりテストする場合に問題が起きました。
これでは、型Xを使う側は本番環境ではないように聞こえますね。
ここで言いたかったことは>>743の前半の状況です。
紛らわしくてごめんなさい。
0746デフォルトの名無しさん
2015/03/02(月) 01:22:46.34ID:Sw+/g9Qu例えばnewが不要な所ではstatic変数を使いたいとか
たまにそういう人いるよね
0747デフォルトの名無しさん
2015/03/02(月) 06:52:05.12ID:6Ba1RdPX良くないことでしょうか。
0748デフォルトの名無しさん
2015/03/02(月) 07:15:11.30ID:IugrOvyfdata 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:oxqFLeZknewtype 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+/g9Qustatic変数というかグローバル変数は
引数や戻り値の型を無視してデータの受け渡しをするので型システムにとっては悪い
■ このスレッドは過去ログ倉庫に格納されています