Haskell中~类型约束报Not in scope错误需添加什么编译pragma?
解决方案
你需要额外启用两个语言扩展即可编译成功:
GADTs:允许在数据构造器上附加类型约束,同时隐含启用类型相等约束所需的EqualityConstraints扩展UnicodeSyntax:支持识别Unicode版本的类型相等运算符∼,如果你将代码中的∼替换为ASCII版的~,则不需要启用该扩展
修改后的完整代码(保留Unicode运算符版)
{-# LANGUAGE TypeOperators #-} {-# LANGUAGE GADTs #-} {-# LANGUAGE UnicodeSyntax #-} data Expr_ a = (a ∼ Int) => LitInt_ Int | (a ∼ Bool) => LitBool_ Bool | (a ∼ Int) => Add_ (Expr_ Int) (Expr_ Int) | (a ∼ Bool) => Not_ (Expr_ Bool) | If_ (Expr_ Bool) (Expr_ a) (Expr_ a)
修改后的完整代码(ASCII运算符版,无需UnicodeSyntax)
{-# LANGUAGE TypeOperators #-} {-# LANGUAGE GADTs #-} data Expr_ a = (a ~ Int) => LitInt_ Int | (a ~ Bool) => LitBool_ Bool | (a ~ Int) => Add_ (Expr_ Int) (Expr_ Int) | (a ~ Bool) => Not_ (Expr_ Bool) | If_ (Expr_ Bool) (Expr_ a) (Expr_ a)
原理说明
GHC默认不开启GADT扩展,因此不支持在数据构造器前绑定类型约束,也默认不识别类型相等运算符~/∼。开启GADTs后即可同时满足这两个需求,Unicode运算符的识别则需要单独开启UnicodeSyntax扩展。
内容的提问来源于stack exchange,提问作者mhwombat
相关产品推荐
相关产品推荐

