最近、標準 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
。リストのモノイドを宣言しようとするとき、含まれているリストの型を知る必要がないことは明らかです。