Почему Unit в PureScript Prelude {} в JavaScript? - PullRequest
1 голос
/ 17 апреля 2019

Я новичок в FP и программировании на уровне типов. Я недавно выучил Void и Unit.

Прелюдия unit определяется как {} в JavaScript.

"use strict";

exports.unit = {};

У меня вопрос "Почему не null, а {}?" Может быть, это тривиальный вопрос, но я бы хотел изучить его философию.

Насколько я понимаю, unit соответствует null в JavaScript. Например, я могу вызвать функцию без аргументов в 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 Ответ

2 голосов
/ 17 апреля 2019

На самом деле не имеет значения, какое значение вы используете для Unit. {} - это довольно произвольный выбор - undefined или null, или просто не возвращать значение - это тоже хорошо, если вы пишете что-то в FFI. Поскольку Unit должен иметь только одного жителя, никогда не проверяется фактическое значение времени выполнения для него.

Прошло довольно много времени с момента выбора {} - это, вероятно, историческая случайность, оставшаяся с того времени, когда все не-1009 * значения PS были сконструированы как анонимные объекты.

...