<?php if(isset($_POST['submit'])){
$username = $_POST['username'];
$password = $_POST['password'];
if(!preg_match("/^[0-9a-zA-Z_]{4,}$/", $username) || empty($username)) {$uErr = "style='border: 2px solid red";}
elseif(!preg_match("/^.*(?=.{8,})$/", $password) || empty($password)) {$pErr = "style='border: 2px solid red";} else {
echo "Executed";}} ?>
<form action="" method="post">
<div class="form-group">
<label>Username:</label>
<input <?php if(isset($uErr)){echo $uErr;} ?> name="username" type="text" class="form-control">
</div>
<div class="form-group">
<label>Password:</label>
<input <?php if(isset($pErr)){echo $pErr;} ?> name="password" type="password" class="form-control">
<button name="submit" type="submit">Submit</button>
</div>
</form>
为什么编译器会抱怨?
不允许使用此表单,因为内联记录的类型可以 逸出。
答案 0 :(得分:2)
你很可能想写一些
的变体let enqueue d q = match q with
| Empty -> Q {estack = d; dstack = []}
| Q r -> Q {r with estack = r.estack @ d}
编译器错误
This form is not allowed as the type of the inlined record could escape
源于内联记录不完全是OCaml中的第一类对象。特别是,它们不能在构造函数的上下文之外使用。因此,当类型检查Q { q with … }
时,类型检查器试图将变量q
的类型与Q
- 内联记录的类型统一起来并引发错误,因为这样的统一会泄漏内联变量Q
的{{1}}内联记录。
编辑:
由于您编辑的版本存在完全相同的问题,因此这里是 更正后的版本
q
和以前一样,问题是let enqueue d q = match q with
| Empty -> Q {estack = [d]; dstack = []}
| Q r -> Q {r with estack = d :: r.estack};;
Q { q with … }
的类型为q
,而构造函数'a enqueue
期望参数为Q
类型的变量;在OCaml表面语言中没有明确的名称。因此,需要首先通过'a enqueue.Q.inlined_record
上的模式匹配提取内部记录,然后使用Q r
更新此记录。