haskell - 我可以抽象地导入非抽象类型吗?

标签 haskell module abstract-data-type

假设我有一个包含类型的模块:

module My where

data L a = Nil | Cons a (L a)

该模块导出 My 的具体定义以允许模式匹配等。 是否有可能另一个模块,比如 ClientL 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/

相关文章:

java - 如何在另一个应用程序模块中使用项目源代码

Ruby:如果找不到类方法,则在模块中引发错误

c - 如何在c中迭代列表

haskell - 如何从本地 Cabal 可执行项目引用本地 Cabal 库?

Haskell - 找不到包

C# 静态类与 VB.NET 模块使用

java - 所有数据结构都有抽象数据类型吗?

在 C 中创建 Set ADT 时无法删除重复值

haskell - Haskell 中 Pointfree 风格的元素数量

haskell - 我如何在 dhall 中表示一个元组?