ble*_*ddd 2 haskell compare equals set data-structures
我想要做的是在Haskell中创建一个类型Set来表示一个通用(多态)集ex. {1,'x',"aasdf",Phi}
首先,我要清楚,在我的程序中,我想将Phi(空集)视为属于所有集合的东西
这是我的代码
data Set a b= Phi | Cons a (Set a b)
deriving (Show,Eq,Ord)
isMember Phi _ = True
isMember _ Phi = False
isMember x (Cons a b) = if x==a
then True
else isMember x b
Run Code Online (Sandbox Code Playgroud)
我面临几个问题:
我想要isMember类型
isMember :: Eq a => a -> Set a b -> Bool
Run Code Online (Sandbox Code Playgroud)
但根据我的代码,它是
isMember :: Eq a => Set a b -> Set (Set a b) c -> Bool
Run Code Online (Sandbox Code Playgroud)如果我有一组不同的时间==操作员不能正常工作,所以我需要一些帮助请:D
关于你的类型错误,问题看起来像我的第一个条款:
isMember Phi _ = True
Run Code Online (Sandbox Code Playgroud)
这是一个写入的奇数子句,因为Phi它是整个集合,而不是集合元素.只是删除它应该给你一个你期望的类型的功能.
注意你的Set类型永远不会使用它的第二个类型参数,所以它可以写成
data Set a = Phi | Cons a (Set a)
Run Code Online (Sandbox Code Playgroud)
......在那一点上你应该使用[a],因为它是同构的,并且已经为使用和滥用它们而编写了大量的函数.
最后,你要求能够把不同类型的东西放进去.简短的回答是Haskell并没有真正摆脱那种方式.这一切都是为了确切地知道在编译时什么类型的东西,这与你的建议并不完全兼容.实际上有一些方法可以做到这一点; 但是,我强烈建议在尝试取消债券之前,先熟悉Haskell特有的类型束缚品牌.
A)这样做几乎总是不是你真正想要的.
B)从嵌入动态类型(Dynamic)到使用非常复杂的类型(HList),有很多种方法可以做到这一点.
C)这是一个描述一些方法和问题的页面:http://www.haskell.org/haskellwiki/Heterogenous_collections
D)如果你真的要这样做,我建议HList:http://homepages.cwi.nl/~ralf/HList/
E)但是如果你开始查看文档/ HList文件并发现自己无可救药地混淆,那就回到动态解决方案(或者更好的是,重新考虑你为什么需要这个)并且一旦你对它更加满意就回到HLists哈斯克尔.
(哦,是的,该页面上描述的存在主义解决方案可能是一个糟糕的主意,因为它几乎从未对你做过任何特别有用的事情).
| 归档时间: |
|
| 查看次数: |
688 次 |
| 最近记录: |