繁体   English   中英

Haskell Concat-Typeclass

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM