點燈坊

失くすものさえない今が強くなるチャンスよ

Sanctuary 提供不做型別檢查 Function

Sam Xiao's Avatar 2021-06-21

型別檢查是 Sanctuary 的一大特色,但有些時候型別檢查反而會造成使用上不便,可視需求暫時不使用型別檢查。

Version

Sanctuary 3.1.0

zip

mport { zip } from 'sanctuary'

let data1 = 'dog'
let data2 = 'rabbit'

let f = zip

f (data1) (data2) // ?

zip 在 Ramda 與 Haskell 都可用於 String,但由於 Sanctuary 的 zip 的 type signature 限定在 Array a,因此無法用在 String。

type000

create

import { create, env } from 'sanctuary'

let { zip } = create ({ checkTypes: false, env })

let data1 = 'dog'
let data2 = 'rabbit'

let f = zip

f (data1) (data2) // ?

Sanctuary 提供以 create 根據 checkTypes 動態產生 function 方式:

  • false:回傳無型別檢查版本的 function
  • true:回傳有型別檢查版本的 function,如同直接從 sanctuary import 一樣

type001

unchecked

import S from 'sanctuary'
let { unchecked: { zip }} = S

let data1 = 'dog'
let data2 = 'rabbit'

let f = zip

f (data1) (data2) // ?

Sanctuary 另外提供了 unchecked module,專門提供不做型別檢查的 function。

type002

import S from 'sanctuary'

let { pipe, unchecked: { zip }} = S

let data1 = 'dog'
let data2 = 'rabbit'

let f = pipe ([
  zip
])

f (data1) (data2) // ?

第 1 行

import S from 'sanctuary'

let { pipe, unchecked: { zip }} = S

若要同時使用 checked function 與 unchecked function,可先使用 S default import,再從 S destructure 出 function。

type003

Conclusion

  • Sanctuary 實務上建議優先使用有型別檢查 function,若有些檢查過於嚴格導致使用不便,才建議使用 createunchecked module 產生無型別檢查 function