我正在尝试从我的作业中做这个问题:
给定任意
foo :: [[a]] -> ([a], [a])
,写下函数foo
满足的一个定律,涉及map
列表和对。
一些背景:我是一年级本科生,正在学习函数式编程课程。虽然这门课程是介绍性的,但讲师在教学大纲中提到了许多内容,其中包括自由定理。因此,在尝试阅读 Wadler 的论文后,我认为concat :: [[a]] -> [a]
法律map f . concat = concat . map (map f)
看起来与我的问题相关,因为我们必须具有foo xss = (concat xss, concat' xss)
whereconcat
和concat'
are 类型的任何函数[[a]] -> [a]
。然后foo
满足bimap (map f, map g) . foo = \xss -> ((fst . foo . map (map f)) xss, (snd . foo . map (map g)) xss)
。
这个“法律”似乎太长了,不正确,我也不确定我的逻辑。所以我想到了使用在线免费定理生成器,但我不明白是什么lift{(,)}
意思:
forall t1,t2 in TYPES, g :: t1 -> t2.
forall x :: [[t1]].
(f x, f (map (map g) x)) in lift{(,)}(map g,map g)
lift{(,)}(map g,map g)
= {((x1, x2), (y1, y2)) | (map g x1 = y1) && (map g x2 = y2)}
我应该如何理解这个输出?我应该如何foo
正确推导出函数的定律?