関数型プログラミング言語Haskell Part29 [転載禁止]©5ch.io
■ このスレッドは過去ログ倉庫に格納されています
0001岡部メモリリーク健
2015/07/14(火) 19:27:09.01ID:jJ1YDtNe,.-―: ̄`ー::::::::::、
/::::::::::::.::::::::::::::::::::::::::::`::、、
/::::::::::::::::::::::::::::::::::::::::::::::::::::::`、
l::::::::::::::::::::::::::::::::::::::::;':l:::::::::::\::l
l:::::::::::::::::::::::::::::::::,,::::::::;-,:,::::::::::::::::l
l::::::::::::::::,_,.::::,';::::::;:::::: :: l ::::::::::::::l
l::::::::::/-/:::/-ニ,.::::/=,./::::::::::l
ヽ:::: ´、ひ> ;: l .<ひ>' 、::::::::/
ヽ:::::  ̄ .)::; l  ̄ l::::/ < 毛の壁(岡部健)の話は禁止な
、:::::.. /:::; .,-、 l:::/、
,―:::::::: ゝヽ- ー' 、 l::/,、ヽ
l,、,、,,:、:: / ,--、,-.、_ l /::::::,、,、l
l,、,、,、,、,、::、 `ー ̄-' /:::::::::::,、,、l
l,、,、,、,、,、,、::ヽ /::::::::、,、,、,、,ノ:\
haskell.org (公式サイト)
http://www.haskell.org/
前スレ
関数型プログラミング言語Haskell Part28
http://peace.2ch.net/test/read.cgi/tech/1428535861/
0412デフォルトの名無しさん
2015/08/31(月) 00:21:09.78ID:VGvD8wHtdata Umai a = Umai { defaultLevel :: Int,
season :: Season}
data Season = Spring | Summer | Autumn | Winter deriving Eq
data Nasu
data Tomato
class Level a where level :: a -> Int
instance Level (Umai Nasu) where level = defaultLevel * 100
instance Level (Umai Tomato) where level = defaultLevel * (liftA (== Summer) season ?) 200 100
{--
> level (Umai 1 Summer :: Umai Nasu)
100
> level (Umai 1 Summer :: Umai Tomato)
200
> level (Umai 2 Summer :: Umai Tomato)
400
--}
0413412
2015/08/31(月) 00:22:07.09ID:VGvD8wHt{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE FlexibleInstances,TypeFamilies #-}
module Main where
import Control.Applicative
(412の中身)
instance Num n => Num (a -> n) where
(+)= liftA2 (+)
(-) = liftA2 (-)
(*) = liftA2 (*)
abs = liftA abs
signum = liftA signum
fromInteger = const . fromInteger
class Conditional q a where
type ConditionalExec q a
(?) :: q -> ConditionalExec q a -> ConditionalExec q a -> ConditionalExec q a
infixr 1 ?
instance Conditional Bool a where
type ConditionalExec Bool a = a
(?) b x y = if b then x else y
instance Conditional (a -> Bool) b where
type ConditionalExec (a -> Bool) b = a -> b
(?) = liftA3 (?)
main :: IO ()
main = print $ level (Umai 1 Spring :: Umai Tomato)
0414デフォルトの名無しさん
2015/08/31(月) 20:29:14.75ID:YNC36to9ありがとうございます。
そのままでは使えないのですが、考え方を参考にさせていただき、応用してみます。
ちなみに、さすがに Umai 型クラスにも、Nasu データ型にも手を加えずに実現する方法はないですよね。
0415デフォルトの名無しさん
2015/08/31(月) 21:06:33.97ID:BIyPIWGf手を加えてはならない場所に書くのはリスクが大きすぎる
0416デフォルトの名無しさん
2015/08/31(月) 21:21:39.09ID:YNC36to9すいません、そういう意味ではなくて、
Umai 型クラスに相当するものがライブラリで提供されていて、
こちらでは手が加えられないのです。
もし方法がないなら、ライブラリのソースはあるので、
アドバイスを参考に改変しようかと思います。
0417デフォルトの名無しさん
2015/09/02(水) 01:39:18.87ID:MPctfeu00418デフォルトの名無しさん
2015/09/02(水) 23:39:30.67ID:VgKb5GV5なんで君はいつも上目線なんだ
0419デフォルトの名無しさん
2015/09/03(木) 05:35:30.84ID:OYAV2gHU0420デフォルトの名無しさん
2015/09/04(金) 12:32:49.27ID:5HbwgMaM0421デフォルトの名無しさん
2015/09/04(金) 17:36:40.07ID:KCyhzv120422デフォルトの名無しさん
2015/09/04(金) 21:44:05.44ID:Ziq//RxQ対策
1.諦める
2.共有ライブラリを使う
from : ttp://downloads.haskell.org/~ghc/7.10.2/docs/html/users_guide/using-shared-libs.html
>4.13.1. Building programs that use shared libraries
>
>To build a simple program and have it use shared libraries for the runtime system and the base libraries use the -dynamic flag:
>
>ghc --make -dynamic Main.hs
0423デフォルトの名無しさん
2015/09/05(土) 17:50:27.56ID:zbNENDxsまず下記の関数を定義しました。
siplus :: String ->Int -> Int
siplus str num = read(str) + num
普通に使うと次のように動作します。
> siplus "1" 2
> 3
最初のStringを部分適用したものの型を調べると、こうなります。
> :t siplus "1"
> siplus "1" :: Int -> Int
ここで最初のStringではなく、2つ目のIntを部分適用したいと思った時、
例えばこんな書き方はできません。
> :t siplus _ 2
> エラー
しかしこれを中置関数として扱った場合、2つ目のIntのみを部分適用した
関数を作ることができてしまいます。
> :t (`siplus` 2)
> (`siplus` 2) :: String -> Int
これは一体どういうことなのでしょうか?
String -> Int -> Intの関数への部分適用でString -> Intの関数を作り出せてしまうのは、
カリー化の考え方から見て矛盾があると思います。
どういう理屈でこれは成り立っているのでしょうか?
0424デフォルトの名無しさん
2015/09/05(土) 18:08:50.90ID:NPRaO0u1普通の部分適用と区別して「セクション」と呼ばれている。
いずれにせよ、実体は (¥str -> siplus str 2) のようなラムダ式作るのと変わらん。
0425デフォルトの名無しさん
2015/09/05(土) 18:33:26.79ID:zbNENDxsなるほど、つまり中置記法の右側に値を置いたものは、
カリー化とは無関係で単にラムダの糖衣構文ってことなんですね。
0426デフォルトの名無しさん
2015/09/05(土) 18:40:53.83ID:NPRaO0u10427デフォルトの名無しさん
2015/09/06(日) 00:53:10.15ID:wfrbDpC50428デフォルトの名無しさん
2015/09/06(日) 08:00:48.38ID:SMmxtXxm1+が綺麗に書けるけど、そんなにこだわる機能じゃないと思う
むしろ二項演算子無くして前置に統一したほうがよく無いかな?
0429デフォルトの名無しさん
2015/09/06(日) 08:29:11.83ID:wfrbDpC5a * x + b
なんてのをまともに書けない言語はアカンでしょ
0430デフォルトの名無しさん
2015/09/06(日) 08:41:14.99ID:SMmxtXxm>a * x + b
つ (+ (* a x) b)
0431デフォルトの名無しさん
2015/09/06(日) 09:30:37.52ID:wfrbDpC5そういうのが好きならLisp使えばいいじゃん。。。
0432デフォルトの名無しさん
2015/09/06(日) 09:44:06.70ID:Vj9nK5xCそれは嘘です
後置演算子の直後の二項演算子はセーフ x! * y
二項演算子の直後の二項演算子はアウト x + * y
>>419
「本当か嘘か」を優先して考え「謙虚か傲慢か」などという雑念は捨てました
0433デフォルトの名無しさん
2015/09/06(日) 09:45:15.82ID:OmMBsRo+0434デフォルトの名無しさん
2015/09/06(日) 10:14:27.94ID:wfrbDpC5うーん、その例と「二項演算子は結合強度最弱の単項後置演算子とみなせる」
がどう矛盾するのかよくわからないです。
0435デフォルトの名無しさん
2015/09/06(日) 10:31:40.00ID:Vj9nK5xC結合強度を変えてもsyntax errorを覆すことはできません
0436デフォルトの名無しさん
2015/09/06(日) 10:59:37.29ID:wfrbDpC5x + * y
によってあなたが何を例示したのか正直まったく理解できないのです。
元ネタは外国のブログ記事だった気がするけど見つからないので自己流解説すると、
なんか二項演算子(算術に限らない。ここでは (#) とする。)があって、そのシグネチャは
(#) :: X -> Y -> Z
だとしますね。そうすると x : X に対して作られるセクション x # は Y -> Z という型を持つわけですね。
そうすると、結局「あたかも」
postfix #
(#) :: X -> (Y->Z)
と定義されていた「かのごとく」見れますねという話をしてるつもりです。
(Haskellでは自前の後置演算子は作れないので上のは嘘コードですが)。
0437デフォルトの名無しさん
2015/09/06(日) 17:00:24.15ID:Vj9nK5xCところが構文解析を見ると二項演算が存在する証拠が出てきたので理解できないと
0438デフォルトの名無しさん
2015/09/06(日) 20:34:02.72ID:2q2onHzVちょっと上のレスに出てるように二項演算子だと
# x
っていうように後ろの引数だけ適用もできることになってるからこれは後置単項演算子とは別物だよね
0439デフォルトの名無しさん
2015/09/07(月) 06:23:10.52ID:+vVUVgP4実装の話じゃないから困らないよな?と言われて困ることはある
{-# LANGUAGE #-} とか
0440デフォルトの名無しさん
2015/09/07(月) 21:31:00.77ID:mXAJW74Lに対して
構文解析では二項演算子が分けてあるんだよ
と言われても はあそうですか としかならないがな
なぜ構文解析上分けてあるかの理由まで示されると納得しそうだが
0441デフォルトの名無しさん
2015/09/07(月) 23:06:47.81ID:+gBmAsnfApplicativeスタイルを使うときに出てくる「途中の式」はそうやって考えるとわかりやすいね。
0442デフォルトの名無しさん
2015/09/07(月) 23:35:52.84ID:saV1gx5W今日はじめて知ったんだが、実は出来るぜ。
{-# LANGUAGE PostfixOperators #-}
data Currency = Yen Int deriving Show
(¥) :: Int -> Currency
(¥) = Yen
main = print (105 ¥)
{--
> :main
Yen 105
--}
0443デフォルトの名無しさん
2015/09/08(火) 00:02:16.96ID:FdaSRh76それが後置演算子だとすると
(2 +)と(+ 2) で(+)が別の演算子だということになってしまう。
数式の構文解析で(-)が単項演算子と二項演算子の両方に使われるせいで
BNFが無駄に複雑化するの知ってるでしょ?
同じことが(-)だけでなく二項演算子一般について大規模に生じてイヤなわけ。
0444デフォルトの名無しさん
2015/09/08(火) 04:52:37.64ID:5w88oMs5構文は理由より人気を優先した方がいい
どんな理由を示してもおそらくライバルの1.05倍くらいのメリットしか出てこない
一方、理屈抜きで人気投票すれば1000倍とか差がつく可能性がある
0445デフォルトの名無しさん
2015/09/08(火) 21:51:21.00ID:1BhJxNoGっていう話をよく聞くけど、納得いかない。
例えばMaybeモナドの中に値を入れても、fromJustで簡単に取り出せるし、
入れる時もJustで簡単に入るじゃん。
こんなユルユルの箱に入れたところで何が安全なの?
0446デフォルトの名無しさん
2015/09/08(火) 22:00:09.71ID:KAkZMLHa(IO は別)
0447デフォルトの名無しさん
2015/09/08(火) 22:03:02.01ID:gWCBxnxw箱の喩えでいうなら、その箱から中身を取り出したままでいられる仕組みは
モナドの範疇ではないよ。
Monad 型クラスのインスタンスであるその型に付随された
モナドとは何の関係もない機能だ。
0448デフォルトの名無しさん
2015/09/08(火) 22:04:03.13ID:FdaSRh76>「モナドは値を箱の中に入れるので外からは見えない、だから安全だ」
>っていう話をよく聞くけど、
そんな話を聞いた覚えがないのだが……
0449デフォルトの名無しさん
2015/09/08(火) 22:11:56.24ID:CPV+4Ywq安全だって言ってる文献を教えて欲しい
0450デフォルトの名無しさん
2015/09/08(火) 22:15:43.73ID:1BhJxNoGでも取り出す機能を簡単に付けられるのであれば、箱としての堅牢性は無いに等しいじゃん。
一回入れたらもう出せない!ってのならわかるけど。
>>448-449
IOモナドなんかそんな風に言われるじゃん。
でもIOモナドに入れた値だってfromJustで取り出せる。
0451デフォルトの名無しさん
2015/09/08(火) 22:17:47.80ID:FdaSRh76>IOモナドなんかそんな風に言われるじゃん。
>でもIOモナドに入れた値だってfromJustで取り出せる。
???
まず前半、聞いたことがない。そういうこと言ってる実例挙げられる?
後半、意味がわからない。
0452デフォルトの名無しさん
2015/09/08(火) 22:18:26.87ID:CPV+4Ywq「モナドは外からは見えないから安全」という話に思い込んだんじゃ?
0453デフォルトの名無しさん
2015/09/08(火) 22:20:00.08ID:1BhJxNoG0454デフォルトの名無しさん
2015/09/08(火) 22:20:30.14ID:CPV+4Ywq0455デフォルトの名無しさん
2015/09/08(火) 23:38:38.43ID:vkbbpybQパターンマッチでいつでも値取り出せるじゃん。って。
モナドはデストラクタを隠蔽するのが肝なんだよな。
だからparsecとかIOとかをみて、初めてありがたみがわかった。
0456デフォルトの名無しさん
2015/09/08(火) 23:44:27.36ID:FdaSRh76>モナドはデストラクタを隠蔽するのが肝なんだよな。
データ構築子のこと?
runXX の形でモナドの実体を取り出せるモナドは珍しくないし、
IOモナドもそこは変わらないよ?
IO aの実体をWorld -> (a, World)として取り出してもありがたくないだけで
>だからparsecとかIOとかをみて、初めてありがたみがわかった。
うーん、その感覚はさっぱり
隠蔽云々とは関係なくリストモナドだろうがIOモナドだろうがありがたいけどなあ
0457デフォルトの名無しさん
2015/09/08(火) 23:52:35.54ID:FdaSRh76Maybe a の値、つまりNothingによって集合aを拡大していることになるわけで、
この拡大された集合a+上の計算を、元々のaの計算から自然に与えることが
できるようなそういう拡大の仕方とその構造のことをモナドというわけ。
Maybeほどストレートではないけど、他のモナドも基本は一緒。
これはデータ構築子が公開されててパターンマッチできるかどうか、とか
或いはそれと等価な関数が公開されてるかどうか、とかとは関係のない話。
0458デフォルトの名無しさん
2015/09/09(水) 00:06:36.58ID:EJNsNdDh要するに
OOPでクラス関数で主に記述するってことと同じでしょ?
メンバ関数・変数をなるべく使わずに
何がすごいのかさっぱりわからない
0459デフォルトの名無しさん
2015/09/09(水) 00:14:15.49ID:15Wbqaqp誰が関数型言語使えと頼むじゃなし使わないと死ぬわけでもなし
0460デフォルトの名無しさん
2015/09/09(水) 00:50:04.74ID:+WsBDtotバグめっちゃ減るんすよwwww
その代わりコンパイル通りににくくなるんで慣れるまでめっちゃ苛々するんすけど
実行時にヘマするくらいならコンパイル失敗した方がマシだってことを学ぶんすよwww
もうC++は体力続かない
三ヶ月前のコードとか読みたくないでしょ
歳取ったらHaskellが良いって解りますよ
Haskellなら三ヶ月前のコード、また読んでみてもいいかなって、それはとっても嬉しいなって
0461デフォルトの名無しさん
2015/09/09(水) 01:57:38.90ID:rpodVdITなんていうか上手く言えないんだけど、例えば、
データ構築子がreturnとbindしか無くて、一方分解子、runの類いがたくさん提供されてるデータを考えてくれ。
どうだいそれって滅茶苦茶役に立たないだろ?
0462デフォルトの名無しさん
2015/09/09(水) 02:07:49.07ID:15Wbqaqp>データ構築子がreturnとbindしか無くて、一方分解子、runの類いがたくさん提供されてるデータを考えてくれ。
なにが言いたいのか理解できないが、いずれにせよreturn とbind があれば
他のはそれから定義できるんだからなにも問題ない
runXXの類がたくさん提供されてる、というのもよくわからんが、
それで有用性が損なわれるとはちっとも思えない
0463デフォルトの名無しさん
2015/09/09(水) 02:09:55.95ID:15Wbqaqpもし、returnでしか当該データ型の値が作れないならrunXX云々以前にそりゃ役には立たない
m a 型の計算が実質的に a 型の計算そのものに崩壊するからな
0464デフォルトの名無しさん
2015/09/09(水) 02:28:58.80ID:rpodVdITだからモナドにするならreturn以外にカスタムコンストラクタをたくさん提供するべき。
逆にコモナドなら、コンストラクタは少なくていい。けど、デストラクタはextractだけじゃだめ。
(俺は_ -> Hoge のヤツをHogeのコンストラクタ、Hoge -> _ をデストラクタって呼んでる。異端かもしれんが)
0465デフォルトの名無しさん
2015/09/09(水) 02:39:48.87ID:15Wbqaqp>だからモナドにするならreturn以外にカスタムコンストラクタをたくさん提供するべき。
いやまったくもって意味不明なんだけど
普通に型定義のデータ構築子がある以上、それを使えばいいんだし、
それらのデータ構築子から構成できないようなものもあり得ない
しかもなんで「べき」なわけ?
Maybe型が役に立たなかったことなんかないだろう
あと、勝手な自分用語振り回されても理解できない(するきになれない)
0466デフォルトの名無しさん
2015/09/09(水) 02:57:08.05ID:rpodVdITところでさ、ライブラリを作っていて、データの内部表現を公開したくない時があるじゃない?
あとでチューニングしたいときとか。そういう時にデータがモナドなら主に ... -> Hoge a を、コモナドなら Hoge a -> ... を提供する。
return / extract に加えて。
理由は、えー… 逆だと使いづらいから。
(たとえばMaybeなら、fromJustってあんまり使わないでしょ?)
0467デフォルトの名無しさん
2015/09/09(水) 02:58:54.11ID:FLIFW6sl荒らしかな
0468デフォルトの名無しさん
2015/09/09(水) 03:07:23.01ID:rpodVdIT理由が弱いので、もう少し考えると、
例えば、doの途中でrunして値を取り出して、その値で分岐して別のモナディックアクションにつなぐのは、計算量が無駄。
それを避けるためにモナド(手続きの抽象)がある、と俺は理解している。
0469デフォルトの名無しさん
2015/09/09(水) 03:13:59.62ID:15Wbqaqpパターンマッチで実体取り出されたくないとき
(実体に依存した利用をされたくないとき)、というのはあるからな
だが、「return に加えて」は意味不明だ
作ろうとするモナドが恒等モナド以上の何かであろうとする限り、
returnでは作れないようなモナド値を構成する方法を提供しなければならない
これは内部表現の隠蔽云々とは何の関係もない
そうしないと使いづらいからではなく、そうしないと恒等モナド以上の
機能を有し得ないから、だ
fromJustを使わない(データ構築子 Just のパターンマッチも使わない)、
というなら、コード全体がモナディックになってしまう
(もちろんnon-monadicなコードは恒等モナドによってまったく等価な
monadicなコードとして書けるが、普通はそんなことはしない)
はっきりいって、何が言いたいのか本当にわからない……
0470デフォルトの名無しさん
2015/09/09(水) 03:14:53.69ID:FLIFW6slこっちもすまん、>>466見る前に書き込んだから
0471デフォルトの名無しさん
2015/09/09(水) 03:20:21.85ID:15Wbqaqp>例えば、doの途中でrunして値を取り出して、その値で分岐して別のモナディックアクションにつなぐのは、計算量が無駄。
>それを避けるためにモナド(手続きの抽象)がある、と俺は理解している。
計算量(?)はほぼ変わらず、コードが見やすくなるだけだ
むしろ、コードの煩雑さを苦にしないならば
最初からモナドの実体を直接操作する方が余計な関数呼び出しと
そこでいう意味の「計算量」は減る
-- オーダー以外の意味で「計算量」を使われるのも違和感があるが
0472デフォルトの名無しさん
2015/09/09(水) 03:21:55.11ID:FLIFW6sl>例えば、doの途中でrunして値を取り出して、その値で分岐して
>別のモナディックアクションにつなぐのは、計算量が無駄。
>それを避けるためにモナド(手続きの抽象)がある、と俺は理解している。
別のモナディックアクションにつなぐのが計算量の無駄というのが、
わからんのだけど
よく言われるように、用途の文脈を明確にしたい場合に使ってる事が多いし
0473デフォルトの名無しさん
2015/09/09(水) 03:27:24.33ID:15WbqaqpReader モナドで、逐一runReaderを使い r->a 型関数に戻すのが手間だ、
くらいの意味だろう。そりゃモナドの中で計算を合成できる方がいいしが、
指摘の通り、手間や関数適用コストの僅かな定数的増大よりは、文脈を切らずに
連続させることの利益が目的でdo 記法を使うはずだ、と私も思う。
0474デフォルトの名無しさん
2015/09/09(水) 04:04:10.81ID:FLIFW6sl少し落ち着いて
>>473
それで意味がわかりましたが、自分も正に>>471と同じ事を思いました
モナド無くていいじゃん、と
0475デフォルトの名無しさん
2015/09/09(水) 05:16:14.00ID:k6Vctrbh「計算は論理の物質化である」
0476デフォルトの名無しさん
2015/09/09(水) 06:53:19.57ID:5v/OlT8AOOPがわかってもC++がさっぱりわからないのと同じ
C++がわかればstaticメンバが何の役に立つのかわかる
0477デフォルトの名無しさん
2015/09/09(水) 07:44:14.88ID:yxoakRA/0478デフォルトの名無しさん
2015/09/09(水) 11:27:05.24ID:Gx2jhnq10479デフォルトの名無しさん
2015/09/09(水) 11:44:28.09ID:15Wbqaqp持ってる有用なデータ型が多いことがHaskellでのプログラミングの進展に
よって後になってから判明したから
後付で用意されたんで、元からあるMonadの定義には手を付けなかった
0480デフォルトの名無しさん
2015/09/09(水) 15:58:18.64ID:Q+d8J0F/藁人形を殴るのやめろ
0481デフォルトの名無しさん
2015/09/09(水) 18:35:43.48ID:wpO/WxMyunboxedが最速かと思ったがもう一つ隠し玉があるのか
0482デフォルトの名無しさん
2015/09/09(水) 20:47:23.14ID:yxoakRA/0483デフォルトの名無しさん
2015/09/09(水) 20:48:31.78ID:15Wbqaqp0484デフォルトの名無しさん
2015/09/11(金) 17:09:38.98ID:yMgx5TOb0485デフォルトの名無しさん
2015/09/11(金) 18:51:03.18ID:KUqdYwfeStateは、状態をあとづけでつける場合に使われるからモナド変換子なのかなぁ。。。?
0486デフォルトの名無しさん
2015/09/11(金) 19:36:27.09ID:v/2h2RVh0487デフォルトの名無しさん
2015/09/11(金) 20:01:00.74ID:2FuYRHxlMaybe a = Either () a
Just x = Right x
Nothing = Left ()
みたいな話?
0488デフォルトの名無しさん
2015/09/11(金) 20:39:04.30ID:v/2h2RVh0489デフォルトの名無しさん
2015/09/12(土) 09:02:59.99ID:8GXyupq5大抵それは「前例のない規模で前例を踏襲する」ことだ
0490デフォルトの名無しさん
2015/09/12(土) 09:43:20.01ID:UPPQquvW「前例のある規模で前例を踏襲することができない」よりはいいんじゃね
0491デフォルトの名無しさん
2015/09/12(土) 20:12:10.06ID:XAqQ9sMD軽トラをCADで拡大して4tトラックになるんだったら仕事なくなる
実際には現実世界の各種係数があって、そっちはスケールしないので無理なわけだが
CAD内でデータを拡大しても、重力やら鉄の剛性やら法律やらetcの
現実世界まで一緒に拡大されるわけではないからな、不整合が起こる
0492デフォルトの名無しさん
2015/09/12(土) 22:59:42.17ID:8GXyupq5拡大できない現実が悪いか、拡大できると言う虚言癖が悪いかを判断できないバカが多い
0493デフォルトの名無しさん
2015/09/13(日) 13:03:42.57ID:kiB/x+KN0494デフォルトの名無しさん
2015/09/13(日) 14:50:26.51ID:mhOIQ8p/だから○○は止めろとグチを言って前へ進まないのはただの甘えです。
ところで、GCがゴミを回収するタイミングを制御する方法はあるでしょうか。
たとえば、ある関数を評価しようとしないとGCが動かないようにできる、みたいな。
ステージクリア型のゲームを作っていると、ステージプレイ中はGCを止めて、
クリアしたりミスしたタイミングで一気にゴミ回収したいことってありませんか?
他にも、3DCGツールを作っていて、レンダリング中ではなく完了後にゴミを回収したい、とか。
0495デフォルトの名無しさん
2015/09/13(日) 15:44:15.42ID:x1dh+v5mGC止めるのはできないはず
System.Mem以下の関数で明示的に起動することはできる
RTSオプションの -I フラグ辺りを見るといいのかもしれない
0496デフォルトの名無しさん
2015/09/13(日) 17:52:56.94ID:m/zohjMNあるある
入力待ちに入る瞬間に軽くGCしといて欲しいとか考える
0497デフォルトの名無しさん
2015/09/13(日) 22:09:38.34ID:mhOIQ8p/ユーザーガイドを見てみました。
なるほど、そのオプションでアイドルになってから
GCが自動起動するまでの時間を指定できるのですね。
この値を非現実的な大きな値にすれば、結果的にperformGC関数で
意図したタイミングでGCを起動できることにならないか、と。
試してみます。
ありがとうございました。
0498デフォルトの名無しさん
2015/09/17(木) 15:51:54.68ID:B1grEVzP0499デフォルトの名無しさん
2015/09/18(金) 01:29:26.35ID:wjuvkHJc0500デフォルトの名無しさん
2015/09/18(金) 13:33:55.01ID:YvxDAq3A0501デフォルトの名無しさん
2015/09/18(金) 15:57:30.16ID:hYbUwCNL0502デフォルトの名無しさん
2015/09/18(金) 17:03:07.30ID:4VBZsKU6騙されたというならもっとこう、嘘を絶対に許さない的な理念があるべきじゃないのか
人を分類して煽り合うだけでは嘘は無くならないだろう
0503デフォルトの名無しさん
2015/09/18(金) 19:10:38.07ID:YvxDAq3Aプログラミングの話をしてくれ
0504デフォルトの名無しさん
2015/09/18(金) 22:09:52.30ID:dOXUeH6Yうまい嘘をつくためにも使えちゃうか
0505デフォルトの名無しさん
2015/09/18(金) 23:39:24.36ID:hYbUwCNL0506デフォルトの名無しさん
2015/09/18(金) 23:58:08.05ID:bAzDgVJCその置換と同等な巡回置換のリストを得る関数 cperms :: ([a], [a]) -> [[a]] を作りたいのですが、泥臭くなってしまいます。
例えば、集合 {x, y, z, w} に対して置換 {x, y, z, w}-->{x, w, y, z} があるとします。
(本来ならば置換は上下に並べて表記したいところですが、これで勘弁してください)。
この置換は2つの巡回置換に分けられ、ひとつは x を x に置換するの巡回置換 [x]、
もうひとつは y を w に、 w を z に、z を y に置換する巡回置換 [y, w, z] です。
なので、cperms ([x, y, z, w], [x, w, y, z]) = [[x], [y, w, z]] となります。
私の考え方は下記のような単純なものです。
引数のタプルの第1要素を置換前リスト、第2要素を置換後リストとします。
置換前リストの先頭要素から次のように順にスキャンします。
0. 置換前リストの先頭要素を a1 とする。
1. 置換前リストの a1 と同じ位置にある置換後リストの要素を a2 とする。
2. 置換前リストの a2 と同じ位置にある置換後リストの要素を a3 とする。
・・・
n. 置換前リストの an と同じ位置にある置換後リストの要素を a[n+1] とする。
a1 == a[n+1] ならば [a1, a2, ..., an] を巡回置換のリストとする。
置換前・置換後の各リストから辿った要素を取り除いた新たな2つのリストを作りタプルにする。
そのタプルに対して再び cperms 関数を適用し、結果を先ほど作った巡回置換のリストと concat する。
泥臭く感じるのは2点。
ひとつは、a1 を覚えておいたり、構築中の巡回置換リストを保存するなどのために
いくつものアキュムレータを付けた再帰関数を作っている事。
もうひとつは、置換前リストや置換後リストから要素を探すときにいちいち先頭から順に探している事。
宣言的とはとても言えないコードになってしまうなですが、良い方法はないでしょうか。
0507デフォルトの名無しさん
2015/09/19(土) 03:37:04.08ID:ygsDvVju憲法守れ!検閲反対!憲法守れ!検閲反対!
検閲する側の人間を支持していてこれか
脳みそ入ってないでしょ
0508デフォルトの名無しさん
2015/09/19(土) 08:31:20.34ID:oTM0A26u0509デフォルトの名無しさん
2015/09/19(土) 09:58:08.46ID:UoEBemSSf :: Eq a => a -> [(a,b)] -> Maybe (b, [(a,b)])
f _ [] = Nothing
f x (y:ys) = if x == fst y then Just (snd y, ys) else fmap(id***(y:))(f x ys)
-- (***) a b (c, d) = (a c, b d)
0510デフォルトの名無しさん
2015/09/19(土) 11:38:35.20ID:9U4PsEMd右から順に書いてしまう (極端には filter even 書いてからその左に length . って書き加える)
んですが、これは慣れてもそういうもの?
それともそのうち「最終的に欲しいのはこれだから」みたいに左から書くようになる?
0511デフォルトの名無しさん
2015/09/19(土) 11:55:02.12ID:uMEyIMVB今はタイプするのが楽だから左から書いてるけど
一度右からの流れを思い浮かべてから逆順をたどるように書くみたいにしかできてない
左から考えられるようになるものなのか?そもそもなるべきなのか?どうなんだろう
■ このスレッドは過去ログ倉庫に格納されています