[英]Haskell Concat-Typeclass
我想知道Haskell中是否存在已定义的类型类,它声明了连接。
对于列表,有++
和concat
。 但当然还有其他类型可以使用。
例:
type Valuater = A -> [Int]
concatValuater :: [Valuater] -> Valuater
concatValuater vs = \a -> concat [v a | v <- vs]
不存在concat
的类型类吗?
很可能你想看看Monoid
class Monoid a where
mempty :: a
mappend :: a -> a -> a
mconcat :: [a] -> a
正如@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)
然后,您可以使用Valuaters
上的所有Monoid
相关功能。
事实上,你可以使这更一般:
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]
现在你可以很容易地让Valuater'
在不同的Valuater'
工作,但我不知道这对于解决你的具体问题是否特别有用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.