【发布时间】:2021-12-25 17:35:17
【问题描述】:
我的任务是我想创建一个函数来查找给定列表和谓词的任何可能的“绑定”,但我找不到正确的解决方案。
二元谓词p 的ls 的绑定是bs :: [ (a,a) ] 对的列表,满足以下条件
-
ls中的每个元素在map fst bs中仅出现一次,在map snd bs中仅出现一次 - 如果
(x,y)出现在bs中,那么x和y都必须出现在ls中。 - 如果
(x,y)出现在bs中,那么(y,x)也会出现在bs中。 - 如果
bs中出现一对(x,y),则x不等于y。 - 如果
(x,y)出现在bs中,那么p x y就是True。
此外,我认为对这个问题有用的函数是以下findBonding :: Eq a => (a -> a -> Bool) -> [a] -> Maybe [(a,a)],这样findBonding p ls 将p 作为谓词,将ls 作为整数列表。
例如,findBonding (\x -> \y -> odd(x+y)) [2,3,4,5,6,7] 应该返回 Just [(2,3),(3,2),(4,5),(5,4),(6,7),(7,6)]
用ls(列表)中的foldr 和p(谓词)声明findBonding 是一个好主意,作为应该声明要查找然后循环的函数的函数在每两个项目上找到正确的对并将它们作为列表返回。
【问题讨论】:
-
为什么
(2,5)或(3,4)不应该出现在您的示例中的返回列表中? -
返回
Just []和返回Nothing有什么区别?如果它们的含义相同,或者不可能,那么您的函数的返回值不应包含在Maybe中。 -
它完全可以是一对是的!这个想法是它返回一个可能的对列表。
-
例如,如果我们传递
findBonding (\x -> \y -> even(x+y)) [2,3,4,5,6,7],则函数返回Nothing,因为在这种情况下不存在绑定,因为无论前两对如何创建,您最终都会添加一个奇数和第三对的偶数加起来 -
答案已更新。看看这是否符合您现在的要求。
标签: list haskell functional-programming predicate