令人惊讶的透明签名归属行为

时间:2015-08-16 17:06:08

标签: module sml signature

我想定义自己的抽象类型'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); ?> 类型的值?

1 个答案:

答案 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,编译器也实现了这些。但是这个扩展只增加了更多的硬编码;它没有为程序员添加任何创建额外类型名称的方法。)