我想定义自己的抽象类型'a ref
,就像eqtype
一样'a
,即使lolcathost% poly
Poly/ML 5.5.2 Release
> signature FOO =
# sig
# eqtype 'a foo
# val bar : real foo
# val qux : real foo
# end;
signature FOO = sig val bar : real foo type 'a foo val qux : real foo end
> structure Foo : FOO =
# struct
# datatype 'a wat = Wat of 'a
# type 'a foo = 'a wat ref
# val bar = ref (Wat 0.0)
# val qux = ref (Wat 0.0)
# end;
structure Foo : FOO
> Foo.bar = Foo.qux;
val it = false: bool
不是> !Foo.bar;
val it = Wat 0.0: real wat
> !Foo.qux;
val it = Wat 0.0: real wat
。例如:
wat
到目前为止,真好!现在:
real wat
等待。是不是应该隐藏<form method="post" action="faz-personagem.php" accept-charset="UTF-8">
<div class="row">
<label for="nome">Nome</label>
<input type="text" name="nome">
</div>
...
<button type="submit">Enviar</button>
</form>
?为什么我会看到<?php
header("Content-Type: text/html;charset=UTF-8");
$conexao = mysql_connect('localhost', 'root', 'pass');
mysql_select_db('pan-tactics');
$nome = $_POST['nome'];
$nome = utf8_encode($nome);
$sql = "INSERT INTO personagens VALUES";
$sql .= "('$nome')";
$resultado = mysql_query($sql);
echo 'Personagem criado com sucesso.';
mysql_close($conexao);
?>
类型的值?
答案 0 :(得分:2)
是不是应该隐藏
wat
?
在代码无法引用它的意义上它是“隐藏的”;但是既然你作为一个人都知道它,那么REPL就没有理由回避它。
为什么我会看到
real wat
类型的值?
为什么不呢?标识符wat
不在范围内,但类型名称仍然存在。没有理由不存在涉及它的类型的值。
(即使没有签名也可以做同样的事情;比如
local
datatype 'a wat = Wat of 'a
in
val it = Wat 0.0
end
完全有效,并且具有类似的效果。)
由于我不希望外部代码知道
'a foo
是内部'a wat ref
,这意味着!Foo.bar
和!Foo.qux
首先不应该进行类型检查。< / p>
如果您不希望外部代码知道'a foo
是内部'a wat ref
,那么您不应该使用透明归属;透明归属的全部意义在于外部代码仍然知道类型是什么,即使签名没有指定它(与不透明的归属相反,外部代码实际上只有签名中指定的内容)。
我想定义自己的抽象类型
'a foo
,即使'a ref
不是eqtype
也是'a
。
不幸的是,这是不可能的。 标准ML的定义(修订版)(大部分定义了标准ML '97)在第17页的§4.4“类型和类型函数”中列出了确切的相等类型集。只有当(1)其类型名称及其所有类型参数允许相等或(2)其类型名称由ref
表示的类型时,构造类型才允许相等。在您的情况下,由于'a
显然不是相等类型,foo
不是ref
,'a foo
不承认相等。
(注意:我应该提到 Definition 在这里有点不对,因为标准ML基础库指定了一些具有相同的其他类型名称特殊属性为ref
,编译器也实现了这些。但是这个扩展只增加了更多的硬编码;它没有为程序员添加任何创建额外类型名称的方法。)