parseとvalidate
あらすじ
巷にはValibotとかZodといった便利なライブラリがある
Scalaにはそういうの無いんだよな〜
と思ってたけどcats-parseみたいなパーサコンビネータはあるじゃんね
一般にValibotの類は「バリデーションしてくれるライブラリ」として認識されているけれど、
そういえばParse, don't validateというのが前流行った
これ読んだときにまあまあ違和感があった
パースもバリデーションもしてるじゃん、と思ったため
パースとバリデーションとの用語法が、界隈によってブレている?
よく考えたら、だいたいこういう感じだよなと思った
元々の生データ(文字列とか)を構文論的に解釈して構造を作る処理: parse
JSONを「バリデーション」する場合とかはここは勝手にJSON.parseがやる
parse不可能な構造の例: { "name: windymelt
(構文論的に正しい)構造を意味論的に解釈して構造を作る処理: validate
validate不可能な構造の例: 1 / (1 - 1), def f = f, -42(「正の整数」という文脈の場合)
? windymelt.icon 目的の型が付くか?と言い換えてもよいのではないか (意味論的に正しい)構造に操作を加えて、アプリケーションが要求する形式に変換する処理: transform
tranformの例: String => URI
parse -> validate -> transformの順に処理が進む
この過程のどこかでも失敗しうる。失敗した場合は「失敗した」という型になることが多い
界隈によって、この3つに対してザックリと「parse」「validate」の語を充てているようだ
前掲の記事では、「コンビネータなどの合成可能な機構や型による防御機構を使わず、手で逐一データの内容を確認している」ことを指して「validate」と言っていた
Schema: Trinity of parse, validate, transform
さて、前節では「われわれが雑にパースとかバリデーションとよんでるもの」がparse / validate / transformに分類できることがわかった
巷ではだいたい(parse + validate)を「バリデーション」と呼んでいたりする。これをうまいこと表現する語彙が欲しいところ
ところで、valibotは自分のことを何だと思っているのかというと・・・
Implementation of a modular schema library in TypeScript with focus on bundle size and performance
「schema library」と名乗っている(別の箇所ではvalidationと言っていたりもする)
parse, validate, transformをあわせてapplying schemaと呼ぶのはどうか、と思った
But, everything is parse
ところで、そもそもパースもバリデーションもトランスフォームも、型レベルでは同じような形に収まる
A => Either[E, B]
トランスフォームはたいして失敗しないので実質A => Bだったりするが