为什么在JavaScript中PureScript的Prelude {}中包含Unit?

时间:2019-04-17 09:30:48

标签: purescript

我是FP和Type级别编程的初学者。 我最近学会了VoidUnit

Prelude的unit在JavaScript中定义为{}

"use strict";

exports.unit = {};

我的问题是“为什么不是null而是{}?” 也许这是一个琐碎的问题,但我想学习它的哲学。

据我了解,unit对应于JavaScript中的null。 例如,我可以在JavaScript中调用不带参数的函数。

// hello :: Void -> String
function hello () {
  return "hello"
}

const h1 = hello() // "hello"
// However, I do not have any members of `Void` in PureScript, so I cannot call like above.

如果必须指定hello函数的某些参数,则选择null而不是{}

// hello :: forall a. a -> String
function hello (a) {
  return "hello"
}

// 'hello :: Unit -> String'-like
const h1 = hello(null) // "hello"

// undefined also works, but weird to me
const h2 = hello(undefined)

// also works, but weird
const h3 = hello(42)
const h4 = hello({})
const h5 = hello([])

如果unit表示副作用,可能是undefined还是某事null

// 'log1 :: String -> Effect Void'-like
function log1 (s) {
  return s => () => console.log(s) // console.log return undefined
}
// however, function must return a value


// 'log2 :: String -> Effect Unit'-like
function log2 (s) {
  return s => () => {
    console.log(s) // side-effect
    return null
  }
}

// foreign Effect.Console.log (ECMAScript-style)
function log3 (s) {
  return s => () => {
    console.log(s)
    return {} // weird to me; it seems like 'return 42'
  }
}

我想念什么吗?

1 个答案:

答案 0 :(得分:2)

您为Unit使用什么值实际上并不重要。 {}是一个非常随意的选择-如果在FFI中编写某些内容,则undefinednull,或者不返回任何值也都可以。由于Unit仅应具有一个居民,因此永远不会检查其实际运行时值。

选择{}以来已经有很长时间了-这很可能是历史性的意外,是所有非Prim PS值都被构造为匿名对象之后遗留下来的。