2ch勢いランキングまとめ
メニュー

関数型プログラミング言語HaskellPart28

この話題の盛り上がりグラフ
2017-01-15 22:21:31 最終更新
1 デフォルトの名無しさん

関数型プログラミング言語 Haskell について語るスレです。

haskell.org (公式サイト)

http://www.haskell.org/

前スレ

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

http://peace.2ch.net/test/read.cgi/tech/1420718555/

23 デフォルトの名無しさん

【 オンラインTCGエディター 】 >>1

デュエル・マスターズ的な非電源TCGの 《 オンライン化ツクール系ソフト 》 制作の企画。

例えば、ガチンコ・ジャッジを直ぐにでも導入できる機能を持っておりながら、

当面それを扱わず単純化させておいて、事後的に導入拡張する際に当該システムを

ブロック構造の組み合わせで後付け挿入できるように予めシステム化してあるソフト(エディター)。

既存の非電源TCGを劣らずに再現できるならば大概のニーズに応えられる筈。

バトスピ、ヴァンガ、ウィクロス、ポケカ、デジモン、ゼクス、モンコレ、ガンダム・ウォー、ライブオン、ディメンション・ゼロ、カードヒーローなど

のシステムを完全再現できるように設計するけど、他に此のTCGの此のシステムは再現希望とか有ったら書いて。

マジック:ザ・ギャザリングの全システムを完全に再現するのは無理だから、此れだけは必用だ!って部分のみリクエストして。

WEB通信での対戦は、個vs個、多数乱戦、チームvsチーム、個vsチームを可能な仕様とする方針。

設計思想は 《 RPGツクール 》 が良いかな?  他に、優れたエディター有ったら挙げてみて。

個人や企業などのベンダーが提示する開発費(見積もり)で折り合えば、発注する。

エディター群から基本コンセプトを絞り込む(もちろんオリジナルで優れた新ネタが有れば導入する)。

遊戯王OCGに関しては、タッグフォース、ADS、デュエルオンラインを発注先ベンダーに研究させる。

なるべく前述3つで可能な再現は全て実装させる方向を目指す。 まぁ努力する・・・

バトスピ、ヴァンガ、バディ、デュエマなど発売済みゲームソフトが存在してるケースはベンダーに研究させる。

各社TCGを再現するテストプレイ ⇒ 更に改良や修正。

機能制限した下位版を5万円以上で発売 + デュエリ−グ用に改造した上位版でサーバー稼動=営業開始。

下位版の改造および商用利用には、別途で当社との契約が必要。

さ〜て、製作ベンダー見つけよっと!ww(クス

http://wc2014.2ch.net/test/read.cgi/entrance2/1448404407/-13

※このレスを見た人はなぜか下記にも興味を持ったようです
ニューダンガンロンパV3 みんなのコロシアイ新学期 超高校級の限定BOX - PS4 15970 円
【予約前日出荷】[PS4]ニューダンガンロンパV3 みんなのコロシアイ新学期 通常版(20170112)【RCP】 7440 円
36 デフォルトの名無しさん

ここが実質Part 30でいいんだろうか

>>1

■前スレ

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

http://peace.2ch.net/test/read.cgi/tech/1436869629/

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

言語そのものが凄くても知識に個人差があるし

今は常時デマが流れているので知識の格差は拡大する

元スレ

関数型プログラミング言語HaskellPart28
http://echo.2ch.net/test/read.cgi/tech/1428597032

その他おすすめ

コメント

本サイトはまだコメント機能がありません。ご連絡事項については「メニュー」の「本サイトについて/お問い合わせ」よりご連絡をお願いします。