関数型プログラミング言語Haskell Part30 [無断転載禁止]©2ch.net

レス数が950を超えています。1000を超えると書き込みができなくなります。
2017/01/15(日) 23:43:54.28ID:Vh4eztBk
関数型プログラミング言語 Haskell について語るスレです。

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

前スレ
関数型プログラミング言語Haskell Part28
http://echo.2ch.net/test/read.cgi/tech/1428597032/
2017/08/17(木) 07:36:41.55ID:+LfjPFPQ
すいません許してください。何でもしますから
891デフォルトの名無しさん
垢版 |
2017/08/18(金) 00:54:02.54ID:/Ug8Ilbd
モナドってインタフェースみたいなもんでいいのか?
つまりなんでもアリにしちゃうと、設計上様々な不整合があるから
「こういうモナド」を最初に規定してしまい、「モナドに合致しない」記述は
コンパイルで弾いてくれるの?
2017/08/18(金) 01:40:52.19ID:DcI2Tm3Y
モナドはDSLプラットフォーム
2017/08/18(金) 08:52:35.38ID:JMfuFDdS
文脈だって言ってんダロ
文脈を保ちながら普通の値と同じように扱うための規則を定めたものがモナド
2017/08/18(金) 09:06:56.52ID:t41bY7Zb
haskellはモナドじゃないものもコンパイル通しちゃうよ
モナドであることの保証は自分でするしか
895デフォルトの名無しさん
垢版 |
2017/08/18(金) 09:22:11.27ID:xzRfloCT
>>891
モナドってより型クラスがインターフェースに近い。
んで、モナドは型クラスの一つでしかない。
等値を司るEq型クラスのインスタンスになれば=が使える。
大小比較を司るOrd型クラスのインスタンスになれば<や<=が使える。
それと同じ。
逐次処理を司るMonad型クラスのインスタンスになれば>>=とreturnが使える。
IOモナドはIO型を受け取るモナドってだけ。
素のモナドを使うのがほぼIO型しかないからIOモナドって一緒くたにされるけど、IOとモナドは分けて考える。

リストやMaybeもモナドのインスタンスなので、モナドでもある。

モナドが他の型クラスと違うのは、メソッド定義(インターフェースになる関数や演算子をインスタンスになる型で定義)の時にモナド則に則って書く必要があるということ。
それとモナド則を正しく定義できたかは型クラスには無関係なので、定義した人が正しさを保証する必要があるということ。
2017/08/18(金) 09:38:38.34ID:pIYVRSo1
万能で汎用のDSLも作れるけどそれは手続き型言語と同じだから作らないんだよ
IOはごく一部で使われるDSLであるべき
他のところではIOとは別のDSLを使うべきという設計
2017/08/18(金) 13:45:01.90ID:/WLuQhbG
Haskellによる手続き型言語の
分かりやすくて面白い実装きぼん
(学習用のおもちゃでよろし)
898デフォルトの名無しさん
垢版 |
2017/08/18(金) 20:36:40.41ID:2JfViLUf
>>891
ぶっちゃけていうとライブラリ実装者専用の
グローバル変数置き場って感じじゃね?
ライブラリのユーザはその中身は気にせずに使う。
2017/08/18(金) 21:42:29.70ID:XJnMHx6C
ListTの使い方ようわかりまへん
do
x <- [1..9]
なんちゃらかんちゃら x

って、リスト感覚で使いたいんですが
2017/08/19(土) 23:56:10.44ID:3LWi1RRc
直受けの50万 客:いつまでもうちにいていいよ
3次受けの50万(客は70万払ってる) 客:短期延長していい?
5次受けの50万(客は110万払ってる) 客:作り終わったらとっと出てけ できなかったら即退場だ 
長時間労働 高稼働 高スキル要求が多い

零細フリーランスサイトは5次受けから誰もできない難易度の高い仕事 余り物の仕事を紹介してくる。40万円代でやってくれと

これならJIETから3次でいったほうがいいな

446非決定性名無しさん2017/08/02(水) 22:12:48.95

JIETに毎月5千円払えば3次から入場できるだろ?
高額をうたうフリーランスのサイトはだいたい5次から45万円
JIETで閲覧応募できる末端価格からさらに搾取するのが高額をみせつけるフリーランスサイトでした
高額案件をみせつけるフリーランスサイトも案件の取得はJIETでした

473非決定性名無しさん2017/08/03(木) 15:21:30.71

JIETに加入すれば誰でも3次60万からスタートだ。フリーランスのサイトをやってる
自称エージェントもそこから案件情報を取得しきてる。サイトで60万で釣って40万から55万の
間でやらしている。

372仕様書無しさん2017/08/11(金) 10:31:43.41
フリーランスで検索すると引っかかる零細ITがやっているフリーランスのサイトはだめだ。
高額に見せているけど実際は50万前後
JIET加入した方がいいよ。案件は毎日千件以上末端価格は60万円 平凡な稼働時間の80万円の案件もある。
ユー子も求人をだしてる。名刺も渡せる。ユー子に名刺が渡せるんだぞ。夢のようだ

それらの案件まさぐってHPで転売していたのが零細ITがやるフリーランスサイト

自称エージェントはJIETから流れてくる案件を転売してるだけだった。
JIETに加入すれば誰でも案件に応募することができた。収入が40万50万台にならなくて済む
2017/08/20(日) 03:21:02.15ID:ZIcYkpAE
>>899
x <- ListT $ return [1..9]
でもListTはモナドの結合則を破るというか
場合によっては幅優先になるから不用意に使わない方がいい
2017/08/21(月) 00:38:33.62ID:JGSk0hSy
>>901
ListTには失望しました。もう積むのやめます
2017/08/21(月) 01:01:09.86ID:JGSk0hSy
そもそもやろうとしてることに(よくよく考えたら)モナド変換必要なかった
本当に必要だったのは foldl でした

一方ロシアは鉛筆を使った
2017/08/24(木) 13:28:03.79ID:CtBOeO2p
以下のhogeを定義してください

foldl' f a xs = foldr1 seq $ hoge $ scanl f a xs
hoge xs = ???
905デフォルトの名無しさん
垢版 |
2017/08/24(木) 19:41:48.97ID:QM9NdRuY
https://wandbox.org/permlink/HLJOHIGKIX8APzrZ

引数4つのfoldrがよくわからない
foldr f g [1..9] 707
906905
垢版 |
2017/08/24(木) 20:30:17.00ID:QM9NdRuY
>>905は事故解決しました
907905
垢版 |
2017/08/24(木) 20:49:44.49ID:QM9NdRuY
引数の適用順序の理解が足りないだけでした

f x = id id id id id id x

というのがあったら

f x = (((((id id) id) id) id) id) x

という感じに左から順番に適用されるんですね

foldr f g [1..9] 707 も (foldr f g [1..9]) 707 と括れば理解できました
2017/08/24(木) 23:08:48.67ID:RV3Vojhw
Data.Map.findWithDefault について質問です

マップに存在しなかったからデフォルト値を返したのか、それともマップに存在したからそれを返したのか
一目判らないとき、デバッグでどうやって判定しますか?
2017/08/24(木) 23:40:45.91ID:Drr24sOi
判定不可能でありそれが意図するところじゃね?
変な値をデフォルトに入れておくか
a->k->Map k a->Either a a的なのを用意するしかないんじゃ
2017/08/25(金) 00:15:34.79ID:eQ9TUNW0
findWithDefault d k m = maybe (trace "default" d) (trace "existed") $ Map.lookup k m
2017/08/25(金) 05:39:52.91ID:Qp5pyEwS
>>910
やったぜ。ドバァーっとヒット/ミス/更新がその時の検索キーと共に時系列で出てきた。 もう気が狂う程気持ちええんじゃ。
ログまみれのコンソールを見つめてメモ化再帰の効果を確認したりした。ああ〜〜たまらねえぜ。(ありがとうございました)
2017/08/25(金) 06:18:21.22ID:eQ9TUNW0
わろた
2017/08/26(土) 04:35:19.01ID:gyHjYOL6
>>910
ポイントフリー化に成功しました

findWithDefault = curry.(.uncurry Map.lookup).(`maybe` trace "existed").(trace "default")

https://ideone.com/RVpv4o
2017/08/29(火) 10:59:59.32ID:4lrctZxR
新しい言語を勉強してると「Haskellならこう書けるのになんだかな〜」となってしまう
2017/08/29(火) 14:36:34.73ID:Qxc6OkmQ
Haskell書いてると「OCamlならこう書けるのになんだかな〜」となってしまう
2017/08/29(火) 14:47:58.47ID:Ca4b6AZL
そま?例えば?
2017/08/29(火) 16:59:34.07ID:weKjOry2
岡村の方が速いらしいっすよ。でも、そうですね…やっぱり僕は、王道を征く、Haskell系ですか
2017/08/29(火) 19:06:06.26ID:Qxc6OkmQ
多相ヴァリアント
2017/08/30(水) 16:54:11.68ID:osPI36Tt
双方向リンク系のデータ構造って、Haskell で作るのムズいね。
作るだけなら良いけど、更新時の処理で頭こんがり。

任意のノードに外部からアクセス用リンクが張ってあると
もう訳分からん。
2017/08/30(水) 17:07:44.85ID:YH54NEsT
そういうことするなっていう設計の言語で強引にしようとしたらわけわからなくなるよ
2017/08/30(水) 17:18:14.50ID:osPI36Tt
>>920
そういうことするなってのは入門書には書いてないじゃん。
じゃあ、ちょっくらやってみようか、ってなるのがプログラマでしょ。

できるかもしれんし、できんかもしれん。

まぁ、かなりムズいなってのは体験して分かった。
2017/08/30(水) 17:24:15.30ID:YH54NEsT
>>921
あー。Haskellでは状態を変更しない為に単方向リストを用いるって書いてなかった?
2017/08/30(水) 17:35:40.48ID:osPI36Tt
>>922
リストの定義とか使い方とかは載ってたけど、
なんで単方向のなのかの説明は無かったよ。
「Haskell:The Craft of Functional Programming」
「Beginning Haskell: A Project-Based Approach」
2017/08/30(水) 17:47:54.21ID:YH54NEsT
マジかぁ……
2017/08/31(木) 03:30:11.22ID:lYwDQiZm
Purely Functional Data Structuresなら触れられてるかと思って探してみたけど
そもそも双方向連結リスト出てこないな(´・ω・`)
でも永続データ構造の概念を知ればなぜ扱われていないかが分かるだろう多分
2017/08/31(木) 05:24:22.47ID:8YNqT7yd
何で双方向リストの必要なんかあるんですか
途中で戻るとか男らしくないっすよ
2017/08/31(木) 07:18:24.63ID:3UP7YVEo
>>926
巨大な双方向グラフを作ることになったんだけど、 使い方は次の通りちょっと特殊。

* あるノードにアクセスしたら、その近隣のノードも集中的にアクセスすることが多い
* ノードが持つ値の読み書きアクセスが圧倒的に多く、グラフの形を変えることは少ない
* ノードの値の書き込みアクセスよりは読み取りアクセスの方が多い

既存の汎用的なグラフ ライブラリと、双方向リンクで自作したグラフ ライブラリとで、
どっちが効率いいか実験してみようと思ったんだ。

でも双方向リンクは、ひとつのノードの値を変えるためにどうしてもグラフ全体を作り直す羽目になる。
どうにかならんものかと考えてたけど、どうにもならんね・・・
2017/08/31(木) 09:37:24.20ID:z8GPJM/w
「doubly linked list haskell」でググって適当な実装拾う
2017/08/31(木) 11:49:25.22ID:lYwDQiZm
すごハスにあるようなZipper構造かな必要なのは
2017/08/31(木) 12:38:50.35ID:cadjyHiv
書き換えしないんだったら ([a], a, [a])  みたいなので充分なんだよな
コモナドにしてどうたらとか余計な話も無視して
2017/08/31(木) 12:49:49.13ID:3UP7YVEo
あの、欲しいのはリストじゃなくてグラフなんだ。
だから、zipper 系とは違う。
2017/08/31(木) 14:03:01.85ID:UJfUdOL2
最低限木じゃないと効率的かつ単純なのは無理なんじゃないかな?
あんま自信ないけど
2017/08/31(木) 14:05:39.83ID:3UP7YVEo
皆のレスがどうも勘違いしてると思ってたら、
俺が最初に双方向リンクと言ってしまったからか。

ごめん、相互リンクだ。
2017/08/31(木) 14:16:21.20ID:3UP7YVEo
>>932
木構造でも、親ノードへのリンクを入れると相互リンクになって難しくなるよね。

ひとつのノードの値を変えるためには、
ツリー全体を作り直すことになるんじゃないかな。

HaskellのDOMツリーのデータ構造とかどうなってるんだろ・・・
2017/08/31(木) 14:36:16.80ID:3UP7YVEo
よく考えたら、リストとかツリーでも、
途中のノードの値を変えたかったら、
そのノードまでリンクで繋がってる全ノードは、
新しくリンクを張り直さなくちゃいけないんだね。
2017/08/31(木) 16:07:16.49ID:ByIgTrbm
そうです。途中の値の変更は
リストならO(n)
ツリーならO(log n)
2017/08/31(木) 17:20:58.63ID:UJfUdOL2
>>934
ランダムアクセスしないなら木に入れなくてもその都度親リストを作ればいいんだけどね
なおかつそれをカーソル的に使ってやれば平均で更新のコストも減らせる
ってこれzipperか
938デフォルトの名無しさん
垢版 |
2017/09/01(金) 01:21:03.60ID:5J9AnuIe
何が何でも1つのプログラミング言語で何とかしようとするのって
異国に行っても母国語で通そうとする観光客と同じ
2017/09/01(金) 06:41:46.01ID:YbmVmXZP
>>938
ひとつの言語がどこまでできて、何が得意で何が苦手なのか、
ひとつの言語に集中してそういうのを学ぼうとするのも、
おまえの言う「母国語で通そうとする観光客」カテゴリに入るのか?
2017/09/02(土) 01:43:24.06ID:6rFZUKZZ
>何が何でも1つのプログラミング言語で何とかしようとするのって
>異国に行っても母国語で通そうとする観光客と同じ

こういうやつにかぎってポリグロッタルコストを甘く見てる
941デフォルトの名無しさん
垢版 |
2017/09/02(土) 02:26:59.07ID:zv/5K5Jn
私はHaskell以外のプログラミング言語で書く気はありません
2017/09/02(土) 03:52:13.44ID:qGW8qyv/
慣れるまで大変だけど、慣れたら居心地いい気がする
2017/09/02(土) 07:28:06.22ID:pdF7ruXY
困ったらFFIでC呼び出せばいいだけだから助かる
2017/09/08(金) 23:35:36.55ID:r8Qtf4kd
ICFP 2017 で発表された資料、成果や知見はどこかで後悔されたりしないんですか?
動画が公開されてるんなら、有料でも見たいです。
945デフォルトの名無しさん
垢版 |
2017/09/09(土) 18:15:24.47ID:lkyt770O
発表者各自が公開してるの地道に探すしかねーんでないの

ICFP Conference(@icfp_conference)さん | Twitter
https://twitter.com/icfp_conference
2017/09/09(土) 20:11:43.28ID:TPWLKlk7
>>945
やはりそうですか。

毎年そうやって発表者や参加者の発信を探すのですが、
分散しており、詳しいことは書いてないことも多く、
情報集めに苦労する割には、たいてい徒労に終わります。

有料でいいので公式がまとめて公開してくれるといいのにと
ここ数年つたない英語でメールを出しているのですが、
相手にしてもらえませんね。

すいません、愚痴でした。
947デフォルトの名無しさん
垢版 |
2017/09/09(土) 23:36:02.27ID:9IxpzJRD
icfpが何なのか知らないけど「icfp video」「icfp paper」で検索してみた
ICFP Video - YouTube
https://www.youtube.com/channel/UCwRL68qZFfub1Ep1EScfmBw
gasche - GitHub
https://github.com/gasche
ICFP 2016- Proceedings of the 21st ACM SIGPLAN International Conference on Functional Programming
http://www.sigplan.org/OpenTOC/icfp16.html
フェイスブック、レディっと、ラムダザウルチメイトなどの良く知られた媒体でも
事前告知や事後報告があると思う
2017/09/10(日) 00:33:58.75ID:et8drD+r
>>947
指摘を受けて、もしかしてと思い、改めて公式サイトの中を探してみましたら、
paper は公開されていることが分かりました。

過去のも見てみましたら、去年のもの paper にはアクセスできるようでした。
(その前のは公式からはリンクは張られていない模様)
video も年によってはリンクが張られていたりします。

なかなかぱっと見では分かりにくいところにリンクがあるのですが、
やはり探し方が悪かったみたいでお恥ずかしいです。


ちなみに、ICFP は国際的な関数型言語の会議です。
使う側、処理系側双方の最新情報を発表したり、
ワークショップが開かれていたりします。
949デフォルトの名無しさん
垢版 |
2017/09/11(月) 00:32:10.78ID:Xe2WUSa/
問題解決もしくは近づいたのなら何よりです
2017/09/11(月) 23:17:06.08ID:NiRp1zJ5
Haskellの正規表現ってどのライブラリを使うのが無難?
Text.Regex.Posixをimportしようとすると、Text.Regex.BaseかText.Regex.PCREの間違いじゃね?って言われて困惑
951デフォルトの名無しさん
垢版 |
2017/09/13(水) 18:15:30.36ID:15e8c4wP
(´・ω・`)あのー
なにかおすすめの参考書ありませんか?
初心者です
むちゃくちゃ簡単でやさしく書いてるのが良いです
アマゾンで見つけて最近出たみたいなんだけどこれはどうなの?



Haskellによる関数プログラミングの思考法 https://www.amazon.co.jp/dp/4048930532/ref=cm_sw_r_cp_api_ozpUzbZS57HY2
2017/09/13(水) 19:15:57.75ID:jV0bEQ9+
正直Haskellで「簡単でやさしく」は無理です
諦めてすごいH本やHaskellWikI,Hoogleや各種書籍、サイトを何度も往復して苦しみながら覚えてください
953デフォルトの名無しさん
垢版 |
2017/09/13(水) 19:18:52.25ID:15e8c4wP
(´・ω・`)はい
2017/09/13(水) 19:53:59.78ID:4h5PMlCQ
すごいHaskell楽しくなんとかって奴がいいらしいよ
あとリアルワールドHaskell
2017/09/14(木) 00:00:37.91ID:55xYcYks
https://ja.wikipedia.org/wiki/%E3%83%8F%E3%83%BC%E3%83%89%E3%82%A6%E3%82%A7%E3%82%A2%E8%A8%98%E8%BF%B0%E8%A8%80%E8%AA%9E

HaskellベースのHDLってけっこう 多いのな
ビックリした
2017/09/14(木) 01:28:21.76ID:kgKbKDJJ
>>951
他の人も書いてるけどやはり「すごいHaskell」がとっつきやすさは高いと思う
それでいて内容もちゃんとしている
「関数プログラミングの思考法」もいい本だとは思うのだが
目的がアルゴリズムデザインとかの方面であんまり初心者向けっぽくない
957デフォルトの名無しさん
垢版 |
2017/09/14(木) 06:01:32.83ID:yKCuCAfu
>>954
>>956
(´・ω・`)すごいHaskell読んでみます
ありがとー
2017/09/14(木) 09:24:06.36ID:ux4IsQoU
英語が読めればwikibooksのやつもどうですか?
自分は"プログラミングHaskell"から入ったので初見じゃないですが、良さげに見えます。
内容も定期的に更新かかってますし。
2017/09/14(木) 10:02:22.29ID:Yrr+4vGX
「しゅごいHaskell」はダブルVサイン出しながら
読まなきゃいかんのでキーボードが打てない
2017/09/14(木) 16:15:03.19ID:fLwKChPf
What does it mean?
2017/09/14(木) 23:15:23.23ID:BKIQZ2N0
He probably meant Haskell wikibook page is upto dated. And that is also why I recommend it for beginners too.
2017/09/15(金) 08:29:13.24ID:K8WAqD4o
>>957
あなたがそもそも関数型プログラミングに慣れ親しんでいないのであれば、まずはそこが第一の壁となるでしょう
まずはリストをメインに再帰やマッピング、畳み込みといった操作に慣れましょう
またHaskellはデフォルトでカリー化されているのでその妙味も十分に味わいましょう

次に壁となるのは、型や型クラスでしょうか?
ここではクラスやインスタンスといった単語が出てきますが、それらはいわゆるオブジェクト指向で使われているものとは意味が全く違うので注意してください
型に慣れ親しみ、常に適切な型を選択できるよう意識してください
そうすればコンパイラがあなたの強い味方となってくれます

最後に入門者の壁となるのは、おそらくモナドでしょう
モナドは数学の圏論由来の概念ですが、別段圏論に詳しくある必要はありません
基本的な部分では、モナドは単なる文脈であり、文脈を表すためのコンテナです
しかし、それ以上に高度で抽象的なことをやろうとすると、その理解では行き詰まるかもしれません
そんなときは、圏論に軽く触れてみるのもいいでしょう
少なくともかの有名な
「モナドは単なる自己関手の圏におけるモノイド対象だよ。何か問題でも?」
をざっくりとでもいいので理解できれば、新たな視界が開けると思います

Haskellは簡単な言語でもやさしい言語でもありませんが、その代わり高度に抽象化された、バグの少ないプログラミングが可能です
あなたの成功を心より祈っています
2017/09/15(金) 08:57:14.76ID:8dqnOzco
歳を取って反射神経鈍ってくると一々詳細を語るのが億劫になって抽象的なまま話を進めたくなるよね
Haskellは抽象的にプログラミングするインフラを整備している?
2017/09/15(金) 18:00:40.28ID:d/L5NKte
Map a (Map b c)

Map (a,b) c


どっちが速いかみんな一度は悩んだことあると思う
2017/09/15(金) 22:35:43.14ID:znUIhbu+
悩まんでしょ
2017/09/15(金) 22:47:16.31ID:eUG8Jdoq
コンパイルしたらどうせ一緒になると思って適当に書いてたけど、変わるの?
2017/09/15(金) 23:09:08.09ID:4fuQ9N5K
Mapは平衡二分探索木だから各Map b cのサイズに開きがあると遅くなるね
2017/09/16(土) 13:16:45.55ID:u+a6R9+A
newtype F a b c = F (Map a (Map b c))
newtype G a b c = G (Map (a, b) c)

これでFとGはどうせ一緒のクラスになる
こういうポリモーフィズムの意味がわかってる人は速さで悩まない
2017/09/16(土) 15:43:07.25ID:QR311jcD
それは実装を隠蔽しただけで速さの悩みを解決したわけではないのでは…
もちろん実装を隠蔽しておいて後でより速い実装に
容易に交換できるようにしておくのは大変有用だが
2017/09/16(土) 20:52:50.94ID:u+a6R9+A
pi :: Floating a => a

円周率piの値を隠蔽し精度の悩みを解決
2017/09/16(土) 21:24:55.55ID:MfZyyhcD
今更だけど、いつの間にか cabal のバージョンが 1 から 2 になってる

なんか大きく変わったの?
972デフォルトの名無しさん
垢版 |
2017/09/17(日) 08:09:36.24ID:QPoZRnuU
>>4にある解説ページをちらっとみた
たしかに数式に似た感じでものすごく簡単に書けるみたいだね
たしかに直感的だとおもった
2017/09/21(木) 22:09:47.22ID:1QLcw3LX
haskellコンパイラはユーザ定義のモナドが
モナド則満たすことを
チェックしてくれない所がウンコ
2017/09/21(木) 23:00:55.55ID:gD1zcn0E
そんな超能力コンパイラがあるですか?
2017/09/21(木) 23:55:50.59ID:Y0fSMmUh
QuickCheck的なのがコンパイル時に走ってチェックしてくれたりするように
そのうちならないかなー
2017/09/21(木) 23:58:25.67ID:h/TDh704
モナドを自作したことがないから後学のためにどういう状況でどういうモナドを自作すると効率的なのか教えていただけると幸いです
2017/09/22(金) 00:28:53.04ID:kX95feab
適当に型を作ってたら実はモナドだった、みたいな
2017/09/22(金) 16:55:50.20ID:xffnPG6j
原理的にモナド則のチェックの自動化は不可能なの?
圏論マスターでも無理なの?
2017/09/22(金) 17:04:50.24ID:uYwUnAnO
ゲーデルさんに聞けばわかるかも。
2017/09/22(金) 17:56:16.78ID:4/60bB6Q
ユーザが書いたモナドであることの形式的証明を
検証出来る処理系なら有るはず。
Coq辺り。
2017/09/22(金) 19:52:40.81ID:uE400tii
Vectorパッケージで、基本Unboxedにして、
Unboxedに出来なければBoxedにする、
途中でUnboxedにできるなら戻す、
でのを手でやってるのですが、スマートなやり方ってありますか?
2017/09/23(土) 02:53:52.53ID:7lhkarx+
QuickSpecならなんとかしてくれる
かもしれない
2017/09/23(土) 20:42:11.20ID:WVPJPMdD
stack プロジェクト内の cabal ファイルの build-depends の項に sdl2 を書き込んで、stack build コマンドを実行しました。
すると、sdl2 パッケージのビルドでエラーが出て、「-fPCI を付けて再コンパイルしてください」と出力されました。
そこで stack build --ghc-options="-fPIC" コマンドを実行してみました。
しかし、それでも同様のエラーが起き、ビルドできません。

stack による sdl2 パッケージを利用するプログラムをビルドするにはどうすれば良いでしょうか。
2017/09/23(土) 21:51:07.20ID:58d35SiT
>>983
stack.yaml に、
ghc-options:
sdl2: -fPIC
を追記すればOK。たぶん。
https://github.com/commercialhaskell/stack/blob/master/doc/yaml_configuration.md#ghc-options
2017/09/23(土) 22:50:55.76ID:WVPJPMdD
>>984
やってみましたが、結果は変わりませんでした。

今使っている lts-9.5 の snapshot が
~/.stack/snapshot/x86_64-linux-tinfo6-nopie/lts-9.5
にあるのですが、nopie とあり、何か問題に関係ありそうなのですが、どうでしょうか。
2017/09/23(土) 23:32:36.23ID:58d35SiT
>>985
うーん、なんだかよくわからないけど、リンクフェーズで”recompile with -fPIC”と言われてしまう問題が報告されていて
https://github.com/commercialhaskell/stack/issues/2712
https://docs.haskellstack.org/en/stable/faq/#i-get-strange-ld-errors-about-recompiling-with-fpic
これによると、Arch Linux では ncurses5-compat-libs をインストールすると直るらしい。
2017/09/24(日) 10:57:49.47ID:G5x2bhDn
>>986
とりあえず先に進めるようになりました。
アドバイスありがとうございました。

たしかに私は ArchLinux を使っています。
Haskell の問題にディストリビューションの違いが絡んでくるとは考えていませんでした。

はじめ ncurses5-compat-libs をインストールしただけでは解決されませんでした。
(ログインし直しても)

そこで stack を一度綺麗にアンインストールしてから再インストールし、
それでもダメで、更にビルド時に -fPIC オプションを付けたらエラー無く通りました。

何が原因で処置がどう働いてこういう結果になったのか、まだ何となくでしか分かりませんが、
とにかく SDL を用いたプログラムを試すことができるようになり良かったです。
2017/09/25(月) 22:51:00.48ID:xypOJPnn
集合Aと整数mを引数に取り、Aの可能なm分割全体から成る集合Mを返す関数を作りたいです。
(m分割とは集合論的にm個の集合に分割することとする)

例:
集合 A = {a, b, c, d} と m=2 を引数に取ると、下記の集合Mを返す。
M = {{{a}, {b,c,d}}, {{b}, {a,c,d}}, {{c}, {a,b,d}}, {{d}, {a,b,c}}
, {{a,b}, {c,d}}, {{a,c}, {b,d}}, {{a,d}, {b,c}} }

集合を表す型は何でも良いです。
Data.List でも Data.Set でも、その他の型でも。

Haskell で効率よく書けるでしょうか。
ここでいう効率とは、空間よりも時間を優先します。
空間も小さければ尚良いですし、ソースが綺麗ならいっそう良いです。

かれこれ一週間ほど考えていますが (と言っても四六時中ではありませんが)、
なかなか良いアイデアが浮かびません。

前もって言っておきますが、実際の集合Aのサイズはせいぜい20程度で、分割数も2に固定です。
質問のきっかけとなった問題は愚直に実装して解決しました。
なので、この質問は純粋に頭の体操、ゲームです。
2017/09/26(火) 00:11:58.02ID:lGqC8DP/
集合の任意の要素m個(nCm)に1〜mの番号を重複なく振る(順列m!)、残りの要素に1〜mの番号を適当に振る(m^(n-m))
レス数が950を超えています。1000を超えると書き込みができなくなります。
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況