-
プログラム
-
関数型プログラミング言語Haskell Part30 [無断転載禁止]©2ch.net
-
UPLIFTで広告なしで体験しましょう!快適な閲覧ライフをお約束します!
関数型プログラミング言語 Haskell について語るスレです。
haskell.org (公式サイト)
http://www.haskell.org/
前スレ
関数型プログラミング言語Haskell Part28
http://echo.2ch.net/...cgi/tech/1428597032/ - コメントを投稿する
-
(´・ω・`)はい
-
すごいHaskell楽しくなんとかって奴がいいらしいよ
あとリアルワールドHaskell -
>>951
他の人も書いてるけどやはり「すごいHaskell」がとっつきやすさは高いと思う
それでいて内容もちゃんとしている
「関数プログラミングの思考法」もいい本だとは思うのだが
目的がアルゴリズムデザインとかの方面であんまり初心者向けっぽくない -
英語が読めればwikibooksのやつもどうですか?
自分は"プログラミングHaskell"から入ったので初見じゃないですが、良さげに見えます。
内容も定期的に更新かかってますし。 -
「しゅごいHaskell」はダブルVサイン出しながら
読まなきゃいかんのでキーボードが打てない -
What does it mean?
-
He probably meant Haskell wikibook page is upto dated. And that is also why I recommend it for beginners too.
-
>>957
あなたがそもそも関数型プログラミングに慣れ親しんでいないのであれば、まずはそこが第一の壁となるでしょう
まずはリストをメインに再帰やマッピング、畳み込みといった操作に慣れましょう
またHaskellはデフォルトでカリー化されているのでその妙味も十分に味わいましょう
次に壁となるのは、型や型クラスでしょうか?
ここではクラスやインスタンスといった単語が出てきますが、それらはいわゆるオブジェクト指向で使われているものとは意味が全く違うので注意してください
型に慣れ親しみ、常に適切な型を選択できるよう意識してください
そうすればコンパイラがあなたの強い味方となってくれます
最後に入門者の壁となるのは、おそらくモナドでしょう
モナドは数学の圏論由来の概念ですが、別段圏論に詳しくある必要はありません
基本的な部分では、モナドは単なる文脈であり、文脈を表すためのコンテナです
しかし、それ以上に高度で抽象的なことをやろうとすると、その理解では行き詰まるかもしれません
そんなときは、圏論に軽く触れてみるのもいいでしょう
少なくともかの有名な
「モナドは単なる自己関手の圏におけるモノイド対象だよ。何か問題でも?」
をざっくりとでもいいので理解できれば、新たな視界が開けると思います
Haskellは簡単な言語でもやさしい言語でもありませんが、その代わり高度に抽象化された、バグの少ないプログラミングが可能です
あなたの成功を心より祈っています -
歳を取って反射神経鈍ってくると一々詳細を語るのが億劫になって抽象的なまま話を進めたくなるよね
Haskellは抽象的にプログラミングするインフラを整備している? -
Map a (Map b c)
Map (a,b) c
どっちが速いかみんな一度は悩んだことあると思う -
悩まんでしょ
-
コンパイルしたらどうせ一緒になると思って適当に書いてたけど、変わるの?
-
Mapは平衡二分探索木だから各Map b cのサイズに開きがあると遅くなるね
-
newtype F a b c = F (Map a (Map b c))
newtype G a b c = G (Map (a, b) c)
これでFとGはどうせ一緒のクラスになる
こういうポリモーフィズムの意味がわかってる人は速さで悩まない -
それは実装を隠蔽しただけで速さの悩みを解決したわけではないのでは…
もちろん実装を隠蔽しておいて後でより速い実装に
容易に交換できるようにしておくのは大変有用だが -
pi :: Floating a => a
円周率piの値を隠蔽し精度の悩みを解決 -
今更だけど、いつの間にか cabal のバージョンが 1 から 2 になってる
なんか大きく変わったの? -
haskellコンパイラはユーザ定義のモナドが
モナド則満たすことを
チェックしてくれない所がウンコ -
そんな超能力コンパイラがあるですか?
-
QuickCheck的なのがコンパイル時に走ってチェックしてくれたりするように
そのうちならないかなー -
モナドを自作したことがないから後学のためにどういう状況でどういうモナドを自作すると効率的なのか教えていただけると幸いです
-
適当に型を作ってたら実はモナドだった、みたいな
-
原理的にモナド則のチェックの自動化は不可能なの?
圏論マスターでも無理なの? -
ゲーデルさんに聞けばわかるかも。
-
ユーザが書いたモナドであることの形式的証明を
検証出来る処理系なら有るはず。
Coq辺り。 -
Vectorパッケージで、基本Unboxedにして、
Unboxedに出来なければBoxedにする、
途中でUnboxedにできるなら戻す、
でのを手でやってるのですが、スマートなやり方ってありますか? -
QuickSpecならなんとかしてくれる
かもしれない -
stack プロジェクト内の cabal ファイルの build-depends の項に sdl2 を書き込んで、stack build コマンドを実行しました。
すると、sdl2 パッケージのビルドでエラーが出て、「-fPCI を付けて再コンパイルしてください」と出力されました。
そこで stack build --ghc-options="-fPIC" コマンドを実行してみました。
しかし、それでも同様のエラーが起き、ビルドできません。
stack による sdl2 パッケージを利用するプログラムをビルドするにはどうすれば良いでしょうか。 -
>>983
stack.yaml に、
ghc-options:
sdl2: -fPIC
を追記すればOK。たぶん。
https://github.com/c...ation.md#ghc-options -
>>984
やってみましたが、結果は変わりませんでした。
今使っている lts-9.5 の snapshot が
~/.stack/snapshot/x86_64-linux-tinfo6-nopie/lts-9.5
にあるのですが、nopie とあり、何か問題に関係ありそうなのですが、どうでしょうか。 -
>>985
うーん、なんだかよくわからないけど、リンクフェーズで”recompile with -fPIC”と言われてしまう問題が報告されていて
https://github.com/c...ll/stack/issues/2712
https://docs.haskell...ecompiling-with-fpic
これによると、Arch Linux では ncurses5-compat-libs をインストールすると直るらしい。 -
>>986
とりあえず先に進めるようになりました。
アドバイスありがとうございました。
たしかに私は ArchLinux を使っています。
Haskell の問題にディストリビューションの違いが絡んでくるとは考えていませんでした。
はじめ ncurses5-compat-libs をインストールしただけでは解決されませんでした。
(ログインし直しても)
そこで stack を一度綺麗にアンインストールしてから再インストールし、
それでもダメで、更にビルド時に -fPIC オプションを付けたらエラー無く通りました。
何が原因で処置がどう働いてこういう結果になったのか、まだ何となくでしか分かりませんが、
とにかく SDL を用いたプログラムを試すことができるようになり良かったです。 -
集合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に固定です。
質問のきっかけとなった問題は愚直に実装して解決しました。
なので、この質問は純粋に頭の体操、ゲームです。 -
集合の任意の要素m個(nCm)に1〜mの番号を重複なく振る(順列m!)、残りの要素に1〜mの番号を適当に振る(m^(n-m))
-
>>989
その方法ですと重複が起きます。
極端な話、集合 {a, b} を 2 つに分割する場合、
番号 1 と番号 2 を重複無く振る方法は2通りあります。
1. a=1、b=2
2. a=2、b=1
残りの要素は無いのでそのまま目的の集合を作ると、
どちらの方法で作っても同じ集合 {{{1}, {2}}} になります。
最後に重複をまとめて排除するのでしょうか。 -
部分集合作って差集合とのタプルにして最後に重複省くくらいしか思いつけない
-
{a, b, c, d, e}でm=3なら
{a, b, c, d}でm=3のときの答えのリストにmap(:)'e'
それに加えて、{a, b, c}でm=2のときの答えに(:)'e'
集合の長さとmが同じならそのまま返す
みたいな感じじゃダメ? -
訂正
{a, b, c, d}でm=2のときの答えに(:)'e' -
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] -
n個の異なる要素のリストから[3,3,4,1,8,...]などとサイズ指定リストに従って分割するときの全列挙をするにはどうしますか?
分割はサイズ以外に見分けはつかないものとします
[[a,b,c],[d,e,f]]
と
[[d,e,f],[a,b,c]]はダブルカウントです -
分割の言葉のお前の定義からきかせてもらおうか。英語でok
-
bunkatsu "abcdefghij" [1,2,3,4]
なら
[["a","bc","def","ghij"],...みたいにです -
>>999
listl take 自然変換 -
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。
life time: 254日 1時間 35分 58秒 -
2ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。
───────────────────
《プレミアム会員の主な特典》
★ 2ちゃんねる専用ブラウザからの広告除去
★ 2ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────
会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。
▼ プレミアム会員登録はこちら ▼
https://premium.2ch.net/
▼ 浪人ログインはこちら ▼
https://login.2ch.net/login.php
↑今すぐ読める無料コミック大量配信中!↑