サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
Wikipedia
blog.miz-ar.info
いわゆるトンデモに関して私が思うことを何点か書いておく。 何を問題にしているか ここで問題にするのは、例えば以下のような表現物である: 初心者にとって有害である。つまり、間違った理解を植え付ける。 誤りを修正したら何も残らない。 すべきではない対処 まず、作者に突撃して撤回させるのはあまり現実的ではない。指摘を受け入れて撤回するなら良いが、「自分の表現物が無意味あるいは有害だった」ことを受け入れられる表現者がどのくらいいるだろうか?あるいは、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色付け係が使う言語はもう出揃ってしまったのかもしれないという気はしなくもな
導入:クロージャーについて 昨今ではクロージャーを使えるプログラミング言語は珍しくなくなった。クロージャーとは、関数の引数だけではなく、外のスコープにある変数を参照できる関数のことである。 例えば、次の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)では十進小数が使われることが多い。 データのシリアライズ等で、内部的な二進浮動小数点数を十進小数に変換して、再度二進小数に戻すという操作が考えられる。この時、元々の二進小数の値が保持されることが望ましい。 有限桁の二進小数は原理的には有限桁の十進小数で表現できるが、指数部が大きかったり小さかったりすると仮数部の桁数も膨張するため実用的ではない。 そこで、基数変換の際に丸めが発生することを許容して、二進小数→十進小数→二進小数の変換が恒等写像となるようにしたい。ただし丸めの方法は最近接丸めであるとする。この時、 途中の十進小数の仮数部は何桁あれば十分か?なるべく短い桁数の十進小数を、正しい丸めで得るためのアルゴリズムはどのようなものか? という問題が
先日リリースされた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 :
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 ->
西暦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
Qiitaにこういう記事を書いた: Haskellでフィボナッチ数列 〜Haskellで非実用的なコードを書いて悦に入るのはやめろ〜 ↑の記事ではメモ化しない計算法が遅いこと、Haskellには遅延評価の罠があって正格にすると早くなること、「n番目のフィボナッチ数」をピンポイントで計算する場合は(行列またはQ(√5)の)冪乗を使う方法が早いこと、一般項(ビネの公式)をその辺の浮動小数点数で計算するのは使い物にならないこと、などを述べた。 まあ、「Haskellでは fib 0 = 0; fib 1 = 1; fib n = fib (n-1) + fib (n-2) でフィボナッチ数が計算できます!」に対する注意喚起としてはこれで十分すぎる内容なのだが、「n番目のフィボナッチ数をピンポイントで計算する方法」についてはもっと深掘りできる。 この記事では、数学的な考察も交えて、「n番目のフィボ
この記事は 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
型システムを自分で設計したいと思ったので「型システム入門 プログラミング言語と型の理論」(原題: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日の時点では
コンピューター上で実数を取り扱うには、いくつかの方向性がある。普通は浮動小数点数によって近似することが多いと思うが、多倍長計算を始めとする、「コストをかけてでも正確に」計算するという方向性もある。 そのような「正確に取り扱える」実数のクラスとしては、整数(多倍長整数)や有理数はある程度普及していると思う(標準で備えているプログラミング言語がある)。それよりも広いクラスとして、代数的実数、つまり(整数または有理数係数)代数方程式の根となるような実数全体、というものがある。 代数的実数が計算機で取り扱えるということ自体は割と知られた事実だと思うが、実装は割と大変で、工夫の余地がある。有理数のように「GCD さえ実装すればよい」というものではない。 かくいう私も最近までその辺を真面目に勉強しようとは思っていなかったわけだが、何となくモチベーションが湧いてきたので、代数的実数に関するアルゴリズムを
次のページ
このページを最初にブックマークしてみませんか?
『雑記帳 | 人生やっていき』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く