我正在将一些Haskell代码从使用列表更改为集合.我认为,我理解所需的一切,但我不确定如何在套装上进行模式匹配.列表有这个很好的文字语法,似乎很难用Set构造函数模拟.例如,我可能有一些像这样的代码:
foo [] = []
foo x = other_thing
Run Code Online (Sandbox Code Playgroud)
如何编写此代码,以便使用集而不是列表?
我一直在经历Haskell幺半群及其用途,这让我对幺半群的基本知识有了很好的理解.博客文章中介绍的一件事是Any monoid,它的用法如下:
foldMap (Any . (== 1)) tree
foldMap (All . (> 1)) [1,2,3]
Run Code Online (Sandbox Code Playgroud)
在类似的情况下,我一直在尝试构建一个最大的幺半群,并提出以下内容:
newtype Maximum a = Maximum { getMaximum :: Maybe a }
deriving (Eq, Ord, Read, Show)
instance Ord a => Monoid (Maximum a) where
mempty = Maximum Nothing
m@(Maximum (Just x)) `mappend` Maximum Nothing = m
Maximum Nothing `mappend` y = y
m@(Maximum (Just x)) `mappend` n@(Maximum (Just y))
| x > y = m
| otherwise = n
Run Code Online (Sandbox Code Playgroud)
我可以为特定类型构造一个最大幺半群 - 例如Num,非常容易,但希望它对任何东西都有用(明显要求任何东西都是Ord的一个实例).
此时我的代码编译,但就是这样.如果我尝试运行它,我得到这个: …
我想用foldr或foldMap实现最小值。根据练习,它应具有以下定义:
mini :: (Foldable t, Ord a) => t a -> Maybe a -- named "mini" to avoid name clash
Run Code Online (Sandbox Code Playgroud)
听起来很简单,但是我不知道可以在下面的X中添加什么才能使其起作用。请帮忙?
mini xs = Just (foldr min X xs)
Run Code Online (Sandbox Code Playgroud)
而且,您也可以通过foldMap向我展示如何获得奖励积分,但这似乎更加困难。