Coq:设置默认隐式参数

时间:2017-07-12 07:31:26

标签: implicit coq

假设我有一个包含大量模块和部分的代码。在其中一些中有多态定义。

<div ng-app="myApp" ng-controller="myCtrl">
  <select ng-model="myDropDown" ng-change="Dialog()">
    <option>a</option>
    <option>b</option>
  </select>
</div>

<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.4/angular.min.js"></script>
<script>
var app = angular.module('myApp', []);
app.controller('myCtrl', function($scope) {
    $scope.Dialog = function () {
        var dialog = confirm('Continue?');
        if(!dialog) {
    	    alert("Option must not change");
            /** The problem is the dropdown still select the option. **/
        }
    }
});
</script>

通常Coq可以推断出类型,但我常常会输入错误。在这种情况下,您必须使用@显式指定隐式类型,这会破坏可读性。

  

无法推断出类型为“Type”的_的隐式参数_。

有没有办法避免这种情况?是否可以指定默认参数之类的东西,每次Coq无法猜出类型时都会替换它?

1 个答案:

答案 0 :(得分:1)

您可以使用类型类来实现默认值的概念:

Class Default (A : Type) (a : A) :=
  withDefault { value : A }.

Arguments withDefault {_} {_}.
Arguments value {_} {_}.

Instance default (A : Type) (a : A) : Default A a :=
  withDefault a.

Definition myNat `{dft : Default nat 3} : nat :=
  value dft.

Eval cbv in myNat.
(* = 3 : nat *)
Eval cbv in (@myNat (withDefault 5)).
(* = 5 : nat *)