我是FP和Type级别编程的初学者。
我最近学会了Void
和Unit
。
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'
}
}
我想念什么吗?
答案 0 :(得分:2)
您为Unit
使用什么值实际上并不重要。 {}
是一个非常随意的选择-如果在FFI中编写某些内容,则undefined
或null
,或者不返回任何值也都可以。由于Unit
仅应具有一个居民,因此永远不会检查其实际运行时值。
选择{}
以来已经有很长时间了-这很可能是历史性的意外,是所有非Prim
PS值都被构造为匿名对象之后遗留下来的。