不允许使用表单,因为内联记录的类型可能会逃脱

时间:2017-03-19 22:35:36

标签: compiler-errors ocaml record

<?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>

为什么编译器会抱怨?

  

不允许使用此表单,因为内联记录的类型可以   逸出。

1 个答案:

答案 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更新此记录。