1 名前:デフォルトの名無しさん mailto:sage [2017/01/15(日) 23:43:54.28 ID:Vh4eztBk.net] 関数型プログラミング言語 Haskell について語るスレです。 haskell.org (公式サイト) www.haskell.org/ 前スレ 関数型プログラミング言語Haskell Part28 echo.2ch.net/test/read.cgi/tech/1428597032/
985 名前:デフォルトの名無しさん mailto:sage [2017/09/21(木) 23:00:55.55 ID:gD1zcn0E.net] そんな超能力コンパイラがあるですか?
986 名前:デフォルトの名無しさん mailto:sage [2017/09/21(木) 23:55:50.59 ID:Y0fSMmUh.net] QuickCheck的なのがコンパイル時に走ってチェックしてくれたりするように そのうちならないかなー
987 名前:デフォルトの名無しさん mailto:sage [2017/09/21(木) 23:58:25.67 ID:h/TDh704.net] モナドを自作したことがないから後学のためにどういう状況でどういうモナドを自作すると効率的なのか教えていただけると幸いです
988 名前:デフォルトの名無しさん mailto:sage [2017/09/22(金) 00:28:53.04 ID:kX95feab.net] 適当に型を作ってたら実はモナドだった、みたいな
989 名前:デフォルトの名無しさん mailto:sage [2017/09/22(金) 16:55:50.20 ID:xffnPG6j.net] 原理的にモナド則のチェックの自動化は不可能なの? 圏論マスターでも無理なの?
990 名前:デフォルトの名無しさん mailto:sage [2017/09/22(金) 17:04:50.24 ID:uYwUnAnO.net] ゲーデルさんに聞けばわかるかも。
991 名前:デフォルトの名無しさん mailto:sage [2017/09/22(金) 17:56:16.78 ID:4/60bB6Q.net] ユーザが書いたモナドであることの形式的証明を 検証出来る処理系なら有るはず。 Coq辺り。
992 名前:デフォルトの名無しさん mailto:sage [2017/09/22(金) 19:52:40.81 ID:uE400tii.net] Vectorパッケージで、基本Unboxedにして、 Unboxedに出来なければBoxedにする、 途中でUnboxedにできるなら戻す、 でのを手でやってるのですが、スマートなやり方ってありますか?
993 名前:デフォルトの名無しさん mailto:sage [2017/09/23(土) 02:53:52.53 ID:7lhkarx+.net] QuickSpecならなんとかしてくれる かもしれない
994 名前:デフォルトの名無しさん mailto:sage [2017/09/23(土) 20:42:11.20 ID:WVPJPMdD.net] stack プロジェクト内の cabal ファイルの build-depends の項に sdl2 を書き込んで、stack build コマンドを実行しました。 すると、sdl2 パッケージのビルドでエラーが出て、「-fPCI を付けて再コンパイルしてください」と出力されました。 そこで stack build --ghc-options="-fPIC" コマンドを実行してみました。 しかし、それでも同様のエラーが起き、ビルドできません。 stack による sdl2 パッケージを利用するプログラムをビルドするにはどうすれば良いでしょうか。
995 名前:デフォルトの名無しさん mailto:sage [2017/09/23(土) 21:51:07.20 ID:58d35SiT.net] >>983 stack.yaml に、 ghc-options: sdl2: -fPIC を追記すればOK。たぶん。 https://github.com/commercialhaskell/stack/blob/master/doc/yaml_configuration.md#ghc-options
996 名前:デフォルトの名無しさん mailto:sage [2017/09/23(土) 22:50:55.76 ID:WVPJPMdD.net] >>984 やってみましたが、結果は変わりませんでした。 今使っている lts-9.5 の snapshot が ~/.stack/snapshot/x86_64-linux-tinfo6-nopie/lts-9.5 にあるのですが、nopie とあり、何か問題に関係ありそうなのですが、どうでしょうか。
997 名前:デフォルトの名無しさん mailto:sage [2017/09/23(土) 23:32:36.23 ID:58d35SiT.net] >>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 をインストールすると直るらしい。
998 名前:デフォルトの名無しさん mailto:sage [2017/09/24(日) 10:57:49.47 ID:G5x2bhDn.net] >>986 とりあえず先に進めるようになりました。 アドバイスありがとうございました。 たしかに私は ArchLinux を使っています。 Haskell の問題にディストリビューションの違いが絡んでくるとは考えていませんでした。 はじめ ncurses5-compat-libs をインストールしただけでは解決されませんでした。 (ログインし直しても) そこで stack を一度綺麗にアンインストールしてから再インストールし、 それでもダメで、更にビルド時に -fPIC オプションを付けたらエラー無く通りました。 何が原因で処置がどう働いてこういう結果になったのか、まだ何となくでしか分かりませんが、 とにかく SDL を用いたプログラムを試すことができるようになり良かったです。
999 名前:デフォルトの名無しさん mailto:sage [2017/09/25(月) 22:51:00.48 ID:xypOJPnn.net] 集合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に固定です。 質問のきっかけとなった問題は愚直に実装して解決しました。 なので、この質問は純粋に頭の体操、ゲームです。
1000 名前:デフォルトの名無しさん mailto:sage [2017/09/26(火) 00:11:58.02 ID:lGqC8DP/.net] 集合の任意の要素m個(nCm)に1〜mの番号を重複なく振る(順列m!)、残りの要素に1〜mの番号を適当に振る(m^(n-m))
1001 名前:デフォルトの名無しさん mailto:sage [2017/09/26(火) 07:15:14.90 ID:YKUYL+7U.net] >>989 その方法ですと重複が起きます。 極端な話、集合 {a, b} を 2 つに分割する場合、 番号 1 と番号 2 を重複無く振る方法は2通りあります。 1. a=1、b=2 2. a=2、b=1 残りの要素は無いのでそのまま目的の集合を作ると、 どちらの方法で作っても同じ集合 {{{1}, {2}}} になります。 最後に重複をまとめて排除するのでしょうか。
1002 名前:デフォルトの名無しさん mailto:sage [2017/09/26(火) 07:27:48.34 ID:8PxDtYJG.net] 部分集合作って差集合とのタプルにして最後に重複省くくらいしか思いつけない
1003 名前:デフォルトの名無しさん [2017/09/26(火) 07:50:17.87 ID:gfUhXOzb.net] {a, b, c, d, e}でm=3なら {a, b, c, d}でm=3のときの答えのリストにmap(:)'e' それに加えて、{a, b, c}でm=2のときの答えに(:)'e' 集合の長さとmが同じならそのまま返す みたいな感じじゃダメ?
1004 名前:デフォルトの名無しさん [2017/09/26(火) 07:51:32.23 ID:gfUhXOzb.net] 訂正 {a, b, c, d}でm=2のときの答えに(:)'e'
1005 名前:デフォルトの名無しさん mailto:sage [2017/09/26(火) 10:27:56.68 ID:g1C4tf16.net] >>992 >>993 要素数5でm=3なら、結果の集合の要素数は25ですけど、 その方法で25個すべて出ます?
1006 名前:デフォルトの名無しさん mailto:sage [2017/09/26(火) 10:46:10.91 ID:cHfS1yYI.net] inter :: a -> [[a]] -> [[[a]]] inter x = go where go [] = [] go (y:ys) = ((x:y):ys) : map (y:) (go ys) part :: Int -> [a] ->[[[a]]] part _ [] = [] part 1 xs = [[xs]] part k (x:xs) = map ([x]:) prev_ks ++ concatMap (inter x) ks where prev_ks = part (k-1) xs ks = part k xs main = print $ part 3 [1..4]
1007 名前:デフォルトの名無しさん mailto:sage [2017/09/26(火) 21:54:38.15 ID:YKUYL+7U.net] >>995 素晴らしいです。 正直 >>992 の時点では意味が分からなかったです。 (答えに (:a)'e' とか) コード見て意味が分かりました。
1008 名前:デフォルトの名無しさん mailto:.sage [2017/09/26(火) 23:41:18.71 ID:pHNMsW6Q.net] n個の異なる要素のリストから[3,3,4,1,8,...]などとサイズ指定リストに従って分割するときの全列挙をするにはどうしますか? 分割はサイズ以外に見分けはつかないものとします [[a,b,c],[d,e,f]] と [[d,e,f],[a,b,c]]はダブルカウントです
1009 名前:デフォルトの名無しさん mailto:sage [2017/09/26(火) 23:55:56.84 ID:LAGAI/jv.net] 分割の言葉のお前の定義からきかせてもらおうか。英語でok
1010 名前:デフォルトの名無しさん mailto:sage [2017/09/27(水) 00:47:00.32 ID:wiD7jN/4.net] bunkatsu "abcdefghij" [1,2,3,4] なら [["a","bc","def","ghij"],...みたいにです
1011 名前:デフォルトの名無しさん mailto:sage [2017/09/27(水) 01:19:52.15 ID:iTQClNYA.net] >>999 listl take 自然変換
1012 名前:1001 [Over 1000 Thread.net] このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。 life time: 254日 1時間 35分 58秒
1013 名前:過去ログ ★ [[過去ログ]] ■ このスレッドは過去ログ倉庫に格納されています