定义一个整数乘法'对于半群

时间:2016-05-09 11:58:10

标签: purescript

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

对于任何intMul n s == s <> s <> ... <> s sInt n

Semigroup n右侧s出现intMul 0 s == mempty

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

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

编辑:明智地定义&#39; intmultiplying&#39;零,我认为我需要一个幺半群而不是一个半群,所以footer { height: 100px; width: 100%; background: rgba(255,255,255,0.2); position: absolute; bottom: 0; } 。如果我想允许乘以负Ints,我实际上需要逆元素,即一个组。 purescript中似乎没有类型类,对吧?

1 个答案:

答案 0 :(得分:2)

在Haskell中,您可以使用默认实现将其添加为Semigroup类的成员。这样,如果您有一个可用的版本,就可以实现更快的版本,例如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)