1

最近、標準 ML でモノイドをいじっていました。署名は簡単に書けます:

signature MONOID =
sig
  type monoid
  val neutral : monoid
  val combine : monoid -> monoid -> monoid
end

また、整数加算モノイドなどの単純なモノイドも同様です。

structure IntSumMonoid : MONOID =
struct
  type monoid = int
  val neutral = 0
  fun combine a b = a + b
end

しかし、 のような高カインド型のモノイドを定義するのに行き詰まってしまいましたlist。もちろん、これはコンパイルされません。

structure ListMonoid : MONOID =
struct
  type monoid = 'a list
  val neutral = []
  fun combine a b = a @ b
end

いくつか検索した後、ファンクターに基づいて次の解決策を見つけました。

functor ListMonoid (type m) : MONOID =
struct
  type monoid = m list
  val neutral = []
  fun combine a b = a @ b
end

私の質問は、ジェネリック リスト モノイド、理想的には宣言を必要としないものを宣言するための代替手段が存在するかどうかですfunctor。リストのモノイドを宣言しようとするとき、含まれているリストの型を知る必要がないことは明らかです。

4

1 に答える 1

1

シグネチャで型をパラメータ化できます。しかし、モノイドを構成することは奇妙または不可能になります。Haskell は型クラスを使用してこれを解決します。型クラスは SML でファンクターを使用してエミュレートできますが、構文は重いです (お気づきのとおり)。

signature MONOID =
sig
  type 'a monoid
  val neutral : 'a monoid
  val combine : 'a monoid -> 'a monoid -> 'a monoid
end

structure IntSumMonoid : MONOID =
struct
  type 'a monoid = int
  val neutral = 0
  fun combine a b = a + b
end

structure ListMonoid : MONOID =
struct
  type 'a monoid = 'a list
  val neutral = []
  fun combine a b = a @ b
end

翻訳について説明している論文はhttp://www.mpi-sws.org/~dreyer/papers/mtc/main-short.pdfです。

于 2015-01-14T18:26:28.717 に答える