bouzuya.hatenablog.com

ぼうずやのにっき

Simple.JSON における Maybe と Nullable の違いを確認した / 『秋期限定栗きんとん事件(上)』を読んだ

bouzuya/purescript-openapi-specification 。どういう動きの何をつくるのかあまり考えてないけど、とりあえずリポジトリをつくった。

今日の学び。 justinwoo/purescript-simple-jsonMaybeNullable の違い。 README にある注意書きそのままなのだけど、実際に自分でためして確認した。

module Test.Main
  ( main
  ) where

import Data.Either (Either(..), isLeft)
import Data.Maybe (Maybe(..))
import Data.Nullable (Nullable, toNullable)
import Effect (Effect)
import Foreign (MultipleErrors)
import Prelude (Unit, discard)
import Simple.JSON (readJSON, writeJSON)
import Test.Unit (suite, test)
import Test.Unit.Assert as Assert
import Test.Unit.Main (runTest)

type MaybeJson = { a :: Maybe String }
type NullableJson = { a :: Nullable String }

main :: Effect Unit
main = runTest do
  suite "Simple.JSON" do
    test "readJSON (Maybe a)" do
      let f s = readJSON s :: Either MultipleErrors MaybeJson
      Assert.equal (Right { a: Just "b" }) (f """{"a":"b"}""")
      Assert.equal (Right { a: Nothing }) (f """{"a":null}""")
      Assert.equal (Right { a: Nothing }) (f """{}""")
    test "readJSON (Nullable a)" do
      let f s = readJSON s :: Either MultipleErrors NullableJson
      Assert.equal (Right { a: toNullable (Just "b") }) (f """{"a":"b"}""")
      Assert.equal (Right { a: toNullable Nothing }) (f """{"a":null}""")
      Assert.equal true (isLeft (f """{}"""))
    test "writeJSON (Maybe a)" do
      Assert.equal """{"a":"b"}""" (writeJSON ({ a: Just "b" } :: MaybeJson))
      Assert.equal """{}""" (writeJSON ({ a: Nothing } :: MaybeJson))
    test "writeJSON (Nullable a)" do
      Assert.equal """{"a":"b"}""" (writeJSON ({ a: toNullable (Just "b") } :: NullableJson))
      Assert.equal """{"a":null}""" (writeJSON ({ a: toNullable Nothing } :: NullableJson))

Nullable String だと、 Nullable の名前どおり TypeScript で言うと a: string | null っぽく動く。読み込みに undefined (キーが存在しない状態) を許容せず Left にするし、書き込みは "a": null になる。

注意すべきは Maybe

Maybe String だと、 TypeScript で言うと a?: string | null っぽく動く。書き込み時に Nothing だと JSONa はキーが存在しない状態になる。読み込み時は JSON のキーが存在しない状態か null だと Nothing になる。ぼくの感覚では読み込み時の null の許容はおまけで、基本的には Maybe Stringa?: string だと思って良さそう。

まとめ。

  • Simple.JSON での k :: Nullable a → TypeScript の k: a | null のイメージ
  • Simple.JSON での k :: Maybe a → TypeScript の k?: a のイメージ ("k": nullNothing として解釈してくれるおまけつき)

bouzuya/shiba を 0.3.0 に。期間の判定を変えてみた。様子見。


秋期限定栗きんとん事件(上)』を読んだ。夏期限定よりもじっくり来る感じ。ふたりの関係もあって、間に噛む人数が増えているので、ね。いや、ひょっとすると上下巻の尺なだけかもしれないけど……。続きが気になる。


ベビーカーでおでかけ。動きが止まると泣き出す。難しいやつだ。