Haskell Concat-Typeclass

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

J. *_*son 9

很可能你想看看 Monoid

class Monoid a where
  mempty :: a
  mappend :: a -> a -> a
  mconcat :: [a] -> a
Run Code Online (Sandbox Code Playgroud)


bhe*_*ilr 7

正如@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'非常轻松地完成不同幺半群的工作,但我不知道这对于解决你的具体问题是否特别有用.