関数型プログラミング言語HaskellPart28
- 1 デフォルトの名無しさん
-
関数型プログラミング言語 Haskell について語るスレです。
haskell.org (公式サイト)
前スレ
関数型プログラミング言語Haskell Part27
- 23 デフォルトの名無しさん
-
【 オンラインTCGエディター 】 >>1
デュエル・マスターズ的な非電源TCGの 《 オンライン化ツクール系ソフト 》 制作の企画。
例えば、ガチンコ・ジャッジを直ぐにでも導入できる機能を持っておりながら、
当面それを扱わず単純化させておいて、事後的に導入拡張する際に当該システムを
ブロック構造の組み合わせで後付け挿入できるように予めシステム化してあるソフト(エディター)。
既存の非電源TCGを劣らずに再現できるならば大概のニーズに応えられる筈。
バトスピ、ヴァンガ、ウィクロス、ポケカ、デジモン、ゼクス、モンコレ、ガンダム・ウォー、ライブオン、ディメンション・ゼロ、カードヒーローなど
のシステムを完全再現できるように設計するけど、他に此のTCGの此のシステムは再現希望とか有ったら書いて。
マジック:ザ・ギャザリングの全システムを完全に再現するのは無理だから、此れだけは必用だ!って部分のみリクエストして。
WEB通信での対戦は、個vs個、多数乱戦、チームvsチーム、個vsチームを可能な仕様とする方針。
設計思想は 《 RPGツクール 》 が良いかな? 他に、優れたエディター有ったら挙げてみて。
個人や企業などのベンダーが提示する開発費(見積もり)で折り合えば、発注する。
↓
エディター群から基本コンセプトを絞り込む(もちろんオリジナルで優れた新ネタが有れば導入する)。
↓
遊戯王OCGに関しては、タッグフォース、ADS、デュエルオンラインを発注先ベンダーに研究させる。
なるべく前述3つで可能な再現は全て実装させる方向を目指す。 まぁ努力する・・・
バトスピ、ヴァンガ、バディ、デュエマなど発売済みゲームソフトが存在してるケースはベンダーに研究させる。
↓
各社TCGを再現するテストプレイ ⇒ 更に改良や修正。
↓
機能制限した下位版を5万円以上で発売 + デュエリ−グ用に改造した上位版でサーバー稼動=営業開始。
↑
下位版の改造および商用利用には、別途で当社との契約が必要。
さ〜て、製作ベンダー見つけよっと!ww(クス
hhttp://wc2014.2ch.net/test/read.cgi/entrance2/1448404407/-13
- 36 デフォルトの名無しさん
-
ここが実質Part 30でいいんだろうか
>>1
■前スレ
関数型プログラミング言語Haskell Part29
- 88 デフォルトの名無しさん
-
不平には問題提起の意味があります
問題提起する前に解決しましょうって言われたらどう思いますか
- 89 デフォルトの名無しさん
-
>>88
だったら、本人たちには適切に問題提起をする能力がないのだから、
あんたが代わりに翻訳して、普通の人に分かるように問題提起してくれよ。
でなきゃ、ただのノイズとして見逃される。
- 90 デフォルトの名無しさん
-
>>89
それを誰に言いたいですか
言いたい相手はもう見つかっていますね
見逃されるというのは嘘ですね
- 114 デフォルトの名無しさん
-
Haskell と JavaScript と Erlang は競合しないと思う
どれかを使うと別のモノを使わなくなるという仕事をしてる人は、どれをやらなくても困らないからプログラミングやめればいいとおもう
- 118 デフォルトの名無しさん
-
>>114
それは素人考え。
Haskellさえあれば他は要らない。
玄人ならこう考える。
- 123 デフォルトの名無しさん
-
すみません質問なのですが、文献で
[0, 1, 2, 3]を[[0],[0,1],[0,1,2]にしてくれる
便利な関数があったのですが
fn :: [a] -> [[a]]
fn [] = []
fn (x:xs) = [x] : map f (fn xs)
where f lt = x : lt
リストにmapを掛けてconsしてまた再帰呼出など
初心者の自分には仕組みが今一つ掴めないです。
もっと簡単に理解できて同様の事ができる関数は
ありえますでしょうか?
- 124 デフォルトの名無しさん
-
>>123
これでどうでしょう
(y -> map (x -> take x y ) [1..(length y)]) [0,1,2,3]
- 126 デフォルトの名無しさん
-
>>123
fn :: [a] -> [[a]]
fn xs = scanl1 (++) $ map cons xs
where cons x = [x]
- 128 デフォルトの名無しさん
-
>>123のコードも若干手順前後があるが同じことをしている。
>>123のコードは
fn [1, 2, 3] = [ [1], [1,2], [1,2,3] ]
に対して、まず各要素の頭に0をくっつけて
[ [0,1], [0,1,2], [0,1,2,3] ]
を作り、最後にこのリストの頭に[0]をくっつけて
[ [0], [0,1], [0,1,2], [0,1,2,3] ]
を得ている。それを一般的に書いただけ。
- 125 デフォルトの名無しさん
-
>>124
ありがとうございます。
試してみます。
- 127 デフォルトの名無しさん
-
>>125
fn [] = [[]]
fn (x:xs) = map (x:) $ [] : fn xs
で書ける。要するに
fn [0, 1, 2, 3] = [ [0], [0,1], [0,1,2], [0,1,2,3] ]
を
fn [1, 2, 3] = [ [1], [1,2], [1,2,3] ]
から作る方法がわかればこの関数は素直な再帰で書けるわけ。
で、それには後者の頭に空リストを足して [ [ ], [1], [1,2], [1,2,3] ] を作り、
これの各要素の頭に 0 をくっつければいいわけだ。
この操作を一般的に書けば上の定義の2行めになる。
- 131 123
-
>>124
>>126
>>127
>>128
>>129
どうもありがとうございます。
学習の参考にさせて頂きます。
- 244 デフォルトの名無しさん
-
c01::String->String
c01 []=[]
c01 (x:xs)
| x=='?' = []
|otherwise =x:c01 xs
c02::String->[String]
c02 []=[]
c02 x=[_c01]
where
_c01=c01 x
main = do
print (c02 "213?46464?698")
言語感覚を掴むために文字列を?区切りの配列化とかやってんだけど
なんか上手くいかない。。後ろの方なんかどうにかスマートに取れんかな?
- 246 デフォルトの名無しさん
-
>>244
split = split' [] ""
split' acc buff "" = reverse $ reverse buff :acc
split' acc buff (x:xs)
| x == '?' = split' (reverse buff :acc) "" xs
| otherwise = split' acc (x:buff) xs
main = print $ split "213?46464?698"
こんなもんだろ。既に区切った語のリストをaccに蓄積して
今読んでる途中の語はbuffに蓄積してやる(適宜reverseで順番を直す)
- 259 デフォルトの名無しさん
-
>>246
リバースだらけで中々読むのに時間がかかった、、++はいかんのか、、
- 261 デフォルトの名無しさん
-
>>259
再帰でリストの後ろに(++)するとO(n^2)かかるので
頭に(:)していって後でreverseするのが定跡
定跡なので慣れれば読みにくくもなくなる
- 264 デフォルトの名無しさん
-
>>261
もし要素が1個増えるたびにバッファ全体をコピーしたらO(n^2)になるが
それは配列でもリストでも同じだし、(++)だからといってO(n^2)とは限らないよ
- 265 デフォルトの名無しさん
-
>>264
リストの最後尾に要素を付け加える操作はリストを頭から尻まで走査しないとできないのでO(n)
コピーとかそういう問題ではない
- 310 デフォルトの名無しさん
-
元の話題でもないし回答でもないし内容自体もおかしいし大丈夫か
- 313 デフォルトの名無しさん
-
>>310
これはあれだ、モスバーガーの食い方と同じやつだ
つまり相手にしてはいけない
- 347 デフォルトの名無しさん
-
今まで ghc を単体でインストールし、ライブラリも cabal でインストールしていました。
今 yesod を cabal でインストールしようとしたら、
依存パッケージの monad-logger などでバージョンの問題が発生し、
いくつかのパッケージをダウングレードしないと yesod がインストールできない状態です。
たまたま今はバージョン問題が解決されるまで待てない状況なので、
Stack を使って yeaod に必要な環境を作るという対処を考えました。
そこで質問です。
今この状況でStack を使って yeaod に必要な環境を作る場合、
ghc はアンインストールしておかないと問題が起きるでしょうか。
cabal でインストールされているライブラリは消しておかないとだめでしょうか。
- 352 デフォルトの名無しさん
-
>>347
たぶん問題ないよ。stack は特に指定しない限り stack がインストールしたghcやライブラリを使う。
このことを確認する方法。
まず、stack unpack yesod したのち、yesodのディレクトリに移り、
stack exec -- which ghc
して、stackが使うghc が .stack ディレクトリ以下の階層にあることを確かめる。
stack exec -- ghc-pkg list
で、使用されるライブラリが .stack ディレクトリや .stack-work ディレクトリの深くに入っていることを確認する。
- 354 デフォルトの名無しさん
-
>>352
ありがとうございます。
問題なく環境を構築できました。
- 476 デフォルトの名無しさん
-
というか関数の書き方についての正式な定義がハットンの本には
ありません。
引数は1つしか取らないということでいいのでしょうか?
たとえば、
f x = ...
と書いた場合、
「=」は写像の対応を表す記号で、
x -> ...
という意味なのでしょうか?
- 478 デフォルトの名無しさん
-
>>476
add x y = x + y
は
add = ¥x -> ( ¥y -> x + y )
の略記( ¥x -> … はラムダ式のリテラル)。
どうしても書きたきゃ1段階だけ略記して
add x = ¥y -> x + y
と書いても構わない(がそう書くのは見たことがない)。
- 483 デフォルトの名無しさん
-
>>478-480
ありがとうございました。
add x y = x + y
ハットンの本を読んでいて、カリー化が出てくるまでは、
関数は一つの引数しか取らないものしか出てきませんでした。
カリー化のところでいきなり x y という表記が出てきたの
でこれは何なのかと混乱してしまいました。タプルに似た
何かの型の要素なのかと思ったり。
略記法ということで納得しました。
ありがとうございました。
- 485 デフォルトの名無しさん
-
>>483
関数適用演算子としての空白は左結合なんで
add x y はカッコを入れてわかりやすく書けば (add x) y のこと。
Haskellの関数はご推察通り一つの引数しか取らない(最初からカリー化されている)。
- 534 デフォルトの名無しさん
-
~/.stack/config.yaml
に
build:
haddock: true
でできるように(我らがヒーロー)chrisdoneさんがしてくれたみたい。
- 535 デフォルトの名無しさん
-
>>534
ありがとうございます。
できました。
ところで、HsColour へのパスを通し忘れていたみたいで、
インストールされたライブラリドキュメントの各関数にソースへのリンクが張られていません。
stack でドキュメントを強制的に上書きで再インストールする方法はあるでしょうか。
- 536 デフォルトの名無しさん
-
>>535
調べたけど簡単な方法はわかんなかった。手で削除して一つ一つをリビルドするしかないのかも。
イマイチ自信がないから注意してほしいんだけど、例えばこんな風にやります...
まず、ドキュメントのインストール先を調べる。
$ stack path | grep "doc"
snapshot-doc-root: /path/to/snapshot/doc
local-doc-root: /path/to/local/doc
二つのディレクトリのどっちかに入ってるかわかったら、
例えばsnapshotの方なら、そのディレクトリの中身を削除する。
$ rm -rf `stack path --snapshot-doc-root`/*
その後でhaddockを再構築する。
$ stack exec -- ghc-pkg list --package-db=`stack path --snapshot-pkg-db` --simple-output | xargs -n 1 stack haddock
- 537 デフォルトの名無しさん
-
>>536
念のためバックアップをとってから試しましたが、うまくできました。
今のところ特に問題は見つかっていません。
ありがとうございました。
- 547 デフォルトの名無しさん
-
初めて関数型言語に触れてモナドがあんまり理解しづらいんだがパイプラインで使える割り込みみたいなものとしてとらえておk?
- 550 デフォルトの名無しさん
-
>>547
なんじゃそりゃ?
- 551 デフォルトの名無しさん
-
>>550
いや、いろんなモナドがどういう動きをするのか見てたら処理の終わりや処理の途中になんかあった場合次の別の処理に移る所(パイプライン処理)で割り込んでるようなイメージになったからさ
その命令と命令の間で割り込めるような構造がモナドなのかと思ったんだ
- 554 デフォルトの名無しさん
-
>>551
モナドのそういう雰囲気は、プログラマブルセミコロン、といわれてる。
リストモナドやMaybeモナドの定義も見てみると、もっと理解が深まるよ。
- 580 デフォルトの名無しさん
-
Haskellの関数名を考えるとき、どう計算するかを表す動詞ではなく、
何が返ってくるかを表す名詞にするよう、できるだけ心掛けましょう。
sine(sin)やcosine(cos)、integral(∫)もみんな名詞でしょ。
- 584 デフォルトの名無しさん
-
>>580
どうして動詞より名詞の方がいいの? 純粋に理由が知りたい。
- 585 デフォルトの名無しさん
-
日本語の「〜する」だって万能動詞化語だけど
英語は「文法上動詞と解釈するしかない位置にある(名詞っぽい)単語」は
形を全く変えずに動詞として振る舞えるからなあ
…書いてて気づいたけど、逆に英語の動詞を日本語に輸入するときに
「ゲットする」みたいに「"get"を名詞化してしまう」から
その辺ごちゃごちゃにしてしまいやすいのかもしれん
>>584
手続き型やオブジェクト指向では規約として動詞で命名するようにしてたりするから
その癖に引きずられないで宣言的に書けってことじゃないかな
HaskellでもIOモナドの中ではgetArgsとか使うけど
- 746 デフォルトの名無しさん
-
本物のプログラマは〜って記事もあったけど余計な反感買うだろと思った
言語そのものではなくて使いこなせる自分たちが凄いと言ってるみたいだし
- 754 デフォルトの名無しさん
-
>>746
言語そのものが凄くても知識に個人差があるし
今は常時デマが流れているので知識の格差は拡大する
元スレ
http://echo.2ch.net/test/read.cgi/tech/1428597032