サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
Pixel 9
www.kotha.net
GHCはびっくりパターンと呼ばれるパターン照合の拡張をサポートしている。これは!patと書く。びっくりパターンはHaskell Primeへの採用が検討されている。Haskell primeの特徴まとめには、以下にあるのよりも多くの議論と例が載っている。 鍵となる変更は、Haskell98レポート中のパターン照合の意味論(和訳)に規則を一つ追加するというものである。第十項目として次を付け加える。「パターン!patの値vへの照合は、次のように振る舞う」 この拡張の要点は、パターンの構文に一つの新しい生成規則を追加することである。 pat ::= !pat 式eをパターン!pに対して照合するとき、まずeが(WHNFまで)評価され、その結果がpに対して照合される。例を挙げる。 f1 !x = True この定義では、f1がxについて正格になっている。びっくりパターンがなければ遅延であったところだ
Template HaskellはHaskellでコンパイル時メタプログラミングをすることを可能にする。主要な技術的革新の背景は"Template Meta-programming for Haskell" (Proc Haskell Workshop 2002)で議論されている。 Template Haskellに関するwikiページがhttp://www.haskell.org/haskellwiki/Template_Haskell/にある。また、オンラインHaskellライブラリリファレンスを参照することもできる(Language.Haskell.THというモジュールを探すと良い)。元の設計からの多くの変更点がNotes on Template Haskell version 2に記されている。しかし、これらの変更点が全てGHCにある訳ではない。 下(7.14.2. Templat
あなたのHaskellプログラムを速くするのにあたって、鍵となる道具はGHCのプロファイル機能である。これは別途第5章. プロファイルを取るで説明されている。プログラムが時間/空間をどこで使っているのかについて実際のこと(あなたがどんな風に想像しているかではなくて)を知ることにおいて、プロファイルを取ることに代わるものは存在しない。 もう一つ銘記すべきことだが、プログラムの性能を劇的に向上させるための圧倒的に良い方法は、より良いアルゴリズムを使うことである。プロファイルによってどこが時間を食っているかが分かったら、下に書いてあるもろもろの調整を試みる前に、プログラムについて再考した方が良いだろう。 プログラムを速くするためのもう一つの極めて効率的な方法は、誰か別の人によって真剣に調整されたライブラリコードを使うことである。Data.Listにあるのよりも良いクイックソートを書くことはできる
栄光のグラスゴーHaskellコンパイルシステム利用の手引き バージョン7.6.2The GHC Team目次 The Glasgow Haskell Compiler License1. 参考訳1. GHCの紹介1.1. GHCを入手する1.2. メタ情報: ウェブサイト、メーリングリストなど1.3. GHCのバグを報告する1.4. GHCのバージョン番号付け規則1.5. Release notes for version 7.6.11.5.1. Highlights1.5.2. Full details1.5.2.1. Language1.5.2.2. Compiler1.5.2.3. GHCi1.5.2.4. Template Haskell1.5.2.5. Runtime system1.5.2.6. Build system1.5.3. Libraries1.5.3.1. arr
リアクティブプログラミングって何? 時刻によって変化する値を使って計算する x = mouse_position.x y = mouse_position.y sum = x + y printf("(%d, %d); sum=%d", x, y, sum) 入力が変わるたびに再計算 用途: UI、シミュレーションなど Haskell/ML上のリアクティブプログラミング Behavior a: 時刻によって変化する値(中身a型) Event a: 繰り返し発生し得るイベント(a型の値が付属) mousePosition :: Behavior (Int, Int) mouseClick :: Event () コンビネータ mapB :: (a -> b) -> Behavior a -> Behavior b mapE :: (a -> b) -> Event a -> Event b
例えば、putStrLn :: String -> IO ()に注意すると、次のようになる。 Prelude> putStrLn "hello" hello Prelude> do { putStrLn "hello"; return "yes" } hello "yes" GHCiは実際には単なる式ではなく文を受け付ける。そのため、値や関数を名前に束縛して、後で式や文の中で使うことができる。 GHCiプロンプトが受け付ける文の構文は、Haskellのdo式における文の構文と全く同じである。ただし、こちらにはモナドの多重定義はない。プロンプトに入力される文はIOモナドの中になければならない。 Prelude> x <- return 42 Prelude> print x 42 Prelude> x <- return 42という文は、「return 42をIOモナドの中で実行し、結果をx
GHCは、並行プログラミングおよび並列プログラミングに対応するための、Haskellへの大規模な拡張をいくつか実装している。まず用語をはっきりさせておこう。 並列性(parallelism)とは、実行性能の向上を目的として、Haskellプログラムを複数のプロセッサ上で走らせることである。理想的には、これは不可視に、意味を変更することなく為されるべきである。 並行性(concurrency)とは、それぞれIOを行う複数のスレッドを使ってプログラムを実装することである。確かに並行Haskellプログラムは並列な機械上で走らせることができるが、並行性を使うのは、第一目的として実行性能を得るためではなく、それが当該プログラムを書くための最も単純で最も直接的な方法だからである。スレッドは入出力を行うので、プログラムの意味は必然的に非決定的なものになる。
GHCiは単純な命令的スタイルのデバッガを搭載していて、実行中の計算を停めて変数の値を確かめることができる。このデバッガはGHCiに統合されており、デフォルトで有効になっている。デバッグ機能を使うのにフラグは必要ない。一つ、重要な制限があって、ブレークポイントとステップ実行は解釈実行されているモジュールでしか使えない。コンパイル済みコードはデバッガからは見えない[5]。 このデバッガは以下のものを提供する。 プログラム中の関数定義や式にブレークポイントを設定する能力。その関数が呼ばれたとき、あるいはその式が評価されたとき、GHCiは実行を中断してプロンプトに戻る。そこで、実行を続ける前に、局所変数の値を調べることができる。 ステップ実行ができる。評価器は、簡約をだいたい一回行うごとに実行を一時停止し、局所変数を調べることができるようにする。これはプログラムのあらゆる地点にブレークポイントを
パッケージとは、Haskellモジュールから成るライブラリで、コンパイラが把握している。GHCにはいくつかのパッケージが付属している。同梱のライブラリ説明書(訳注: 未訳。web上の最新版)を見よ。また、HackageDBから別のライブラリを入手してインストールすることができる。 パッケージを使う手順はこの上なく単純である。––makeやGHCiを使っているなら、インストール済みパッケージの大部分を余分なオプションなしでプログラムから使うことができる。例外は下記4.9.1. パッケージを使う で説明されている。 自分のパッケージをビルドするのもとても簡単な作業である。我々が提供するCabalインフラストラクチャがパッケージの設定、ビルド、インストール及び配布を自動化する。必要なのは、単純な設定ファイルを書き、いくつかのファイルを正しい場所に置くことだけである。詳細はCabal説明書(訳注:
この節では、GHCがどんなファイルを見つけ、どんなファイルを作るか、それらのファイルはどこに置かれるか、この振る舞いに影響を与えるオプションは何か、を解説する。 この節は階層的モジュールを念頭において書かれていることに注意。(7.3.4. 階層的モジュールを見よ) 階層的モジュールはHaskell98への拡張で、モジュール名がドット「.」を含むことができるようにする。したがって、非階層的なモジュールは、モジュール名がドットを含まないという特別の場合になる。 パス名に関する慣習はシステムごとに異なる。特に、ディレクトリの区切りはUnixシステムでは「/」であり、Windowsシステムでは「\」である。以降の節では、一貫して「/」をディレクトリ区切りとして用いる。あなたのシステムにおける適切な文字に置き換えて読んでほしい。 全てのHaskellソースモジュールは専用のファイルに置かれているべき
GHCiのコマンドは全て「:」ではじまり、一つのコマンド名とそれに続く零個以上のパラメータから成る。コマンド名は短縮することができ、曖昧な場合はより一般的に使われるコマンドが優先される。 :abandon 実行中の評価を捨てる。(ブレークポイントでの停止中のみ有効) :add [*]module ... moduleを現在のターゲット集合に追加し、リロードを行う。通常、可能ならそのモジュールのコンパイル済みコードがロードされ、そうでなければそのモジュールはバイトコードにコンパイルされる。接頭辞*を使うことでモジュールがバイトコードとしてロードされることを強制できる。 :back 履歴中を一つ戻る。2.5.5. 追跡と履歴を見よ。:trace、:history、:forwardも参照。 :break [identifier | [module] line [column]] 指定された関数、
必要呼び Haskellの言語仕様(ja)は式の評価順序を定めていないが、プログラムの計算量を見積もるには具体的な評価戦略を知っている必要がある。といっても事態は単純で、GHCを始めとする有名な処理系は全て「必要呼び(call by need)」という評価戦略を基本にしている。(「Haskellは遅延評価をする言語である」と言われるが、この「遅延評価」という語は必要呼びを指す)。そこで、必要呼びに従った評価を手動で再現することができれば、Haskellプログラムの計算量をおおざっぱに見積もることができる。以下ではその手順を紹介する。 普通の言語の評価戦略は値呼び(call by value)と呼ばれる。値呼びと対比したときの必要呼びの大きな特徴は、関数を呼ぶ際に、引数を未評価のまま渡すことである。次の関数を考える。 inc :: Int -> Int inc n = n + 1 これを使っ
Template HaskellはHaskellでコンパイル時メタプログラミングをすることを可能にする。主要な技術的革新の背景は"Template Meta-programming for Haskell" (Proc Haskell Workshop 2002)で議論されている。 Template Haskellに関するwikiページがhttp://www.haskell.org/haskellwiki/Template_Haskell/にある。また、オンラインHaskellライブラリリファレンスを参照することもできる(Language.Haskell.THというモジュールを探すと良い)。元の設計からの多くの変更点がNotes on Template Haskell version 2に記されている。しかし、これらの変更点が全てGHCにある訳ではない。 下(7.16.2. Templat
オブジェクトレイアウト 通常のHaskellの値(代数的データ型および関数)と、未評価の計算を表すサンクは、全てポインタで参照される。ポインタが指す先は通常はヒープ上のオブジェクトだが、静的セクションに置かれていることもある。いずれにしてもレイアウトは同じで、以下の一般形をとる。 オブジェクトの先頭1ワードは静的領域へのポインタ(infoポインタ)で、この値を評価(関数なら適用)するためのコード(entry code)と、このオブジェクトの種類に関する情報を集積したレコードを指している。なお、GHCにおける1ワードはポインタと同じ大きさ、つまり32ビットOSなら32ビット、64ビットOSなら64ビットである。これはIntの精度と同じでもある。 代数的データ型 代数的データ型の評価済みの値では、infoポインタが構築子の種類を表し、その後に構築子の引数を入れるスロットが続く。したがって、N引
Haskellで速いコードを書くためのヒントを無秩序に集積したもの。環境としてはGHCを想定する。私は高速化について詳しい訳ではないが、思い付いたことはなんでもかんでも書くように心がけたので、運が良ければ何か役に立つ情報があるかもしれない。 並列処理のパフォーマンスについてはこの文章では触れない。まったく経験がないので。同じ理由で、浮動小数点数を多用した数値計算コードの効率化と、書き換え規則を多用する高水準の最適化も扱わない。 お願い: 文中に間違いや分かりにくい部分があれば指摘いただけると有難いです。また、他に載せた方が良さそうな最適化テクニックや、その他の改善提案があれば教えてください。掲示板またはメールまたはTwitter(@mkotha)までお願いします。 目次 基本的なこと 遅延評価の計算量見積もりの方法と、GHCの内部に依存しないテクニック集。入門書を読んだけれども、Haske
ai2011sim Amaryllis the insanity 2011というゲームのシミュレータ。 Haskellコードの高速化 Haskellで速いコードを書くためのヒント集。 雑多なもの ページを作るまでもないような雑多なものです。 m100sim ステッパーズ・ストップの非電子ゲームであるマーガレッド・ハンドレッドの戦闘処理をコンピュータ上で行うためのソフトウェアです。 Cプリプロセッサ上で動作するBrainfuckインタプリタ 「FF12の乱数について」 PS2用ゲームFinal Fantasy XIIの内部的な乱数の扱いについて。 cxxgrass ちょっと草植えときますね型言語Grassのコンパイラ。 tcgsim TCGというアナログゲームのwebシミュレータです。関数型言語を使ってキャラに行動指針を与えることができます。 栄光のグラスゴーHaskellコンパイルシステム
概要 FF12が内部でどのように乱数を扱っているか調べたので、分かったことを書くよ。 目次 概要 表記 注意 導入 生成器Aの特徴 A系列のよくある利用パターン A系列を使う処理 銃 素手 斧、ハンマー、ハンディボムによる攻撃のダメージ計算 ケアル、ケアルダ ポーション、ハイポーション、エクスポーション、エーテル、ハイエーテル トレジャーの開封 セーブデータのロード A系列の乱数を消費しない行動 応用例 乱数位置の特定 5hits法の原理 "セロビ台地/交差ヶ原"のトレジャーPOP法則 分かっていないこと 表記 この文章では以下の規則に従う。 ⌊x⌋で、x以下の整数のうち最大のものを表す。 x % yで、xをyで割った余りを表す。x % y = x - y * ⌊x / y⌋ 注意 この文章では、FF12内の乱数の規則性を観察し、それを制御する方法について述べている。こういうプレイははおそ
Cプリプロセッサ上で実装されたBrainfuckインタプリタです。 $ cat hello.txt # include "bfi.h" BFI_RUN1(x x x x x x x x x (b x x x x x x x x b x x x x x x x x x x x b x x x x x d d d _) b w b x x w x x x x x x x w w x x x w b _ w _ _ _ _ _ _ _ _ _ _ _ _ w d x x x x x x x x w _ _ _ _ _ _ _ _ w x x x w _ _ _ _ _ _ w _ _ _ _ _ _ _ _ w b x w) $ cpp -P hello.txt Hello, world! bfi-0.tar.gz 使い方 "bfi.h"で定義されているBFI_RUNマクロがインタプリタの本体で
-XEmptyDataDeclsフラグ(または同等のLANGUAGEプラグマ)が指定されていると、構築子なしでデータ型を宣言できるようになる。例えば、以下のようにである。 data S -- S :: * data T a -- T :: * -> * 構文的にいうと、この宣言は「= constrs」の部分を欠いている。このように定義される型は多相的でも良く、さらにどのような種について多相的でも良いが、種が*でないなら、明示的な種注釈を使う必要がある。(7.13.5. 明示的に種付けされた量化を見よ) このようなデータ型はボトムというただ一つの値しか持たないが、「幽霊型(phantom type)」を定義するときには便利なことがある。 Haskellは、データ型に文脈を与えることを許している。例えば以下のように。 data Eq a => Set a = NilSet | ConsSet
これは、GHCのマニュアルであるThe Glorious Glasgow Haskell Compilation System User's Guideの非公式な日本語訳です。 翻訳の正確さについては無保証であり、実際あやしいところがいくつかあります。また、内容が最新版を反映していない可能性がかなりあります。バージョン番号に注意してください。 ライセンスは原文のものと同じとします。したがって再配布にあたって訳者の名前を添える必要はありません。 質問、誤りの指摘、およびそれ以外の改善案を歓迎します。掲示板に書きこんで下さい。メールでも構いません。 基本的に、誤りの修正や訳語の変更は最新版のみに行い、以前の版に遡っては修正しません。 xmlの原文はgithubにあります。 www.kotha.net バージョン 最新版置き場 7.8.2 7.6.2 7.6.1 7.4.2 7.4.1 7.2.
この節では、GHCがどんなファイルを見つけ、どんなファイルを作るか、それらのファイルはどこに置かれるか、この振る舞いに影響を与えるオプションは何か、を解説する。 この節は階層的モジュールを念頭において書かれていることに注意。(7.3.5. 階層的モジュールを見よ) 階層的モジュールはHaskell98への拡張で、モジュール名がドット「.」を含むことができるようにする。したがって、非階層的なモジュールは、モジュール名がドットを含まないという特別の場合になる。 パス名に関する慣習はシステムごとに異なる。特に、ディレクトリの区切りはUnixシステムでは「/」であり、Windowsシステムでは「\」である。以降の節では、一貫して「/」をディレクトリ区切りとして用いる。あなたのシステムにおける適切な文字に置き換えて読んでほしい。 全てのHaskellソースモジュールは専用のファイルに置かれているべき
アローはモナドの一般化であり、John Hughesによって導入された。詳細については、以下のものを見よ。 “Generalising Monads to Arrows”, John Hughes, in Science of Computer Programming 37, pp67–111, May 2000。アローを導入した論文である。平易な入門であり、動機付けとしてプログラミングの例が使われている。 “A New Notation for Arrows”, Ross Paterson, in ICFP, Sep 2001。 ここで記述されている記法を導入した。 “Arrows and Computation”, Ross Paterson, in The Fun of Programming, Palgrave, 2003. “Programming with Arrows”, J
GHCi[1]はGHCの対話環境であり、Haskellの式を対話的に評価したりプログラムを解釈実行したりできる。もしあなたがHugsに慣れ親しんでいるなら、GHCiの扱いにもすぐに慣れるだろう。しかしながら、GHCiはコンパイル済みコードをロードすることができ、また、GHCが提供する言語拡張の全て[2]をサポートする。また、GHCiには対話的デバッガが含まれている。(2.5. GHCiデバッガを見よ) GHCiセッションの例を見ていくことから始めよう。GHCiはghciコマンドで起動することができる。 $ ghci GHCi, version 6.12.1: http://www.haskell.org/ghc/ :? for help Loading package ghc-prim ... linking ... done. Loading package integer-gmp ..
-XMagicHashという言語拡張は、識別子に対する後置修飾子として「#」を認めるものである。つまり、「x#」が変数として有効に、「T#」が型構築子やデータ構築子として有効になる。 この井桁記号はまったく意味論に影響を与えない。非ボックス化された値や型に「#」で終わる名前を付ける(たとえばInt#)傾向があるが、必須ではない。これらはただの通常の変数に過ぎないのである。また、拡張-XMagicHashが何かをスコープに導入することもない。例えば、Int#をスコープに導入するためにはGHC.Prim(7.2. 非ボックス化型とプリミティブ演算を見よ)をインポートしなければならない。その後で、スコープに導入されたInt#に言及することを可能にするのが-XMagicHashオプションである。このオプションが有効だと、x#y = 0の意味が変わることに注意。yという引数を一つ取る関数x#を定義す
栄光のグラスゴーHaskellコンパイルシステム利用の手引き バージョン7.8.2 The GHC Team 目次 The Glasgow Haskell Compiler License 1. 参考訳 1. GHCの紹介 1.1. GHCを入手する 1.2. メタ情報: ウェブサイト、メーリングリストなど 1.3. GHCのバグを報告する 1.4. GHCのバージョン番号付け規則 1.5. Release notes for version 7.8.1 1.5.1. Highlights 1.5.2. Full details 1.5.2.1. Language 1.5.2.2. Compiler 1.5.2.3. GHCi 1.5.2.4. Template Haskell 1.5.2.5. Runtime system 1.5.2.6. Build system 1.5.3. Lib
このページを最初にブックマークしてみませんか?
『www.kotha.net』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く