gpt4 book ai didi

functional-programming - SML 使用带有签名的 abstype

转载 作者:行者123 更新时间:2023-12-05 00:15:38 28 4
gpt4 key购买 nike

我正在编写一个库来处理标准 ML 中的简单图像。它应该支持用作每个像素颜色的不同类型,例如bool、Word8.word 等

我有一个 abstype 'a image所有通用函数都独立于表示定义('a 是颜色表示),但输出格式不同,所以我想要不同的结构。

有没有办法“打开” abstype在结构内部?我只能以一种非常丑陋的方式让它工作:

abstype 'clr absimage = Image of {width : int, height : int, data : 'clr array array}
with
fun createFunc (w, h) f = Image {width = w, height = h, data = ...}
fun createBlank (w, h) clr = createFunc (w, h) (fn _ => clr)
...
end
signature IMAGE = sig
type colour
type image
val createFunc : (int * int) -> (int * int -> colour) -> image
val createBlank : (int * int) -> colour -> image
...
val toBinPPM : image -> string -> unit
end
functor ImageFn(C : sig type colour end) = struct
open C
type image = colour absimage
val createFunc = createFunc
val createBlank = createBlank
...
end
structure Image8 :> IMAGE = struct
structure T = ImageFn(struct type colour = Word8.word end)
open T

fun toBinPPM img filename = ...
end

特别是仿函数的定义需要写成 val name = name这样的语句。对于 with ... end 中定义的所有函数 abstype 的一部分.

还是我的方法完全错误?
abstype 这个组合和 signature是我尝试使用 abstype 中的常用方法重新创建 OOP 的抽象类并要求使用 signature 在所有结构中实现其他方法

附言为什么 SML 不允许 open (ImageFn(struct ... end)) 之类的语句并强制使用临时结构(以上代码中的 T)?

最佳答案

没有理由使用abstype在今天的 SML 中。认为它已弃用。这是模块前时代的遗留物。您可以通过结构、签名和密封(:> 运算符)实现隐藏类型的构造函数的相同效果,但采用更灵活和一致的方式。这也解释了为什么它不能很好地与模块集成——它早于它们并且基本上被它们所取代。

在您的具体示例中,而不是使用 abstype , 只需定义 image作为 datatype直接在 ImageFn 的正文中仿函数,并使用签名注释隐藏其构造函数,如下所示:

signature IMAGE =
sig
type colour
type image
val createFunc : int * int -> (int * int -> colour) -> image
val createBlank : int * int -> colour -> image
...
end

signature IMAGE8 =
sig
include IMAGE
val toBinPPM : image -> string -> unit
end

functor ImageFn(type colour) :> IMAGE =
struct
datatype image = Image of {width : int, height : int, data : colour array array}
fun createFunc (w, h) f = Image {width = w, height = h, data = ...}
fun createBlank (w, h) clr = createFunc (w, h) (fn _ => clr)
...
end

structure Image8 :> IMAGE8 =
struct
structure T = ImageFn(type colour = Word8.word)
open T
fun toBinPPM img filename = ...
end

编辑:事实上,在这种情况下甚至没有必要定义 image作为数据类型。普通类型也可以,并且使代码稍微简单一些:
type image = {width : int, height : int, data : colour array array}

至于你的PS问题:是的,我也不知道。没有特别的原因。一些 SML 方言将其作为扩展来实现。

关于functional-programming - SML 使用带有签名的 abstype,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44085034/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com