17

最近、関数型プログラミング (Haskell と Scala) について知りました。その機能と優雅さは非常に魅力的です。

しかし、モノイドという代数構造を利用したモナドに出会い、数学で学んだ理論的知識がプログラミングに生かされていることに驚き、嬉しく思いました。

この観察により、私の心に疑問が生じました。グループ、フィールド、またはリング (その他については代数構造を参照) をプログラミングで使用して、より抽象化し、コードを再利用し、数学に似たプログラミングを実現できますか?

私が知っているように、Fortressという名前の言語(コンパイラが完成したら、どの言語よりも間違いなく好むでしょう) は、ライブラリ コードでこれらの構造を定義します。しかし、これまで見てきた使用法は、すでに慣れ親しんでいる数値型に対するものだけでした。それらの他の用途はありますか?

敬具、ciun

4

3 に答える 3

10

多くの構造をモデル化できます。ここにグループがあります:

class Group a where
    mult :: a -> a -> a
    identity :: a
    inverse :: a -> a

instance Group Integer where
    mult = (+)
    identity = 0
    inverse = negate

-- S_3 (group of all bijections of a 3-element set)
data S3 = ABC | ACB | BAC | BCA | CAB | CBA
instance Group S3 where
    mult ABC x = x
    ... -- some boring code
    identity = ABC
    inverse ABC = ABC
    ... -- remaining cases

-- Operations on groups. Dual:
data Dual a = Dual { getDual :: a }
instance Group a => Group (Dual a) where
    mult (Dual x) (Dual y) = Dual (mult y x)
    identity = Dual identity
    inverse (Dual x) = Dual (inverse x)

-- Product:
instance (Group a, Group b) => Group (a,b) where
    mult (x,y) (z,t) = (x `mult` z, y `mult` t)
    identity = (identity, identity)
    inverse (x,y) = (inverse x, inverse y)

これで、結果を書き込んmult (Dual CAB, 5) (Dual CBA, 1)で取得できます。これは、グループ S 3 * ⨯ Z での計算になります。他のグループを追加し、可能な方法でそれらを組み合わせて、それらを使用して計算を行うことができます。

リング、フィールド、順序付け、ベクトル空間、カテゴリなどでも同様のことができます。Haskell の数値階層は残念ながらうまくモデル化されていませんが、それ を修正しようとする数値プレリュードがあります。また、極端なDoConもあります。型クラスのツアー (主に圏論に動機付けられています) について は、例とアプリケーションの多数のリストがあるTypeclassopediaがあります。

于 2010-07-26T12:30:53.957 に答える
4

Haskell のArrowsはモナドの一般化であり、おそらく関連性があります。

于 2010-07-25T22:46:52.747 に答える
3

Edward Kmett の非常に読みやすいブログと、関連するカテゴリ エクストラパッケージをお勧めします。何年も忙しくしておく必要があります。

于 2011-11-01T22:06:44.667 に答える