PureScript中如何为Customer类型创建合法Show实例?类型类实例错误含义解析
问题2:报错信息的具体含义
这条报错是PureScript类型系统的规则限制导致的,拆解来看:
- "Type class instance head is invalid due to use of type ( name :: String )":你试图给
{ name :: String }这个行类型定义Show实例,但这个类型不符合类型类实例的要求格式。 - "All types appearing in instance declarations must be of the form T a_1 .. a_n...":PureScript要求类型类实例中的类型必须是类型构造子应用的形式——也就是一个命名的类型构造子(比如
Maybe、List,或者你自己定义的Customer)加上若干类型参数(比如Maybe Int里的Int)。而行类型{ name :: String }是匿名的特殊语法,不属于这种构造子应用的结构。 - "unless the type is fully determined by other type class arguments via functional dependencies":例外情况是,如果类型类定义了函数依赖,使得这个行类型能通过其他类型参数唯一确定,但
Show类并没有定义这样的依赖,所以这条例外不适用。
总结来说:PureScript不支持直接给匿名的行类型写类型类实例,必须把它包装成一个命名的代数数据类型(newtype或data)才能定义实例。
内容的提问来源于stack exchange,提问作者Code Whisperer
相关产品推荐
相关产品推荐

