Haskell设置数据类型/数据结构

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)

我面临几个问题:

  1. 我想要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)
  2. 如果我有一组不同的时间==操作员不能正常工作,所以我需要一些帮助请:D

Dan*_*ner 6

关于你的类型错误,问题看起来像我的第一个条款:

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特有的类型束缚品牌.


scl*_*clv 5

A)这样做几乎总是不是你真正想要的.

B)从嵌入动态类型(Dynamic)到使用非常复杂的类型(HList),有很多种方法可以做到这一点.

C)这是一个描述一些方法和问题的页面:http://www.haskell.org/haskellwiki/Heterogenous_collections

D)如果你真的要这样做,我建议HList:http://homepages.cwi.nl/~ralf/HList/

E)但是如果你开始查看文档/ HList文件并发现自己无可救药地混淆,那就回到动态解决方案(或者更好的是,重新考虑你为什么需要这个)并且一旦你对它更加满意就回到HLists哈斯克尔.

(哦,是的,该页面上描述的存在主义解决方案可能是一个糟糕的主意,因为它几乎从未对你做过任何特别有用的事情).