2020年6月16日 TypeScript Meetup #4 にて発表した資料です。
タグ検索の該当結果が少ないため、タイトル検索結果を表示しています。
このように、(1)(2)と「vector<int>」を2回も書かなければなりません。特に(2)では、右辺の型は分かっているんだから、左辺はそれに合わせてよ! という文句が出そうです。 初期化漏れを防止する このように、同じ意味の型を何回も書くのはかったるいな! というときに型推論は役立つわけですが、もっと切実な理由があります。それは、変数の初期化漏れの防止です。JavaでもRustでもそうなんですが、変数は宣言しっぱなしでOKです。宣言しっぱなしというのは、明確な初期化が行われていないという意味です。こうなると、その変数を参照しようとするといろいろとまずいことが起きてきます。 基本データ型とかなら、どんな値か分からない ポインタ型とかなら、どこを指しているか分からない(ダングリングポインタ) なので、実行時にプログラムが不可解な動作をしたり、いきなり落ちたりするわけです。しかし、コンパイラ
ファイルシステム API Routes の課題 Next.js のファイルシステムを利用した routing は、直感的に定義を追加することができます。一方、モジュールシステム観点からは透過的参照がないため、TypeScript の型推論と相性が悪いです。Next.js における型安全な routing ソリューションとして pathpida がありますが、API Routes には対応していません。 useSWR から API Routes の API を呼ぶシーンで期待に沿うものが見当たらなかったので、今回自作してみました(リポジトリはこちら)本サンプルでは、npm script のpostinstallを hook に、src/types/pages/apiに生成ファイルが出力されるので、あらかじめnpm installを実行してお試しください。 サンプルで実現している型推論概要 は
またか. またなのか. 何回目だ. ということで, ラムダ計算のインタプリタの実装としては4回目くらい*1, コンパイル時計算でやるものとしても3回目くらいになってしまうけど, ラムダ計算の処理系をまた書いてしまった. 今回の目的は, Scala 3にはmatch typesという機能があり, これだけでチューリング完全なのではないか, というのを検証するため. また, 文字列リテラル型を操作する型レベル関数が3.1.2-RC1にきていて, これを使えば構文解析器だって書ける. 経緯 過去の事例 関数と返り値 パターンマッチと再帰呼出し Scala 3の型レベル言語 match types リテラル型操作 ラムダ計算の実装 評価 印字 構文解析 型推論 (型検査) おわりに 経緯 もともとは, id:xuweiさんが文字列リテラル型でコンパイル時に動作する構文解析器を実装していたのが始まり
始めに 自分が今までTypeScriptで型推論させるにあたって、中々いい方法が見つからず、他にいいやり方がないか模索して時間がかかってしまうケースがいくつかありました。 そこで今回は割と使うケースで解決するのに苦労したものについて、Tipsという形でまとめてみました。自分はこのやり方でやっていますが、他にいいやり方があれば是非コメントください! 基本編と上級編に分けており、上級編の方が割と込み入ったことをやっているものになります。 基本編 Object.keysに型をつける Object.keysの返り値の型はstringで固定されているため、以下のように書くとtype errorになってしまいます。 const obj = { a: 10, b: 'text', c: true, }; Object.keys(obj).forEach((key) => { // key: string
去る2024年4月25日にTypeScript 5.5 ベータ版リリースの情報が発表されました。 どうやら今回の目玉機能は、『推論されたtype predicate』ということです。 この記事では、これまでとこれからでtype predicateがどのように変わるのかをお話ししたいと思います。 環境の用意 これまでの動作を確認するための環境は、既に用意していた別プロジェクトのランタイムを利用しました。バージョンは5.1.6です。 ベータ版環境は新たに用意します。公式のリリースノートにもありますが、以下のコマンドを実行するだけです。 これでベータ版の実行環境ができたのですが、VSCodeさんが最新版の仕様で型推論を行なってくれません。 ので、調教強制的にいうことを聞かせます。 やり方は、適当なtsファイル開いてshift + cmd + p → typescript:Select Types
Ruby 3.0.0RC1が登場、型の記述や静的型推論ツールなど新機能。12月25日の正式リリースに向け Ruby 3では、型の記述や静的型推論ツール、並列処理などの新たな機能が追加されます。 型の記述では、型情報を記述するための「RBS言語」が用意されるようになりました。このRBSで型情報のコードを記述しておくことで、Rubyのコード中のクラスやモジュールに対して型情報を与えることができるようになります。 静的型推論ツールとしてバンドルされる予定なのがTypeProfです。Rubyのコードをこのツールに入力すると、推論の結果としてRBSで記述された型情報のコードが出力されます。 これによりRubyコード内のバグを発見する助けになるほか、出力されたRBSコードをそのまま、あるいは改変して型情報を与えるためのRBSコードとして用いることなども可能です。 ただしまだTypeProfは実験的な段
TypeScript で複雑な型定義をするにあたり「テストを書きながら効率的に行いたい!」と思ったことはありませんか?TypeScript では Compilerレイヤーの API が Node.js に向け公開されており、環境コンテキストを加味した推論まで取得することが可能です。 本稿では、CompilerAPI をテストに活用するアプローチを紹介します。 tl;dr サンプルリポジトリを用意しました。 https://github.com/takefumi-yoshii/ts-type-inference-test const w0 = 0; const n1 = 1 as const; const n2 = 2 as 2; const _w0 = { val: w0 }["val"]; const _n1 = { val: n1 }["val"]; const _n2 = { val
この記事は言語実装 Advent Calendar 2020 の5日目の記事です. 一度でも型推論器を書いたことがあれば,そのあまりの邪悪さ,あるいはその複雑さに恐れ慄いたことでしょう. 参照を用いて単一化を実現しようものなら構文木は参照に汚染され,純粋関数型に実装しようものなら大量の型代入をどのような順序で適用したものか悩まされる. これは Hindley-Milner 型推論器を実装する上での宿命のようなものです. 本記事では,MLのサブセット——型付きλ計算をletと参照で拡張した,let多相をサポートする言語——の型推論器を Coq で実装し,その正当性を証明します. Coq で検証を行うことで我々は型推論器のバグへの恐怖とデバッグの労力から真に解放され,枕を高くして眠ることができることでしょう. もっとも、型付きλ計算を let 多相で拡張した言語の型推論器の正当性は実はすでに証
ScalaでもJavaでも、overrideする際に、sub typeでoverrideすることが可能です。 (すごく古い1.4以前のJavaでは不可能だったはずだが) Javaの仕様書で英語だと covariant return type というはず?の機能です。 https://docs.oracle.com/javase/specs/jls/se11/html/jls-8.html#d5e14373 $ jshell | Welcome to JShell -- Version 17.0.6 | For an introduction type: /help intro jshell> interface A { Object a(); } | created interface A jshell> class B implements A { @Override public St
TypeScriptは、JavaScriptのさまざまなフリーダムな書き方を受け入れ、漸進的な型付けを行えるようにするという狂った高難易度な目的のために作成されているのですが、そろそろ、TypeScriptファーストで、利用者にとって使いやすいAPIみたいな方向性で使われることも増えるのでは、という思いを強く持ちました。「既存のJSプロジェクトをTypeScript化して〜」みたいな紹介のされ方はもはや過去のものになったのではないかと。 すでにState of JavaScript 2019では2/3のユーザーがすでにTypeScriptを利用したことがある(使っている)と答え、残りの1/3も学びたい、と答えている状況です。この勢いだと、2年後には80%を超えそうです。僕自身も、TypeScriptファーストな世界がくることを想像して説明に使える教科書を書き始めたわけですが、思ったよりもそ
先日書いた記事ではJuliaの型推論について、特にその機能の1つであるisaを使って条件分岐した先のブロックにおけるflow-sensitivityについて調べてみました。 この記事ではより基礎的な部分に注目して、Juliaの型推論のアルゴリズム(の一部)を理解し、実装してみようと思います。今回紹介する技術はより一般にプログラムの「抽象解釈」("abstract interpretation", "data-flow analysis")と呼ばれているもので、実際に実装するのも"constant folding"(「定数畳み込み」)と呼ばれる一般的なコンパイラ最適化問題です。なのでJuliaに興味がない人にも読んでいただけると嬉しいです。 アルゴリズム data flow problem "a data-flow problem"(抽象解釈問題)は以下の4つの要素を用いて定義します: P
初めまして、朝日ネット開発部の hogeyama です。 今回は Haskell の中級的なトピックとして、 GHC 9.2 で導入された Quick Look 型推論アルゴリズムを取り上げようと思います。 概要 Haskell のデファクトスタンダードなコンパイラである GHC では通常の多相(ジェネリクス)の一般化である非可述的多相(impredicative polymorphism)を実装していますが、その型推論アルゴリズムは長らく「型推論が弱い」「実装が不安定でコンパイラのバージョンアップでデグレが起きる」といった問題を抱えていました。 しかし昨年10月、Quick Look という新しいアルゴリズムが GHC 9.2 に実装されたことでこの問題が解決しました。 本記事ではこの Quick Look によって何が変わるのか、利用する際に何に気をつければよいのかを非可述的多相の概要
intro# 最近、五十嵐先生のプログラミング言語の基礎概念を読んでいました。コンパクトにlet多相までの知識がまとまっており非常に読みやすかったです。 OCamlの学習がてら実際に言語を実装してみようと思い、 筑波大学の講義資料を参考にさせていただきました。 環境構築・実装にあたってはいくらか大変だった部分があるのですがこれらは気が向いたら別途記事にします。 duneの使い方 OCamlでのテストの仕方 OCamlのCI環境の構築 on GitHub Actions OCamlでのパーサーコンビネータの作り方・使い方 Menhirやocamlyaccなどは意図的に使いませんでした 今回作ったもの自体はこちらにあります。watiko/minicaml 振り返り# さて、参考書では最終的にlet多相を有した言語としてPolyTypingML4というものを扱います。文法や型についての定義は以下
これは SmartHR アドベントカレンダー 2022 の 8 日目の記事です。 またこの記事の内容は、こちらのイベントに登壇した際のスライドをもとにしています。 はじめに こんにちは、 SmartHR でフロントエンドエンジニアをしている ytaka です。 SmartHR では TypeScript を利用してフロントエンドの開発しています。 TypeScript、便利ですよね。 型によって安全に開発できますし、補完のおかげで素早くコードを書くこともできます。 そんなTypeScriptの便利な機能として、 ユーティリティ型 があります。ユーティリティ型を使うと、ある型から別の型を作れます。 たとえば、組み込みで用意されているユーティリティ型の一つに Pick があります。 Pick を使うと、オブジェクト型から任意のプロパティのみを抜き出したオブジェクト型を作成できます。 type
はじめに 注意: 2023/06/08更新 Go1.21(順調なら2023年8月にリリース予定)において、型推論アルゴリズムの枠組みが新しくなります。 この記事の多くの内容は古いものとなります。 更新予定は今のところないので、注意書きを記載しておきます。 ↑の変更のポイントだけ筆者なりにまとめておくと、関数引数型推論と制約型推論との間の順序の関係がなくなることと、順序の関係がなくなることによって型推論に使える情報の種類を増やしやすくなることがポイントです。 注意 この記事はGo1.18リリース前に書いたのですが、そのせいでGo1.18以降で動作しなくなっているサンプルコードがあります。 具体的には、Go1.18リリース時点では「パラメータ化された型」にたいする型推論が行われなくなりました。そのため、このような型推論についてのサンプルコードが動作しなくなっています。 型推論アルゴリズム自体は
Leaner 開発チームの黒曜(@kokuyouwind)です。 RubyKaigi 2023 で「RBS meets LLMs - Type inference using LLM」と題して LT させていただきました。 そのうち本編のアーカイブ映像が出るはずですが、文字でも読めるよう大まかな内容を記事にまとめておきます。 また時間に収まりきらなかった内容も少し触れておくので、本編見ていただいた方も 本編に盛り込めなかった話 の節を呼んでもらえると嬉しいです。 発表スライド 以下の slides.com のものがマスターです。 フォントが中華フォントに化けてしまっていますが、一応 SpeakerDeck に上げたものも埋め込んでおきます。[1] 発表概要 Ruby の型定義ファイルである RBS を、 ChatGPT で推測できるか試してみました。 特に変数名や関数名の単語の意味を使うこ
「コンパイラ: 原理と構造」の型推論をClojureで書いた コンパイラ: 原理と構造 という本を読んだ。最近は本の内容を3秒ほどで忘れてしまうので、 少しでも記憶を定着させるため手を動かすことにした。 大昔に決定性有限オートマトンを作ったり、 LALR構文解析器を作ったりするプログラムを(Common Lispのマクロとして) 書いたことがあるので字句解析と構文解析はすっ飛ばして、 いきなり型推論をするプログラムを書くことにした。型推論を書くのは初めてだ。 本ではSML#を使っているが、「最も稼げる言語はClojure」という噂を聞いたので Clojureで書いてみることにした。Clojureを書くのも初めてだ。 できあがったもの user> (type-inf-defs '((def fdec (fn p (tuple (- (get p 0) 1) (get p 1)))) (def
この質問への回答としては、Haskellへの型クラスへの導入を提案した原論文「How to make ad-hoc polymorphism less ad hoc」を当たるのがよいだろうと思います。ただ、英語にとりくむのはちょっとなあ、というのあれば、こちらの記事[1]「型クラスの原点 How to make ad-hoc polymorphism less ad hoc を読んだ話 - Qiita」には、要点を抜き出した解説記事があります。以降、これらに対する補足になるかもしれませんが、ポイントだけを少しかいつまんでみようと思います。なお、以下の図版に含まれているコード断片は、先述のQiita記事[1]から抜き出したものを使用しています。 その前に 質問文面は「hindly-milner型推論を持つ言語」での「アドホック多相」という聞きかたをしており「Haskellの型クラス」に限定さ
今までTSをたくさん書く機会がなかったのですが,最近はTSをたくさん書く機会に恵まれたおかげでTSの型推論に面白さを感じています. TSの型 今まではGoを書く機会が多く,たまにTSを書くと型の弱さが気になっていました. 例えば,Goで次のようなコードはコンパイルエラーとなります. package main type A int type B int func foo(a A, b B) {} func main() { var a A = 1 var b B = 2 foo(b, a) // ./prog.go:12:6: cannot use b (variable of type B) as A value in argument to foo // ./prog.go:12:9: cannot use a (variable of type A) as B value in arg
Damas-Milner 型システム Damas-Milner 型システムとは、型の注釈を必要とせずに多相型を推論する、ラムダ計算の型システムである。ブログタイトルでは、より一般的に使われる Hindley-Milner という名称を用いたが、本稿では Damas-Milner の名称を用いたい。というのも、本稿では Robin Milner と Luis Damas による "Principal type-schemes for functional programs" で示されたアルゴリズムを直接実装するからである。 続き 型推論器の実装 ② Algorithm M 型推論器の実装 ③ 副作用のあるアルゴリズム 1. 言語(The language) 項(Term) 通常多相ラムダ計算では、ラムダ抽象に型がついたり、型適用、型抽象が構文に必要となるが、Damas-Milner 型システ
Microsoftは、2024年1月30日にTypeScript 5.4 Betaの提供を発表した。この新リリースでは、変数の型推論が向上し、他にもさまざまな新機能が追加されている。 Microsoftは、2024年1月30日にTypeScript 5.4 Betaの提供を発表した。この新リリースでは、変数の型推論が向上し、他にもさまざまな新機能が追加されている。 TypeScript 5.4では、関数クロージャ内での変数の狭小化が進化し、JavaScriptコードの表現がより容易になった。これにより、開発者はよりスマートで効果的なコードを書くことができるようになる。 また、新しいユーティリティ型であるNoInferが導入され、ジェネリック関数の型引数推論をより細かく制御できるようになった。これにより、型の推論がより柔軟になり、開発プロセスがよりスムーズに進むだろう。 JavaScript
◆ Java Java自体、仕事でも時々触れることはありますが、管理やドキュメント対応のほうが多くなってきて、コードを書く機会がかなり減ってきており、特にJavaについては、最近のコードは見ていても、「???」と思う書き方も結構出てきています。 自分がまともにJavaのコードを書いていたのは…正直、Java 1.5とかそういう時代。 今のように「Java SE〜」というような表記ではなく、「J2SE (*)」のような表記でしたね。 (*) J2SE: Java 2 Platform, Standard Edition 最近はまたJavaに触れる機会も増えてきた…ということもあり、 そのため、久々にJavaの勉強でもしようかなと思いました。 ★ 型推論 (var) : Java SE 10〜? Javaといえば、当初は、型定義はしっかりとしていなければなりませんでした。 ただ、変数の初
はじめに こんにちは、CX事業本部Delivery部MADグループの森茂です。 Remix v1.6.5のリリースにuseLoaderDataとuseActionDataの型推論が追加されました。普段Remixを利用していないといったい何のこと?と思われるかもしれません。しかしRemixでアプリケーションを開発しているユーザーにとっては非常に大きなDX改善となっているので紹介させてください:) useLoaderDataとuseActionData Remixでは、APIからデータを取得するなどサーバーサイド側でデータの処理を行い、そのデータをフロント側へ渡す際useLoaderDataという関数を利用します。また、フォームのデータをやり取りするためにはuseActionDataという関数を利用します。どちらもRemixでアプリケーションをつくる際には一番利用する関数と言えるかもしれません
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く