给定一个半群,我想定义一个整数乘法'正式化“做n次”的概念':
对于任何intMul n s == s <> s <> ... <> s
s
和Int
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中似乎没有类型类,对吧?
答案 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)