2016-05-09 69 views
3

,我想定義「整數乘法」正式的「做事N次」的概念:定義「整數乘法」給定一個半羣半羣

intMul n s == s <> s <> ... <> s在正確的sñOCCURENCES對於任何IntnSemigroups

這似乎是一個合理的通用概念,所以我想這裏有一個代數/組理論結構。如果存在,這個結構的名稱是什麼,它是由一個標準的purescript庫提供的?

如果我需要自己寫這個:對於每個半羣的實現將是相同的。這是否意味着類型類不是表示這個的正確選擇?

編輯:爲了明智地定義'intmultiplying'爲零,我想我需要一個monoid而不是半羣,這樣intMul 0 s == mempty。如果我想允許乘以負數Ints,我實際上需要逆元素,即一組。這似乎沒有在purescript typeclass,對不對?

回答

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)