3

给定一个半群,我想定义一个“整数乘法”,将“做某事 n 次”的概念形式化:

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

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

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

编辑:要明智地将“intmultiplying”定义为零,我认为我需要一个幺半群而不是半群,所以intMul 0 s == mempty. 如果我想允许乘以负整数,我实际上需要逆元素,即一个组。哪个似乎在纯脚本中没有类型类,对吗?

4

1 回答 1

2

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

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

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)
于 2016-05-09T16:06:07.780 回答