我需要一个可以选择非空半边形的函数。对于列表,这意味着以下行为:> [1] `mor` [][1]> [1] `mor` [2][1]> [] `mor` [2][2]现在,我实际上已经实现了它,但是我想知道是否存在一些标准替代方案,因为这似乎是一种常见情况。不幸的是,Hoogle无法提供帮助。这是我的实现:mor :: (Eq a, Monoid a) => a -> a -> amor a b = if a /= mempty then a else b 最佳答案 [这是一个很长的评论,而不是一个答案]在我的评论中,当我说“单调的事物没有内省Introspection 的概念”时,我的意思是您不能对类半体执行分析(模式匹配,等式,等)。这显然是显而易见的-Monoids的API仅是单元(无用)和一个 mappend 操作(更抽象地),它需要两个单项对象并返回一个。对于类型的 mappend 的定义可以免费进行用例分析,但是之后,对Monoidal所做的一切就是使用Monoid API。在Haskell社区中,避免发明某些东西是一种民间传说,而宁愿使用数学和计算机科学(包括函数式编程历史)中的对象。结合Eq(需要对参数进行分析)和Monoid引入了一类新事物-支持足够自省以允许相等的Monoid;在这一点上,有一个合理的论据认为,Eq-Monoid事物违背其Monoid super class 的精神(Monoids是不透明的)。因为这既是一类新的对象,又可能引起争议-因此将不存在标准实现。关于haskell - 选择非空的Monoid,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13615469/
10-11 17:45