【发布时间】:2016-03-25 20:46:36
【问题描述】:
我已经定义了一个带有构造函数的 haskell 数据类型和它的类型同义词。我无法使用它的数据构造函数。
类型定义:
module BinaryTreeModule(BinaryTree,..) where
data BinaryTree a = Empty | Node (BinaryTree a) a (BinaryTree a)
键入同义词:
import BinaryTreeModule(BinaryTree)
type BST = BinaryTree
用法:
insert :: a -> BST a -> BST a
insert _ Empty = ...
insert _ Node .. = ...
我收到一条错误消息,提示找不到 Empty 和 Node 构造函数。
我还在不同的文件中定义了它们。如果 BST 只是 BinaryTree 的同义词,它们的构造函数不应该相同吗?
还有更好的方法将 BinaryTree 类型“继承”到不同的类型吗?类型类在这里是正确的解决方案吗?
编辑:添加了我在文件之间导入的方式
【问题讨论】:
-
您是否在 BinaryTree 模块中同时公开了
Empty和Node构造函数? -
最重要的是,您是否也在导入它们
import MyModule(BinaryTree)与import MyModule(BinaryTree(..))- 另请注意import MyModule(BST)与第一个相同! -
好的,我正在像
import MyModule(BinaryTree)一样导入。如何导入数据构造函数,即 BinaryTree(..) -
感谢您的帮助!
-
类型同义词在 Haskell 中的实用性相当有限。在
lens和pipes中存在一些特殊情况,并且可能在其他地方它们很有价值,但在典型情况下,您可能不应该使用它们。 GHC 的类型族通常更有用,但它们是更高级的功能。