gpt4 book ai didi

sml - 通过将内置列表类型转换为自定义堆栈类型来了解信号和结构

转载 作者:行者123 更新时间:2023-12-01 04:35:12 24 4
gpt4 key购买 nike

假设我有一个 Stack 定义的开头,如下所示:

signature STACK = sig
type 'a stack
end;

structure Stack :> STACK = struct
type 'a stack = 'a list
end;

显然这不起作用,因为我无法将列表转换为堆栈:

- [5] : int Stack.stack;
stdIn:1.2-1.23 Error: expression doesn't match constraint [tycon mismatch]
expression: int list
constraint: int Stack.stack
in expression:
5 :: nil: int Stack.stack

这意味着如果我创建了一个 Stack.push 或 Stack.pop 函数,我无法传入 int 列表,因为它需要一个堆栈。

希望我对标准 ML 有更多了解以提出一个真正的问题,但我只知道这行不通,而且我不确定如何处理签名和结构。

最佳答案

当你声明你的结构时,你是在使用不透明的签名匹配(:>)。

不透明的签名匹配意味着,在结构内部声明的任何类型背后的底层类型都是隐藏的。

如果您不希望出现这种情况,可以使用透明签名匹配 (:)。

透明签名匹配示例:

structure Stack : STACK = struct
type 'a stack = 'a list
end;

在你这样做之前,考虑不这样做的好处:如果你使用不透明的签名匹配,底层的实现是隐藏的。如果您希望更改底层实现(例如更改为树结构),您可以这样做,因为您知道结构之外的任何东西都不能使用您提供的功能之外的任何其他功能。

您可能希望提供 toListfromList 函数来执行转换:

(* in the signature *)
val toList : 'a stack -> 'a list
val fromList : 'a list -> 'a stack

(* in your structure *)
fun toList s = s
fun fromList s = s

如果您随后更改底层实现,则只需更改这两个函数,而不必对整个程序进行更改。

关于sml - 通过将内置列表类型转换为自定义堆栈类型来了解信号和结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18429149/

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