我试图弄清楚这段代码是如何实际工作的。此功能实现了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
x
和y
的值是什么,否则返回s y
时如何处理。
我只是一个初学者,任何宝贵的意见将不胜感激。
答案 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 :: Int
和maxBound :: Int
的值以查看有多少。)
请注意,setToList
仅因为Int
是有限类型而终止。