サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
体力トレーニング
blog.miz-ar.info
Haskell界隈の一部で囁かれる都市伝説として、「Haskellで求人を出して集めた優秀な人材にPHPを書かせる」というものがありました。この都市伝説に実体はあるのでしょうか? 伝説 まず、議論の前提として、この伝説に言及している投稿をいくつか挙げておきます。これは「伝説が少なくとも伝説としては存在する」ことを立証するために挙げるのであり、これらの投稿について何らかの価値判断を行う目的ではありません。 GCPで人を集めてAWS書かせるやつ、Haskell と PHP で見た — mizchi (@mizchi) March 16, 2022 Haskellで募集してPHP書かせる事件だ — デジタル競争の敗者 (@Lugendre) June 18, 2021 Haskell プログラマを募集して PHP 書かせるって,ネタ元どこなんだろう? — ささき しげお (@SigSasaki)
今月(2024年8月)末にオライリージャパンから出る「Binary Hacks Rebooted」という本の執筆に、著者の一人として参加しました。私は主に浮動小数点数周りの記事を執筆しました。 O’Reilly Japan – Binary Hacks Rebooted(2024年) サポートリポジトリはこちらになります。サンプルコードなどを掲載する予定です。 oreilly-japan/binary-hacks-rebooted: 『Binary Hacks Rebooted』のサポートリポジトリ また、各Hackの中に踏み込んだ詳細な目次を以下のページで公開しています。購入に迷った際の判断材料にしてください。 Binary Hacks Rebooted 目次 | Akira Kawata オライリーの本は全ての書店に並ぶわけではありません。店頭で確認したい方は、オライリーの本を扱ってい
この記事は TypeScript Advent Calendar 2023 の8日目の記事です。言語実装勢にも役立つ内容を含んでいるかもしれないので、 言語実装 Advent Calendar 2023 にも登録しています。 TypeScriptで型システムに興味を持った人が「型システム入門」を読んだという話を時々聞きます。「型システム入門」は、Types and Programming Languages (TAPL) という本の邦訳で、型システムに興味を持った人が読むのは自然なことです。 型システム入門 プログラミング言語と型の理論 | Ohmsha 型システム入門 サポートページ ですが、この本の原著は2002年出版で、最近の話題がカバーされていなかったり、邦題に「入門」とあるように発展的な話題は扱っていなかったりします。一応続編的な感じのAdvanced Topics in Typ
いわゆるトンデモに関して私が思うことを何点か書いておく。 何を問題にしているか ここで問題にするのは、例えば以下のような表現物である: 初心者にとって有害である。つまり、間違った理解を植え付ける。 誤りを修正したら何も残らない。 すべきではない対処 まず、作者に突撃して撤回させるのはあまり現実的ではない。指摘を受け入れて撤回するなら良いが、「自分の表現物が無意味あるいは有害だった」ことを受け入れられる表現者がどのくらいいるだろうか?あるいは、SNS上でバトルに発展した場合不毛な時間を費やすことになる。 第二に、作者に対する人格攻撃や侮辱的な表現は行うべきではない。具体的に言うと、2021年にプログラミング界隈を騒がせた件(「関数型プログラミングが『銀の弾丸』であるという非常識な常識2022」の感想の言及先)の作者を「漢字1文字+ひらがな1文字+漢字1文字」で呼んだはてなブックマークユーザー
みなさん、Pythonは好きですか? この記事では、私がPythonという言語とそのエコシステムについて思うところを書いていきます。全体を通したストーリーみたいなのはなくて、トピックごとに書いています。 私のPython経験は3年弱です。Pythonについてまだまだ新米だという自覚はありますが、そこは有り余る才能でカバーしてこの記事を書いています。 静的型 Pythonには静的型がありません。型ヒントはありますが、インタープリターにとっては飾りにすぎません。 mypyとかの型チェッカーはありますが、「それさえあれば万事ハッピー」なものではなく、既存のコードを適宜書き換えないと型チェッカーでまともな結果を得るのは難しそうです。型検査を念頭に書かれていない(型ヒント付きの)コードをそのままmypyにかけても大量のエラー・警告が出てくるでしょう(ちなみに、型ヒントなしの関数はmypyのデフォルト
新言語にできることはまだあるかい なんとかWIMPS 最近(1ヶ月くらい前)、こんな記事が出ました: 新しいプログラミング言語が出てこない(新しく出てた言語を追記) – きしだのHatena Kotlin, TypeScript, Rust, Swift以降にみんなが話題にするような新しい言語が出てこない、それはなぜか、みたいな趣旨です。客観的に見れば「新しい言語は常に出続けている」わけですが、「みんなが話題にするような」というのが多分曲者なんでしょうね。 例え話をすると、新しい若木は常に生えてきているんだけど、大木に成長するには時間がかかるので、大木にしか興味のない人には「この8年間で新しい大木は登場していない」と判断してしまうのかもしれません。 まあ私としても、Web (HTTP) APIを書く言語とか、JSON色付け係が使う言語はもう出揃ってしまったのかもしれないという気はしなくもな
プログラミング言語処理系が好きな人の集まりというコミュニティーがあります。ここは言語処理系を作っている人が多く集まっています。自作言語界隈とも言えます。そこでの話題について、色々と思うところがあったので、記事を書いてみます。 まず、「オレオレ言語界隈も標準化委員会を作って統一した言語を作ってみてはどうですかね?」という意見について。 https://prog-lang-sys-ja.zulipchat.com/#narrow/stream/343500-.E9.9B.91.E8.AB.87/topic/.E3.82.AA.E3.83.AC.E3.82.AA.E3.83.AC.E8.A8.80.E8.AA.9E.E3.81.AE.E6.A8.99.E6.BA.96.E5.8C.96/near/329319086 私としては統一言語はいい考えとは思えません。独自の言語を作る人は、学習用のものを
このブログでは限定継続について過去に何回か記事を書きました: LunarMLと継続限定継続と例外とモナド 今回、LunarML向けのVMに限定継続を実装してみて理解が深まったので、改めて記事にします。 限定継続:スタックを使ったざっくりとした説明 今回はスタックを使って限定継続をざっくりと説明してみます。 関数という概念を持つプログラミング言語では、スタックを使って関数の呼び出しを管理することが多いです。コールスタックとか、スタックのバックトレースとか言いますよね。ここではネイティブのスタックか仮想マシンのスタックかというのは問いません。 関数を呼び出すと、フレームと呼ばれる領域がスタックに確保されて、関数への引数やローカル変数はそこに確保されたりします。 例えば、以下のプログラムを考えます: void g() { // すごい計算 } void f() { double j; g();
導入:クロージャーについて 昨今ではクロージャーを使えるプログラミング言語は珍しくなくなった。クロージャーとは、関数の引数だけではなく、外のスコープにある変数を参照できる関数のことである。 例えば、次のJavaScriptコードでは、関数を返す関数 f を定義している。 f の中で定義された無名関数は、外側の変数 x を参照できている。 function f(x) { return function(y) { return x + y; }; } JavaScriptではネストした関数を使わなくても、bindメソッドによって同等の処理を記述することができる: function g(x, y) { return x + y; } function f(x) { return g.bind(null, x); // gの第1引数を束縛する } 残念ながらC言語にはクロージャーはない。関数の中に
動機付けと問題 計算機の内部では二進浮動小数点数が使われることが多い一方で、プログラムのソースコードやテキストベースのデータ形式(例:JSON)では十進小数が使われることが多い。 データのシリアライズ等で、内部的な二進浮動小数点数を十進小数に変換して、再度二進小数に戻すという操作が考えられる。この時、元々の二進小数の値が保持されることが望ましい。 有限桁の二進小数は原理的には有限桁の十進小数で表現できるが、指数部が大きかったり小さかったりすると仮数部の桁数も膨張するため実用的ではない。 そこで、基数変換の際に丸めが発生することを許容して、二進小数→十進小数→二進小数の変換が恒等写像となるようにしたい。ただし丸めの方法は最近接丸めであるとする。この時、 途中の十進小数の仮数部は何桁あれば十分か?なるべく短い桁数の十進小数を、正しい丸めで得るためのアルゴリズムはどのようなものか? という問題が
最近、「Haskellでの型レベルプログラミング」という「本」を執筆している。まだ完成ではないが、以下のリンクから読める: Haskellでの型レベルプログラミング なぜHaskellか 最近いろんな言語が出てきている中で、Haskellの強みとは何だろうか。人によって答えは色々あるだろうが、筆者にとってHaskellの魅力的な側面は強力な型システムである。どのくらい強力かというと、型レベルでプログラミングができ、依存型の模倣さえもできてしまう。 (依存型をやりたいなら最初から依存型のある言語を使えという意見は尤もだが、それはそれとして。) Haskellでの型レベルプログラミングの解説記事というのは、英語圏ではちらほら見かけるが、日本語圏ではあまり見ない。2018年(原文は2017年)に公開された Haskellにおける型レベルプログラミングの基本(翻訳) – Qiita が数少ない例で
先日リリースされたGHC 9.2.1で、64ビットArm(AArch64)向けのネイティブコード生成器(Native Code Generator; NCG)が実装された。これを機会にGHCのバックエンドについて簡単にまとめてみる。 概略 GHCでHaskellプログラムをコンパイルすると、いくつかの中間言語を経て最終的には機械語が出力される。 この工程の最後の部分を「バックエンド」と呼ぶ。 GHCには Native Code Generator (-fasm)LLVM backend (-fllvm)unregisterised via-C backend の3種類のバックエンドが存在する。このほか、バイトコードインタープリターと-fno-codeもデータ型的にはバックエンドの一種として扱われている。(参照:compiler/GHC/Driver/Backend.hs) Native C
事実上の標準デファクトスタンダードなHaskell処理系であるGHCに貢献するというのが去年掲げた目標だったが、それがようやく実現したので報告する。ついでに、最近のGHC開発状況についても簡単にまとめてみる。 「貢献」と言っても色々あって、バグ報告とかも立派な貢献なのだが、ここで目標としていたのは「書いたコードをGHC本体に取り込んでもらう」ことである。 一つ目:fromInteger :: Integer -> {Float,Double} 年末に書いた記事 Haskell/GHCでの浮動小数点数の扱い – Qiita にあるように、現行のGHCのfromIntegerは値の大きさによって丸め方法が違っている。それによってどういう問題が引き起こされるかというと、 import Numeric import Data.Word main = do putStrLn $ "literal :
モチベーション Web で数式を表示するための仕様として、 MathML というものがある。ただ、 MathML はブラウザーの対応がイマイチなので、もっぱら MathJax や KaTeX などの JavaScript で書かれた代替手段を使うことが多いだろう。しかし、 EPUB の場合は標準的な数式記述方法は MathML なので、 LaTeX 数式を MathML に変換する必要がある。 そこで、「LaTeXで記述された数式をMathMLに変換する」ことを考える。 (尤も、 Kindle は MathML に対応していなかったり、EPUBリーダーで多く採用されていると思われる WebKit 系のレンダリングエンジンでどれほどの見た目になるのかという問題がある。しかし、それらの問題はおいておく。) この記事では LaTeX で書かれた単体の数式を対象とし、 LaTeX 文書をまるごと
LaTeX vs MathML (continued) 前の記事では、「LaTeXではカッコは必ずしも対応してなくてもいいけどMathMLではカッコの対応が大事」ということを書いた。 MathML特有の概念(マークアップ)は他にも色々あるので、この記事ではそれらを掘り下げていく。 トークン (<mi>, <mn>, <mo>, <mtext>) TeXの数式中に xyz という文字の並びを書いた時に、これが「一つの識別子か、乗算記号を省略した複数の変数か」というのが明らかではないという問題がある。MathMLへ変換する際は、識別子であれば一つの<mi>タグを生成し、複数の変数であれば複数の<mi>タグとそれを区切る<mo>⁢</mo>を生成する必要がある。 「識別子か複数の変数か」の判断に関しては、\mathrm等のフォントに関する指定を考慮すれば良いだろう。
Haskellはリストを操作する関数を多数提供しています。map, filter, foldあたりが代表的で、これらは他の言語でもおなじみかと思います。 一方で、scan系関数(scanl, scanr)は他の言語ではあまり見かけない気がします。同じ関数型言語のSMLやOCamlにも標準では入っていないようです。 この記事では、scan系関数がどういう場合に利用できるかを紹介します。 scan系関数とは 定義と図解 scan系関数は、リストを元にして新しいリストを構築する関数です。新しいリストの要素は、与えられた初期値と関数を使って元のリストを途中まで畳み込んだものになります。「foldの途中経過を残す版」とでも言えば良いでしょうか。 型はそれぞれ次のようになります: scanl :: (b -> a -> b) -> b -> [a] -> [b] scanr :: (a -> b ->
要約:Xy-pic か TikZ-cd を使おう。 LaTeX において可換図式を描くためのパッケージはいくつか存在する。この記事では、そういうパッケージをいくつか調べ、試してみた。 amscd CTAN: Package amscd ドキュメント (amscd.pdf) によると、 AMS-TeX にあった可換図式機能の LaTeX 版、ということらしい。(しかし、AMS-TeX の User’s Guide (amsguide.pdf) を見ても可換図式への言及がない) \usepackage{amscd} で使えるようになる。 amscd で図式を描くには、CD 環境を使う。CD 環境は数式環境の中に書く。矢印はアットマークから始まるやつで指定する。 \[ \begin{CD} A @>{f}>> B \\ @V{g}VV @VVV \\ C @>>> D \end{CD
西暦2038年問題はみなさんご存知ですよね。2038年1月19日午前3時14分7秒(UTC)を過ぎると 世界中のUNIXがばくはつする問題 time_t が符号付き32ビットなプログラムで現在時刻を正しく扱えなくなる問題です。 C言語の time_t は典型的にはUnix epoch(UTCで1970年1月1日午前0時)からの経過時間(うるう秒は考慮しない)を秒単位で保持しており、それが\(2^{31}-1\)に到達するのが2038年1月19日午前3時14分7秒(UTC)なわけですね。 2038年は割と近い将来なので、モダンなC処理系では time_t を64ビット整数にするなどの対応を行なって2038年問題を乗り切ろうとしています。 それでも、時刻を固定長整数で表現する限り、いつか限界が来ます。「time_t を64ビット整数にする」という対応は、問題を西暦2038年から西暦292277
3月下旬からAtCoderのRatedコンテストに参加しています(AtCoderプロフィール)。この度、5月26日のABC128でようやく水色になりました(AtCoder社長の記事によると、これは上位15%に相当するらしいです)。 使用言語はHaskellです。コンテストの時間中に提出したコードは全てHaskellだったと思います。 この記事では、Haskellを使う理由や、Haskellで競技プログラミングをするコツ、AtCoderでHaskellを使う際のアレコレなどを書いていきます。「水色になるための方法」みたいな話はしません(できません)。 Haskellを使う理由 私のメイン言語はHaskellなので、競技プログラミングでもHaskellを使うのは自然な発想です。 ただ、Haskellは工夫すれば高速なコードを書けますが、あちこちに「遅くなる」罠があります。罠に怯えるくらいならH
Haskellにおけるモノイドについて解説記事を書いてみた。他の言語でも通用する話があるかもしれないし、ないかもしれない。 モノイドとは モノイドとは、ざっくり言うと「くっつける」演算ができる対象のことである。例えば、文字列やリストの連結、数の足し算や掛け算は「くっつける」演算の一種である。 モノイドには「くっつける」演算の他にもう一つ条件があって、モノイドは「くっつけても何も起こらない値」を持っていなければならない。例えば、文字列の場合は空文字列、リストの場合は空リスト、数の足し算の場合は0、掛け算の場合は1、という具合である。 というわけで、文字列、リスト、数の足し算、数の掛け算はいずれもモノイドの具体例である。ただし、同じ数の集合(整数、など)を考えていても、演算が異なる(足し算 vs 掛け算)場合は、異なるモノイドとみなす。 モノイドの定義をちゃんと書くと、モノイドとは集合 \(M
Qiitaにこういう記事を書いた: Haskellでフィボナッチ数列 〜Haskellで非実用的なコードを書いて悦に入るのはやめろ〜 ↑の記事ではメモ化しない計算法が遅いこと、Haskellには遅延評価の罠があって正格にすると早くなること、「n番目のフィボナッチ数」をピンポイントで計算する場合は(行列またはQ(√5)の)冪乗を使う方法が早いこと、一般項(ビネの公式)をその辺の浮動小数点数で計算するのは使い物にならないこと、などを述べた。 まあ、「Haskellでは fib 0 = 0; fib 1 = 1; fib n = fib (n-1) + fib (n-2) でフィボナッチ数が計算できます!」に対する注意喚起としてはこれで十分すぎる内容なのだが、「n番目のフィボナッチ数をピンポイントで計算する方法」についてはもっと深掘りできる。 この記事では、数学的な考察も交えて、「n番目のフィボ
以前(2014年ごろ)このブログに「圏論の本」という記事を書いたが、あれ以降いろいろな本が出てきたようだ。特に、和書が増えた。 というわけで、この記事では2018年時点で手に入る圏論の本を独断と偏見で紹介する。ここで紹介するのは入門書、和書が中心となり、より専門的な話題に特化した本は省く。 圏論の入門書と一口に言っても、書き方や内容は著者によって様々である。読者にも代数学をやりたい人、プログラミングやロジックをやりたい人、色々いるだろうが、読者のバックグラウンドや興味の方向によって読むべき本は変わる。 読者が適切な本を選択する為に、この記事が(十分なガイドとまではならなくとも)なんらかのヒントを提供できれば幸いである。 適宜、Web上で他の方が書いた書評にリンクを貼る。 入門書、教科書 圏論の歩き方 圏論の歩き方委員会 編 「圏論の歩き方」日本評論社、2015年 [出版社ページ] 「圏論っ
この記事は Category Theory Advent Calendar 2018 7日目 かつ Haskell (その2) Advent Calendar 2018 7日目の記事です。 Category Theory Advent Calendar 2018の6日目はcorollary2525さんの「随伴は あらゆるところに 現れる」、8日目は空席、9日目はt_uemura669101さんの「トポスと高階論理」です。 Haskell (その2) Advent Calendar 2018の6日目は空席、8日目はtakoeight0821さんの「Type defaultingについての初級的な解説」です。 この記事はどういう記事か 圏論の方から来た人向け: デカルト積やテンソル積の一般化である「モノイド積」の話と、「内部ホム」の話をします。文献によっては内部ホムはモノイド積の右随伴として導
最近(ここ半世紀くらい)圏論が流行りですね。しかし圏論は抽象的で、具体例や圏論の言葉を使うことによるメリットが見えないと、なかなかとっつき難いかもしれません。 この記事では、高校数学に出てくるアレが、実は圏論の言葉でスッキリ(?)表せることを見てみます。 予備知識:高校数学、若干の圏論、あとは多変数の微分の知識があればなお良い 合成関数の微分 \(\def\Real{\mathbf{R}}\)実数\(\Real\)上の関数 \(f,g\colon\Real\to\Real\) の合成関数 \(g\circ f\) の微分は、\[(g\circ f)'(x)=g'(f(x))f'(x)\]と書けます。あるいは、\(y=f(x)\), \(z=g(y)\) とおけば\[\frac{dz}{dx}=\frac{dz}{dy}\frac{dy}{dx}\]と書くこともできます。高校で習ったと思いま
前置き TypeScript で作っていたプロジェクトに、後付けで PureScript を追加しようとしたらかなり辛かった。 (わざわざ言語を混在させたい理由としては、型クラスや演算子オーバーロードを使いたい&既存のコードを全部書き直す暇はない、が挙げられる) 辛い理由としてはそもそもモジュールとバンドラーの周辺がまだ成熟していないというのもあるだろうが、 TypeScript 固有の理由として、 TypeScript コードから PureScript モジュールを読み込むための型定義が足りないという問題がある。 Stack Overflow を見ると、同じことで悩んでいる人がいた: node.js – How do I configure a TypeScript project that uses JavaScript modules compiled from PureScript
プログラムにバグはつきものです。強力な型システムを備えている Haskell でもそれは同じです。この記事では、 Haskell プログラムのデバッグ手法をいくつか挙げてみます。 なお、使用している GHC は 8.2.2 です。より新しいバージョンで追加されるであろうより便利な機能は、この記事の対象外です。 【2018年2月8日 更新:-fexternal-interpreter, Control.Exception.assert, debug パッケージについて追記】 【2018年5月25日 更新:プロジェクトごとにPreludeを持っていると便利という話を追加】 心構え:処理を分割せよ Haskell は純粋な言語です。IOが絡まない関数であれば、同じ引数に対しては同じ結果が返ってくることが期待されます。 よって、処理を細かく(純粋な)関数に分割し、それぞれ GHCi で動作を確かめ
型システムを自分で設計したいと思ったので「型システム入門 プログラミング言語と型の理論」(原題:Types and Programming Languages, 略して TaPL)を読んで勉強している。 この記事は私の雑な理解を吐き出したものであり、あまりまとまっていない。しかし、何かしらをアウトプットすることに意義がある(キリッ 単純型 一番基本になるやつ。 Curry-Howard 対応では、命題論理に対応する。 部分型付け (subtyping) Float 型の項が必要とされる箇所に Int 型の項を投入できる、みたいなやつ。 C/C++ や Java といった言語でおなじみ。 Haskell には部分型付けはない…が、型適用(後述)が暗黙なので、一つの(全称型のついた)項に複数の(具体的な)型がつくことがある。これは普通は部分型付けとは呼ばない…と思う(自信なし)。 Top と
この記事は 数学とコンピュータ Advent Calendar 2017 の14日目の記事です。 以前このブログでも告知しましたが、2ヶ月前から、「週刊 代数的実数を作る」と題して、代数的数の計算機上での実装について Web 上で連載しています: 週刊 代数的実数を作る この記事では、「週刊 代数的実数を作る」でこれまで扱ったトピックを振り返り、これからの方向性を述べます。この記事を読む前に連載に目を通している必要はなく、この記事で概要を把握してから連載の方を読むのでも構いません。 (本当は代数的数の実装を利用して有理関数の部分分数分解と不定積分でもやってやろうと思っていたのですが、現状の実装が遅すぎるので断念しました。) 連載について 「週刊 代数的実数を作る」の記念すべき最初の記事(#0 と #1)を公開(創刊)したのが、ちょうど2ヶ月前(10月14日)であり、12月14日の時点では
この記事は 言語実装 Advent Calendar 2017 7日目の記事です。 この記事では、私が作っているDSLの設計思想を主に書きます(実装が未完なので)。 以前、 複素関数で遊ぼう というWebアプリ(と言ってもサーバー側で状態を持たないのでほぼブラウザーアプリ)を作りました。このアプリでは、複素関数を表す数式をユーザーが任意に入力できます。 例:exp(z) 例:\sum_{n=1}^{10} z^n/n! 数式はHaskellで書いたパーサーで解釈し、JavaScriptへコンパイルしています。コンパイルしたJavaScriptはブラウザー側で実行させます。 関数のグラフを描くためには値を大量に計算する必要があるため、与えられた関数に対してなるべく効率の良いコードを生成することが一つの目標になります。 課題1:静的型をつけたい 対象が複素関数なので、扱う値というのは基本的には
次のページ
このページを最初にブックマークしてみませんか?
『雑記帳 | 人生やっていき』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く