F. *_*ler 3 haskell concat typeclass
我想知道Haskell中是否存在已定义的类型类,它声明了连接.
对于列表,有++和concat.但当然还有其他类型可以使用.
例:
type Valuater = A -> [Int]
concatValuater :: [Valuater] -> Valuater
concatValuater vs = \a -> concat [v a | v <- vs]
Run Code Online (Sandbox Code Playgroud)
是不是有类型类concat?
很可能你想看看 Monoid
class Monoid a where
mempty :: a
mappend :: a -> a -> a
mconcat :: [a] -> a
Run Code Online (Sandbox Code Playgroud)
正如@JAbrahamson所说,Monoid正是你正在寻找的类型.对于您的情况,您可以像这样实现它:
newtype Valuater = Valuater {
evalValuater :: A -> [Int]
}
instance Monoid Valuater where
mempty = Valuater (const [])
mappend (Valuater f) (Valuater g) = Valuater (\a -> f a ++ g a)
mconcat vs = Valuater (\a -> concatMap (`evalValuater` a) vs)
Run Code Online (Sandbox Code Playgroud)
然后你可以使用所有Monoid相关的功能Valuaters.
事实上,你可以使这更一般:
newtype Valuater' m = Valuater {
evalValuater :: A -> m
}
instance Monoid m => Monoid (Valuater' m) where
mempty = Valuater (const mempty)
mappend (Valuater f) (Valuater g) = Valuater (\a -> f a <> g a)
mconcat vs = Valuater (\a -> mconcat $ map (`evalValuater` a) vs)
type Valuater = Valuater' [Int]
Run Code Online (Sandbox Code Playgroud)
现在你可以Valuater'非常轻松地完成不同幺半群的工作,但我不知道这对于解决你的具体问题是否特别有用.