如何解决我可以抽象地导入非抽象类型吗?
| 假设我有一个包含类型的模块:module My where
data L a = Nil | Cons a (L a)
模块输出My
的具体定义以允许模式匹配等。
例如another2 another的另一个模块是否可以以L a
的方式导入My
是抽象的,即类型检查器禁止在L a
值上进行模式匹配?
解决方法
是;您只需要使用导入列表:
module Client where
import My (L)
ok :: L Int
ok = undefined
bad :: L Int
bad = Cons 3 Nil
bad2 :: L Int -> Int
bad2 (Cons i _) = i
bad2 Nil = 0
如果尝试对此进行编译,则会出现以下四个错误:
Client.hs:8:10: Not in scope: data constructor `Cons\'
Client.hs:8:17: Not in scope: data constructor `Nil\'
Client.hs:11:10: Not in scope: data constructor `Cons\'
Client.hs:12:9: Not in scope: data constructor `Nil\'
如果确实要导入构造函数,则应指定L(..)
或L(Cons)
导入Cons
,而不导入Nil
。
对于其他一些可以使用import
语句的方式,请查看import
上的HaskellWiki文章(尽管该文章未提及导入数据类型及其构造函数)。
, 是的,你可以
import My(L())
导入类型而不导入任何其构造函数。如果您仍然希望构造这种类型的值(而不是模式匹配),则必须导入用于执行该构造的函数(例如,通过从ѭ1导出此类函数或通过创建具有此类函数的实用程序模块)。
编辑:由于您明确提到要使用类型检查错误,因此我应该指出完整性,这不会导致ѭ11和10上的模式匹配是类型检查错误,而仅仅是范围错误。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。