为半群定义 'integer-multiplication'

Defining an 'integer-multiplication' for semigroups

给定一个半群,我想定义一个 'integer-multiplication' 形式化 'doing something n times' 的概念:

intMul n s == s <> s <> ... <> s 右侧出现 n 次 s,对于任何 Int nSemigroup s

这似乎是一个相当通用的概念,所以我想已经有一个 algebraic/group 的理论结构。如果存在,这个结构的名称是什么,它是由标准的纯脚本库之一提供的吗?

如果我需要自己写这个:每个半群的实现都是相同的。这是否意味着类型类不是表示它的正确选择?

编辑:要合理地用零定义 'intmultiplying',我想我需要一个幺半群而不是半群,这样 intMul 0 s == mempty。如果我想允许乘以负整数,我实际上需要逆元素,即一个组。哪个纯脚本好像没有typeclass吧?

在 Haskell 中,您可以使用默认实现将其添加为 Semigroup class 的成员。那样的话,如果你有一个可用的版本,你可以实现一个更快的版本,例如 Sum Int 半群。

在 PureScript 中,我们还不支持默认实现,但我们可以通过在导出函数中提供默认实现来模拟它。这样用户可以选择是否使用默认实现。我们在几个标准库中采用了这种方法。

class Semigroup s <= SMult s where
  smult :: Int -> s -> s

-- A better implementation might use an accumulator or a fold.
smultDefault :: forall s. (Partial, Semigroup s) => Int -> s -> s
smultDefault n s
  | n < 1 = Partial.crashWith "Cannot combine zero elements of an arbitrary Semigroup"
  | n == 1 = s
  | otherwise = s <> smultDefault (n - 1) s 

instance smultString :: SMult String where
  smult = smultDefault

instance smultInt :: SMult (Sum Int) where
  smult n (Sum m) = Sum (n * m)