我最近在标准ML中玩幺半群。签名很容易写:
signature MONOID =
sig
type monoid
val neutral : monoid
val combine : monoid -> monoid -> monoid
end
简单的幺半群也是如此,例如整数加法monoid:
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
我的问题是,是否存在声明通用列表monoid的替代方法,理想情况下是一个不需要functor
声明的列表。在尝试声明列表monoid时,显然没有必要知道列表的包含类型。
答案 0 :(得分: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