Type inference. ML等の静的に強く型付けされた言語において,変数や関数の型をプログラマが明示しなくても,処理系が自動的に決定してくれる仕組みのこと.型理論の知見に基づく. 型推論が可能な型システムとしてはHindley-Milner型システムが有名.これを拡張したものがOCamlを始めとしたML系言語やHaskell等の言語処理系に搭載されている.
一緒に学ぼう,Rustで作る単相型システム この記事は IPFactory Advent Calendar 2020 の20日目です. このネタを 言語実装 Advent Calendar 2020 の記事に採用すればよかったかもしれない. 私は1日目にも記事を上げていますので,興味があればそちらも見てください. drumato.hatenablog.com 言語処理系の勉強をしていればほぼ100%,そうでなくても一度は目にしたことがあるであろう,"型システム" という言葉. 何やらかっこいい名前ですが,どういったものかは理解していても実装方法まで知っている人は多くありません. かくいう私も,…
C# 2.0 以降の新機能の名前と公式ガイドページへのリンクをまとめました。(C# 7.0 ~ ) 注1)機能の名前はできるだけ公式ガイドから言葉を拾うようにしましたが、完全ではありません。 注2)リンク先ページはできるだけ日本語ページを拾うようにしましたが、見つけられずに英語のページもあります。 注3)良さそうなページを探しましたが、もっと良いページがあるかもしれません。 ■ C# 7.0 での新機能 ・out 変数をメソッド呼び出しの引数リスト内で宣言 (Out variables) https://docs.microsoft.com/ja-jp/dotnet/csharp/langua…
Tl;Dr それは何? 構成は? がんばるぞい bot の歴史 (興味がない方は読み飛ばしてください) ペンギン村 Slack では昔から がんばるぞい bot が稼働していました。 それは Slack bot と呼ぶには単純すぎるもので、「がんばるぞい!」や「がんばったぞい!」などと書き込むと、ランダムでキャラクターがメッセージを返答してくれるという、まぁがんばる人を応援しちゃうぜ的な bot でした。 そんな、がんばるぞい bot ですが実は2度もスクラッチで書き直されています。 初代: JavaScript / AWS Lambda もっとも初期のサービスは JavaScript / A…
結論 TypeScript で関数をアロー関数で多重定義すると型推論がうまくいかないので、function キーワードのオーバーロードを使いましょう。 オーバーロードをアロー関数で書く TypeScript のオーバーロードは、引数と戻り値の個数や型が柔軟な関数に型をつける構文です。関数をオーバーロード(多重定義)することで、引数と戻り値 の組み合わせを複数定義できます。 declare function getWidget(n: number): Widget; declare function getWidget(s: string): Widget[]; 関数のオーバーロードをつかうこと…
Flutterに採用されているDartでは、void型に好きな値を代入することができます。 void main() { void x = 2; } 型が値を定める言語に慣れていると、これは奇妙に思えます。しかし、型が振る舞いを定める言語であると思うと、これが自然と感じられるようになります。 ついでに、Dart 2の型の仕様書を読んでDartの型の上下を解説します。 と思って読んでたんですが、この仕様書はかなり不完全ですね‥。 Never型のこととかどこにも書かれていなかった‥。 仕様書 Dart 2.2 void型の振る舞い 型が値を定める言語では、voidは値の存在しない型となっています。そ…
この記事はPHPStan開発者のOndřej Mirtesによって2021年4月3日にPHPStan Blogに書かれた記事を翻訳したものです。 phpstan.org PHPは記憶されるべき関数呼び出しの戻り値について、これまで一貫性がありませんでした。 <?php $person = new Person(); if ($person->getName()) { \PHPStan\dumpType($person->getName()); // string|null } if ($person->getName() !== null) { \PHPStan\dumpType($perso…
弊社プロダクト「PHONE APPLI PEOPLE (旧:連絡とれるくん)」では、サーバサイドに Kotlin を採用しています。 今回は、初見だとたぶん使い道が分かり辛い Nothing 型について紹介します。 Nothing 型とは Kotlin language specification 言語仕様によると、ユーザが定義した型も含む、すべての型のサブタイプ (i.e. ボトム型) です。 すべての型のスーパータイプである Any のちょうど反対にある型です。 「すべての型のサブタイプ」という訳の分からないものなので、インスタンスが存在しません。 (コード上で Nothing のインスタ…
Types and Programming Languagesの24章の主題は存在型(Existential Types)である。 私は何回読んでもここでつまづく。 この章に到達するまでに部分型やら再帰型やら型推論やら全称型やら出てくるが、まあ難しくとも、なんとなくどういった言語機能に関連する型なのかがそれなりにイメージできた。 しかし存在型に関してはまったくイメージがわかず困っていた。 To understand existential types, we need to know two things: how to build (or introduce, in the jargon o…
あらかじめ宣言しますが、タイトルでunshare(2)と言いながらclone(2)を使います。 コンテナを自作する のが趣味だったので、Rustでもコンテナの基本的な機能であるLinux Namespace周りのコーディングをしてみた。
Robert Harperのブログに(10年くらい前に)載っていたHaskellの型クラスに対する批判について@elpin1alさんに教えていただいたのでメモ。@elpin1al ありがとうございます! 型クラスとモジュール 言語の抽象化機構の中心的存在は何かと考えると、Haskellなら型クラス、MLならモジュールが挙がる。 www.quora.com 例えばこのOCamlとHaskellを比較する質問で: Typeclasses vs Modules Haskell has typeclasses, which are simply awesome. OCaml has a superb …
はじめに 最近Javaを触る機会が多かったのですが、Java1.4からの人間として育ったアラフォーのため、Java6を少しかじっている程度だと非常に効率が悪いことが分かり、少しずつ新機能を勉強していこうと思います。 java10~11の新APIを覚える 今回は型推論と呼ばれているvarというものを学んでいきたいと思います。 Javaは型制約が強く、左と右がしっかりと合っていないとコンパイルエラーや型が明確でないとIDEでは警告扱いになっていたと思います。どうも型「var」はJavascript等のスクリプト言語と同様に左側の型を意識することなく変数を定義できるようになるとのことです。 varを…
C++でのプログラミングの醍醐味の一つにテンプレートを駆使したコーディングがある(と思う)。テンプレートを使うと柔軟で強力なコーディングができるが、それなりに知識が必要である。生半可に使うとコンパイル時に吐き出される大量のエラーメッセージで泣きを見る。 今回、その中でも知識として曖昧なままだったSFINAEについて調べてみた。 SFINAEとは SFINAEの例 例1 例2 std::enable_if std::enable_ifを使う際の注意点 そのstd::enable_ifは本当に必要か? typename = std::enable_if<...>とenablerの違い if con…
こういう記事を最近読んだ: tatta.hatenadiary.org (書かれたのは10年以上前だが) こういうコードは型チェック通らないよ、という話: let rec f x = x and g () = f 1 and h () = f true;; Line 3, characters 13-17: Error: This expression has type bool but an expression was expected of type int let rec ... and ... and ...という構文の中ではlet多相が効かないということらしい。 let rec .…
C# 2.0 以降の新機能を一つづつ確認していきます。 以前に一度行ったのですが、公式ドキュメント再編でリンク切れしているところを見つけてしまったので。今ならもっと簡潔なサンプルが欠けるところもあるだろうし、せっかくなので今もう一度確認して行きます。 タプル (Tuples) https://docs.microsoft.com/ja-jp/dotnet/csharp/tuples 複数の値を 1 つのオブジェクトに簡単にパッケージできる。 { // 変数/定数をまとめられる string text; int length; (text, length) = ("saitama", 7); C…
土下座リアクションは「申し訳ないが昼はNG」なのか「お手数おかけします」なのかわからないので禁止したほうがいい— ポテサラ / PrivateProvenPirate (@ytkmns) 2021年3月15日 解釈する人物によって意味合いがブレるのはアカン— ポテサラ / PrivateProvenPirate (@ytkmns) 2021年3月15日 「了解」の意味合いで土下座を使ってはいけない。マル、が正解— ポテサラ / PrivateProvenPirate (@ytkmns) 2021年3月15日 あんたが土下座絵文字にこめた意図なんて知ったことではない。— ポテサラ / Priva…
これまでTypeScriptでの開発ばかりで、Flow(日本だとflowtypeって呼ばれてることが多い)は未経験でした。ついに触ることになりそうなので調べてみました。 flow.org Flow(flowtype) 型アノテーションを付与している様子は、TypeScriptとさほど変わらないけど、あくまでFlowはJavaScriptに型アノテーションを付与しているだけという印象が強い。 FlowはJSの静的型チェッカー TSのように型アノテーションを付与する ただし、JavaScriptファイルに型アノテーションを付与して、ビルド時にその情報を取り除くだけ 型推論も、もちろんある 必要なn…