Sml 如何在标准ML中表示多态列表幺半群
我最近在标准ML中玩幺半群。签名很容易写:Sml 如何在标准ML中表示多态列表幺半群,sml,ml,monoids,Sml,Ml,Monoids,我最近在标准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
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
我的问题是,是否存在声明泛型列表幺半群的替代方案,理想情况下不需要
函子
声明。当试图声明列表幺半群时,显然没有必要知道列表包含的类型。您可以在签名中参数化该类型。但是组成幺半群就变得奇怪或不可能了。Haskell使用类型类解决了这个问题,您可以使用functor在SML中模拟类型类,但是语法很重(正如您所注意到的)
描述翻译的论文是是的,我基本上是为了学习目的将一些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