假设我有一个包含类型的模块:
module My where
data L a = Nil | Cons a (L a)
该模块导出 My
的具体定义以允许模式匹配等。
是否有可能另一个模块,比如 Client
以 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
语句的其他一些方式,请查看 the HaskellWiki article on import
(虽然文章没有提到导入数据类型及其构造函数)。
关于haskell - 我可以抽象地导入非抽象类型吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6474375/