プログラミング」カテゴリーアーカイブ

LunarML進捗:signatureの実装に向けて

自作SML処理系進捗:Hello Lua! の続き。

自作SML処理系「LunarML」の言語機能の実装も佳境に入ってきて(equalityやexception等の厄介な奴らはだいたい片付けた)、残すところは

  • withtype (derived form)
  • abstype(Successor MLに従いderived formとして実装する予定)
  • signature
  • functor

くらいとなってきている。

続きを読む

GHCに初めてコントリビュートした/最近のGHC動向

事実上の標準デファクトスタンダードなHaskell処理系であるGHCに貢献するというのが去年掲げた目標だったが、それがようやく実現したので報告する。ついでに、最近のGHC開発状況についても簡単にまとめてみる。

続きを読む

自作SML処理系で 1 + 2 がコンパイルできた

2年ほど前からSML処理系を自作している。それがこの度、「動作するターゲットコード (Lua) を出力する」という重要なマイルストーンに到達したので記念に記事を書いておく。

この処理系については、2018年9月に開催された勉強会「ML Day #2」で進捗報告のLTをしたこともあった。(あれから2年も経ってまだこの段階かよ!)

続きを読む

技術書典9に「浮動小数点数小話」を出します

昨日からオンラインで「技術書典9」が始まっています。昨今のアレで今回はオンラインです。だめぽラボでは1年ぶりに技術書典に出展しています。

今回は既刊「Haskellで戦う競技プログラミング」の改訂第2版を出したほか、新刊「浮動小数点数小話」を出します。

続きを読む

QuickCheckで競プロ用Haskellコードをデバッグする

競技プログラミングでは、提出したプログラムが誤答(WA)だった場合に「どのような入力について」答えを間違えたのか(参加者には)分からないことが多いです。

こういう場合はエスパーするなり眼力でソースコードをぐっと睨んだりするとバグが発見できる場合もありますが、初心者にはそういうのは難しいでしょう。

この記事では、HaskellのQuickCheckというライブラリーを使って、「ランダムにテストケースを生成して素朴な解と一致するか」を自動で検証させます。QuickCheckはテストに失敗した場合に「どういう入力例に対して失敗したか」も教えてくれるので、デバッグにも役立ちます。

この記事は筆者が先日YouTubeに上げた動画を文章で書き直したものです。動画で触れられなかった・触れるのを忘れていた補足説明みたいなものも若干含んでいます。この記事と動画、両方見ていただけると嬉しいです。

続きを読む

浮動小数点数の演算の丸めモードを制御する

以前、Haskellで浮動小数点数の丸めモードを制御したいという話を書いた。

以前の記事では、丸めモードを変える方法としてはC言語のfesetroundだけを扱ったが、高速化するなら各アーキテクチャ固有の方法を使えた方が有利である。また、動的な丸めモード指定ではない静的な丸めモードについてもこの記事では触れる。

続きを読む

Haskellのscan系関数を使いこなす

Haskellはリストを操作する関数を多数提供しています。map, filter, foldあたりが代表的で、これらは他の言語でもおなじみかと思います。

一方で、scan系関数(scanl, scanr)は他の言語ではあまり見かけない気がします。同じ関数型言語のSMLやOCamlにも標準では入っていないようです。

この記事では、scan系関数がどういう場合に利用できるかを紹介します。

続きを読む