#purescript
#purescript
Вопрос:
Я новичок в программировании на уровне FP и типов. Я узнал Void
и Unit
недавно.
Prelude 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:
На самом деле не имеет значения, для какой ценности вы используете Unit
. {}
это довольно произвольный выбор — undefined
или null
, или просто не возвращать значение тоже хорошо, если вы пишете что-то в FFI. Поскольку Unit
предполагается, что у него должен быть только один обитатель, никогда не бывает времени, когда для него проверяется фактическое значение времени выполнения.
Прошло довольно много времени с тех {}
пор, как был сделан выбор — вероятно, это историческая случайность, оставшаяся с того времени, когда все Prim
значения, отличные от PS, были сконструированы как анонимные объекты.
Комментарии:
1. Я бы также добавил , что
function hello() { return "hello" }
это НЕ эквивалентноVoid -> String
, а эквивалентноUnit -> String
. И точно так же нет такого понятия, какEffect Void
.