在Haskell中如何将值解析为此插入函数

时间:2019-06-15 10:53:40

标签: haskell insert set

我试图弄清楚这段代码是如何实际工作的。此功能实现了Haskell中Set的概念。

我在Haskell中有一个关于set的一般概念,它就像一个函数(类型IntSet = a-> Bool),但是我真的不明白使用它的目的,我的意思是它就像另一个简单的函数,插入背后的逻辑是,如果要将元素插入集合,则只需扩展特征函数以包括大小写即可。

在这里,我试图理解此插入函数,即如何解析值以插入函数以及如何在其中插入元素。

type IntSet = Int -> Bool 

如果我们要向其中插入值,则有一个空集,它将始终返回False,因为它不包含值Understandable!但是如何插入值并查看其实际插入。

empty :: IntSet 
empty = \ _ -> False 

insert :: Int -> IntSet -> IntSet 
insert x s = \y -> x ==y then True else s y 


input : insert 2 empty 0



result = False 

如何解析值以插入函数以及s xy的值是什么,否则返回s y时如何处理。

我只是一个初学者,任何宝贵的意见将不胜感激。

1 个答案:

答案 0 :(得分:2)

这表示一个作为函数的集合,给定Int,它告诉您它是否在et中(通过返回True)(不是)(通过返回False)。 / p>

因此,无论您提供什么参数,空集都是返回False的函数。

插入集合意味着根据旧集合/函数返回一个新集合/函数。

您的函数定义中有一个较小的错字,因为它缺少if关键字:

insert :: Int -> IntSet -> IntSet
insert x s = \y -> if x == y then True else s y

当您向集合中插入一些新值x时,如果查询了刚插入的值,则返回一个新集合将返回True,否则会将答案推迟到旧集合。例如,

let newset = insert 3 empty in newset 3

求值为True,因为

newset 3 == (insert 3 empty) 3
         == (\y -> if 3 == y then True else empty 3) 3
         == if 3 == 3 then True else empty 3
         == True

let newset = insert 3 empty in newset 4返回False是因为

newset 4 == (insert 3 empty) 4
         == (\y -> if 3 == y then True else empty 3) 4
         == if 4 == 3 then True else empty 3
         == empty 3
         == (\_ -> False) 3
         == False

这对于查询特定值很好(尽管效率很低)。但是,如果您只想查看集合中包含的所有值怎么办?从概念上讲,这很容易(因为Int是有限的,所以所有可能的集合也是有限的):只需使用集合/函数过滤所有Int值的列表:

setToList :: IntSet -> [Int]
setToList s = filter s [minBound..maxBound]

给出类似setToList (insert 3 (insert 5 empty))之类的内容,很容易(尽管很乏味)显示

  • (insert 3 (insert 5 empty)) minBound是False,
  • (insert 3 (insert 5 empty)) (minBound + 1)是False,
  • ...
  • (insert 3 (insert 5 empty)) 0是False,
  • (insert 3 (insert 5 empty)) 1是False,
  • (insert 3 (insert 5 empty)) 2是False,
  • (insert 3 (insert 5 empty)) 3是对的,
  • ,以便最终结果是列表[3, 5]。不过,这需要一段时间,因为列表[minBound..maxBound]取决于您的系统,可能包含很多元素。 (检查minBound :: IntmaxBound :: Int的值以查看有多少。)


请注意,setToList仅因为Int是有限类型而终止。