2016-05-09 5 views
3

のための「整数乗算」を定義する、私は「何かをn回行う」という概念を形式「整数乗算」を定義したい:右でsのn個の出現箇所で半群を考えると半群

intMul n s == s <> s <> ... <> sいずれかの場合、IntnおよびSemigroupsです。

これは合理的に一般的なコンセプトのように思われるので、私はそこに代数的/グループ理論的構造が既にあると思います。存在する場合、この構造の名前は何ですか?また、標準のpurescriptライブラリの1つによって提供されていますか?

これを自分で書く必要がある場合:この実装は各セミグループで同じです。これは、typeclassがこれを表現するための正しい選択ではないということですか?

編集:「intmultiplying」をゼロで分かりやすく定義するには、セミグループよりもむしろモノイドが必要だと思うので、intMul 0 s == memptyです。私が負のIntsを乗算できるようにしたいのであれば、実際には逆の要素、つまりグループが必要です。 purescriptでtypeclassを持っていないようですね。

答えて

2

ハスケルでは、これをデフォルト実装の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)