PureScript中()的定义是什么?与Unit类型有何区别?
PureScript中
()的定义与REPL查询问题解决 问题说明
在PureScript的类型签名里看到(),原本以为它和Haskell的单元类型等价,但发现PureScript使用Unit作为单元类型,因此疑惑()的具体定义。同时在spago repl中查询()的类型、信息时出现报错,报错内容如下:
> :t () Unexpected token ')' at line 1, column 2 > :i () Unrecognized directive. Type :? for help. > :k () Error found: at :1:2 - 1:3 (line 1, column 2 - line 1, column 3) Type variable k is undefined. while inferring the kind of k while checking that type k has kind Type while inferring the kind of () @k
解决方法
1. ()的本质定义
在PureScript中,()是**Unit类型唯一构造器的语法糖**,对应的类型是Unit(定义在Prelude核心模块中):
- 类型本身:
Unit(一个仅包含唯一值的数据类型) - 该类型的唯一值:可以写成构造器原名
Unit,也可以用语法糖()替代
和Haskell的核心区别是:Haskell里()同时作为类型和该类型的唯一值;而PureScript将类型与值明确分开,类型名为Unit,值的构造器为Unit,()只是这个构造器的简写形式。
2. REPL查询报错的修正
你在spago repl中的查询方式不符合解析规则,正确操作如下:
- 查询
()的值类型:
由于REPL无法直接解析单独的()作为查询对象,可先将其赋值给变量再查询:
或者直接查询构造器原名的类型:> x = () > :t x Unit> :t Unit Unit - 查询
Unit类型的定义:> :i Unit data Unit = Unit import Prelude - 查询
Unit类型的种类:> :k Unit Type
内容的提问来源于stack exchange,提问作者Chris Stryczynski
相关产品推荐
相关产品推荐

